华为云用户手册

  • 相关参考 为节点打污点标记:Taints and Tolerations 稳定驱逐:Safely Drain a Node while Respecting the PodDisruptionBudget 如下三个命令可以保证维护节点时,平滑的将被维护节点上的业务迁移到其他节点上,保证业务不受影响: 表2 标记节点为可调度或不可调度 命令 功能 用法 cordon 标记节点为不可调度 kubectl cordon {{node-name }} uncordon 标记节点为可调度 kubectl uncordon {{node-name }} drain 标记节点为不可调度,并驱逐节点上的pod kubectl drain {{node-name }}
  • 通过kubectl命令行设置 本节以nginx为例,说明kubectl命令创建工作负载的方法。 前提条件 请参见通过kubectl连接集群配置kubectl命令,使弹性云服务器连接集群。 操作步骤 参见通过kubectl命令行创建无状态工作负载或通过kubectl命令行创建有状态工作负载,工作负载和节点反亲和性的yaml示例如下: apiVersion: apps/v1kind: Deploymentmetadata: name: nginxspec: replicas: 1 selector: matchLabels: app: nginx strategy: type: RollingUpdate template: metadata: labels: app: nginx spec: containers: - image: nginx imagePullPolicy: Always name: nginx imagePullSecrets: - name: default-secret affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: nodeName #node中lable的key operator: NotIn #notin说明不部署 values: - test-node-1 #node中对应key的value
  • 操作场景 健康检查是指容器运行过程中,根据用户需要,定时检查容器健康状况。若不配置健康检查,如果服务出现业务异常,pod将无法感知,也不会自动重启去恢复业务。最终导致虽然pod状态显示正常,但pod中的业务异常的情况。 CCE提供了两种健康检查的探针: 工作负载存活探针:用于检测容器是否正常,类似于执行ps命令检查进程是否存在。如果容器的存活检查失败,集群会对该容器执行重启操作;若容器的存活检查成功则不执行任何操作。 工作负载业务探针:用于检查用户业务是否就绪,如果未就绪,则不转发流量到当前实例。一些程序的启动时间可能很长,比如要加载磁盘数据或者要依赖外部的某个模块启动完成才能提供服务。这时候程序进程在,但是并不能对外提供服务。这种场景下该检查方式就非常有用。如果容器的就绪检查失败,集群会屏蔽请求访问该容器;若检查成功,则会开放对该容器的访问。
  • 检查方式 HTTP 请求检查 HTTP 请求方式针对的是提供HTTP/HTTPS服务的容器,集群周期性地对该容器发起HTTP/HTTPS GET请求,如果HTTP/HTTPS response返回码属于200~399范围,则证明探测成功,否则探测失败。使用HTTP请求探测必须指定容器监听的端口和HTTP/HTTPS的请求路径。 例如:提供HTTP服务的容器,HTTP检查路径为:/health-check;端口为:80;主机地址可不填,默认为容器实例IP,此处以172.16.0.186为例。那么集群会周期性地对容器发起如下请求:GET http://172.16.0.186:80/health-check。 图1 HTTP请求检查 TCP 端口检查 对于提供TCP通信服务的容器,集群周期性地对该容器建立TCP连接,如果连接成功,则证明探测成功,否则探测失败。选择TCP端口探测方式,必须指定容器监听的端口。 例如:有一个nginx容器,它的服务端口是80,对该容器配置了TCP端口探测,指定探测端口为80,那么集群会周期性地对该容器的80端口发起TCP连接,如果连接成功则证明检查成功,否则检查失败。 图2 TCP 端口检查 执行命令检查 命令检查是一种强大的检查方式,该方式要求用户指定一个容器内的可执行命令,集群会周期性地在容器内执行该命令,如果命令的返回结果是0则检查成功,否则检查失败。 对于上面提到的TCP端口检查和HTTP请求检查,都可以通过执行命令检查的方式来替代: 对于TCP端口探测,可以写一个程序来对容器的端口进行connect,如果connect成功,脚本返回0,否则返回-1。 对于HTTP请求探测,可以写一个脚本来对容器进行wget。 wget http://127.0.0.1:80/health-check 并检查response 的返回码,如果返回码在200~399 的范围,脚本返回0,否则返回-1。 图3 执行命令检查 必须把要执行的程序放在容器的镜像里面,否则会因找不到程序而执行失败。 如果执行的命令是一个shell脚本,由于集群在执行容器里的程序时,不在终端环境下,因此不能直接指定脚本为执行命令,需要加上脚本解析器。比如脚本是/data/scripts/health_check.sh,那么使用执行命令检查时,指定的程序应该是sh /data/scripts/health_check.sh。究其原因是集群在执行容器里的程序时,不在终端环境下。
  • 通过kubectl命令行设置 本节以nginx为例,说明kubectl命令创建工作负载的方法。 前提条件 请参见通过kubectl连接集群配置kubectl命令,使弹性云服务器连接集群。 操作步骤 参见通过kubectl命令行创建无状态工作负载或通过kubectl命令行创建有状态工作负载,工作负载和节点亲和性的yaml示例如下: apiVersion: apps/v1kind: Deploymentmetadata: name: nginxspec: replicas: 1 selector: matchLabels: app: nginx strategy: type: RollingUpdate template: metadata: labels: app: nginx spec: containers: - image: nginx imagePullPolicy: Always name: nginx imagePullSecrets: - name: default-secret affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: nodeName #node中lable的key operator: In values: - test-node-1 #node中对应key的value
  • 前提条件 使用系统加固功能前需安装prometheus插件,该插件用于系统监控和报警。core-dns就是根据其自定义prometheus指标“coredns_dns_request_count_total”来进行水平伸缩。 使用coredns水平伸缩功能前需安装coredns插件,该插件是一款通过链式插件的方式为Kubernetes提供域名解析服务的DNS服务器,集群创建时为必装插件,若您手动删除请重新安装。 查看hpa的监控指标前还需安装cce-hpa-controller插件。cce-hpa-controller是一款CCE自研的插件,能够基于CPU利用率、内存利用率等指标,对无状态工作负载进行弹性扩缩容。 查看autoscaler的监控指标前还需安装autoscaler插件。autoscaler插件是一款k8s集群自动扩容缩容node节点的插件。
  • 操作场景 系统管家主要分为两部分:系统体检和系统加固,本章节主要介绍系统加固。 系统加固主要用于对一些系统组件(如coredns插件)进行加固。当前已支持coredns自动水平伸缩,根据coredns的请求量情况自动伸缩其实例个数,以防止请求量过大导致coredns解析性能下降或者解析超时失败。 您还可以在系统加固页面查看hpa的监控指标、autoscaler的监控指标和prometheus的监控指标。
  • 操作步骤 登录CCE控制台,单击集群名称进入集群。 在左侧导航栏中选择“集群信息”,在右边“连接信息”下证书认证一栏,单击“下载”。 图1 获取证书 在弹出的“证书获取”窗口中,根据系统提示选择证书的过期时间并下载集群X509证书。 下载的证书包含client.key、client.crt、ca.crt三个文件,请妥善保管您的证书,不要泄露。 集群中容器之间互访不需要证书。 使用集群证书调用Kubernetes原生API。 例如使用curl命令调用接口查看Pod信息,如下所示,其中192.168.0.18:5443为集群API Server地址。 curl --cert ./client.crt --key ./client.key https://192.168.0.18:5443/api/v1/namespaces/default/pods/ 更多集群接口请参见Kubernetes API。
  • CCE对节点内存的预留规则v2 对于v1.21.4-r0和v1.23.3-r0及以上版本集群,节点内存的预留规则优化为v2模型,且支持通过节点池配置管理参数(kube-reserved-mem和system-reserved-mem)动态调整,具体方法请参见管理节点池。 CCE节点内存v2模型的总预留值等于OS侧预留值与CCE管理Pod所需预留值之和。 其中OS侧预留包括基础预留和随节点内存规格变动的浮动预留;CCE侧预留包括基础预留和随节点Pod数量的浮动预留。 表3 节点内存预留规则v2 预留类型 基础/浮动 预留公式 预留对象 OS侧预留 基础预留 固定400MB sshd、systemd-journald等操作系统服务组件占用 浮动预留(随节点内存) 25MB/GB 内核占用 CCE侧预留 基础预留 固定500MB 节点空载时, kubelet、kube-proxy等容器引擎组件占用。 浮动预留(随节点Pod数量) Docker:20MB/Pod Containerd:5MB/Pod Pod数量增加时,容器引擎组件的额外占用。 说明: v2模型在计算节点默认预留内存时,随内存估计节点默认最大实例数,请参见表1。
  • 资源监控指标 在CCE控制台,可以查看如下指标。 表1 资源监控指标 监控指标 指标含义 CPU分配率 分配给工作负载使用的CPU占比。 内存分配率 分配给工作负载使用的内存占比。 CPU使用率 CPU使用率。 内存使用率 内存使用率。 磁盘使用率 磁盘使用率。 下行速率 一般指从网络下载数据到节点的速度,单位KB/s。 上行速率 一般指从节点上传网络的速度,单位KB/s。 磁盘读取速率 每秒从磁盘读出的数据量,单位KB/s。 磁盘写入速率 每秒写入磁盘的数据量,单位KB/s。 在 AOM 控制台,可以查看主机指标和容器实例的指标,详细的指标内容请参见指标总览。
  • 查看工作负载的监控数据 工作负载的监控数据可以在工作负载详情的监控页面下查看。单击集群名称进入集群,在左侧导航栏选择“工作负载”,在右侧工作负载所在行单击“监控”。 监控数据来源与AOM,可查看工作负载的监控数据包括CPU、内存、网络、GPU等。 监控名词解释: 工作负载CPU使用率 = 工作负载各个Pod中CPU使用率的最大值 工作负载内存使用率 = 工作负载各个Pod中内存使用率的最大值 您还可以单击“查看更多”直接跳转到AOM控制台查看工作负载的监控数据。
  • 查看集群监控数据 单击集群名称进入集群,在左侧导航栏单击集群信息,在右侧可看到集群所有节点(不含控制节点)近一小时的CPU指标和内存指标。 监控名词解释: CPU分配率 = 集群下运行的Pod CPU配额申请值(Request)之和 / 集群下所有节点(不含控制节点)的CPU可分配量之和 内存分配率 = 集群下运行的Pod 内存配额申请值(Request)之和 / 集群下所有节点(不含控制节点)的内存可分配量之和 CPU使用率 = 集群下所有节点(不含控制节点)上实际使用的CPU使用率的平均值。 内存使用率 = 集群下所有节点(不含控制节点)上实际使用的内存使用率的平均值。 节点资源(CPU或内存)可分配量=总量-预留值-驱逐阈值。详情请参见节点预留资源策略说明。
  • 登录方式概述 登录节点(弹性云服务器 E CS )的方式有如下两种: 管理控制台远程登录(VNC方式) 未绑定弹性公网IP的弹性云服务器可通过管理控制台提供的远程登录方式直接登录。 详细操作请参考:Linux 云服务器远程登录 (VNC方式)。 SSH方式登录 仅适用于Linux弹性云服务器。您可以使用远程登录工具(例如PuTTY、Xshell、SecureCRT等)登录弹性云服务器。如果普通远程连接软件无法使用,您可以使用 云服务器ECS 管理控制台的管理终端连接实例,查看云服务器操作界面当时的状态。 SSH方式登录包括SSH密钥和SSH密码两种方式。详细操作请参考SSH密钥方式登录、SSH密码方式登录。 本地使用Windows操作系统登录Linux节点时,输入的镜像用户名(Auto-login username)为:root。 CCE控制台不提供针对节点的操作系统升级,也不建议您通过yum方式进行升级,如果您在节点上通过yum update升级了操作系统,会导致容器网络的组件不可用。手动恢复方式请参见如何解决yum update升级操作系统导致容器网络不可用问题?。
  • 前提条件 表1 迁移前Checklist 类别 描述 集群相关 Nodeip强相关:确认之前集群的节点IP(包括EIP),是否有作为其他的配置或者白名单之类的设置。 工作负载 记录工作负载数目,便于迁移后检查。 存储 确认应用中存储,是否使用云,或者自己搭建存储。 自动创建的存储需要在新集群中变成使用已有存储。 网络 注意使用的负载均衡服务,以及Ingress。 老版本的集群只支持经典型负载均衡服务,迁移到新集群中需要改成共享型负载均衡服务,对应负载均衡服务将会重新建立。 运维 私有配置:确认在之前集群中,是否在节点上配置内核参数或者系统配置。
  • 操作步骤 创建新集群 创建与老版本集群同规格同配置的集群,创建方法请参见购买集群。 添加节点 添加同规格节点,并且在节点上配置之前的手动配置项,创建方法请参见创建节点。 创建存储 在新集群中使用已有存储创建PVC,PVC名称不变,方法请参见通过静态PV使用已有对象存储或通过静态PV使用已有极速文件存储。 切流方案仅支持OBS、SFS Turbo等共享存储。非共享存储切流需要将老集群内的工作负载暂停,将会导致服务不可用。 创建工作负载 在新集群中创建工作负载,名称和规格参数保持不变,创建方法请参见创建无状态负载(Deployment)或创建有状态负载(StatefulSet)。 重新挂载存储 在工作负载中重新挂载已有的存储,方法请参见通过静态PV使用已有对象存储或通过静态PV使用已有极速文件存储。 创建服务 在新集群中创建Service,名称和规格参数保持不变,创建方法请参见服务(Service)。 调测功能 全部创建完成后,请自行调测业务,调测无问题后切换流量。 老集群退订或删除 新集群全部功能ready,退订或者删除老集群,删除集群方法请参见删除集群。
  • 插件简介 Prometheus是一套开源的系统监控报警框架。它启发于Google的borgmon监控系统,由工作在SoundCloud的Google前员工在2012年创建,作为社区开源项目进行开发,并于2015年正式发布。2016年,Prometheus正式加入Cloud Native Computing Foundation,成为受欢迎度仅次于Kubernetes的项目。 在云容器引擎CCE中,支持以插件的方式快捷安装Prometheus。 插件官网:https://prometheus.io/ 开源社区地址:https://github.com/prometheus/prometheus
  • 提供资源指标 容器和节点的资源指标,如CPU、内存使用量,可通过Kubernetes的Metrics API获得。这些指标可以直接被用户访问,比如用kubectl top命令,也可以被HPA或者CustomedHPA使用,根据资源使用率使负载弹性伸缩。 插件可为Kubernetes提供Metrics API,但默认未开启,若要将其开启,需要创建以下APIService对象: apiVersion: apiregistration.k8s.io/v1kind: APIServicemetadata: labels: app: custom-metrics-apiserver release: cceaddon-prometheus name: v1beta1.metrics.k8s.iospec: group: metrics.k8s.io groupPriorityMinimum: 100 insecureSkipTLSVerify: true service: name: custom-metrics-apiserver namespace: monitoring port: 443 version: v1beta1 versionPriority: 100 可以将该对象保存为文件,命名为metrics-apiservice.yaml,然后执行以下命令: kubectl create -f metrics-apiservice.yaml 执行kubectl top命令,若显示如下,则表示Metrics API能正常访问: # kubectl top pod -n monitoringNAME CPU(cores) MEMORY(bytes)......custom-metrics-apiserver-d4f556ff9-l2j2m 38m 44Mi...... 卸载插件时,需要执行以下kubectl命令,同时删除APIService对象,否则残留的APIService资源将导致metrics-server插件安装失败。 kubectl delete APIService v1beta1.metrics.k8s.io
  • 插件特点 作为新一代的监控框架,Prometheus具有以下特点: 强大的多维度数据模型: 时间序列数据通过metric名和键值对来区分。 所有的metrics都可以设置任意的多维标签。 数据模型更随意,不需要刻意设置为以点分隔的字符串。 可以对数据模型进行聚合,切割和切片操作。 支持双精度浮点类型,标签可以设为全unicode。 灵活而强大的查询语句(PromQL):在同一个查询语句,可以对多个metrics进行乘法、加法、连接、取分数位等操作。 易于管理:Prometheus server是一个单独的二进制文件,可直接在本地工作,不依赖于分布式存储。 高效:平均每个采样点仅占 3.5 bytes,且一个Prometheus server可以处理数百万的metrics。 使用pull模式采集时间序列数据,这样不仅有利于本机测试而且可以避免有问题的服务器推送坏的metrics。 可以采用push gateway的方式把时间序列数据推送至Prometheus server端。 可以通过服务发现或者静态配置去获取监控的targets。 有多种可视化图形界面。 易于伸缩。 需要指出的是,由于数据采集可能会有丢失,所以Prometheus不适用对采集数据要100%准确的情形。但如果用于记录时间序列数据,Prometheus具有很大的查询优势,此外,Prometheus适用于微服务的体系架构。
  • 安装插件 登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“插件管理”,在右侧找到Prometheus,单击“安装”。 在“规格配置”步骤中,配置以下参数: 表1 Prometheus配置参数说明 参数 参数说明 插件规格 根据业务需求,选择插件的规格,包含如下选项: 演示规格(100容器以内):适用于体验和功能演示环境,该规模下prometheus占用资源较少,但处理能力有限。建议在集群内容器数目不超过100时使用。 小规格(2000容器以内):建议在集群中的容器数目不超过2000时使用。 中规格(5000容器以内):建议在集群中的容器数目不超过5000时使用。 大规格(超过5000容器):建议集群中容器数目超过5000时使用此规格。 实例数 选择上方插件规格后,显示插件中的实例数,此处仅作显示。 容器 选择插件规格后,显示插件容器的CPU和内存配额,此处仅作显示。 数据保留期 自定义监控数据需要保留的天数,默认为15天。 存储 支持云硬盘作为存储,按照界面提示配置如下参数: 可用区:请根据业务需要进行选择。可用区是在同一区域下,电力、网络隔离的物理区域,可用区之间内网互通,不同可用区之间物理隔离。 子类型:支持普通IO、高IO和超高IO三种类型。 容量:请根据业务需要输入存储容量,默认10G。 说明: 若命名空间monitoring下已存在pvc,将使用此存储作为存储源。 单击“安装”。安装完成后,插件会在集群中部署以下实例。 prometheus-operator:根据自定义资源(Custom Resource Definition / CRDs)来部署和管理Prometheus Server,同时监控这些自定义资源事件的变化来做相应的处理,是整个系统的控制中心。 prometheus(Server):Operator根据自定义资源Prometheus类型中定义的内容而部署的Prometheus Server集群,这些自定义资源可以看作是用来管理Prometheus Server集群的 StatefulSets 资源。 prometheus-kube-state-metrics:将Prometheus的metrics数据格式转换成K8s API接口能识别的格式。 custom-metrics-apiserver:将自定义指标聚合到原生的kubernetes apiserver。 prometheus-node-exporter:每个节点上均有部署,收集Node级别的监控数据。 grafana:可视化浏览普罗监控数据。
  • 版本记录 表2 CCE插件版本记录 插件版本 支持的集群版本 更新特性 社区版本 2.23.32 /v1.(17|19|21).*/ - 2.10.0 2.23.31 /v1.15.*/ 适配CCE 1.15集群 2.10.0 2.23.30 /v1.(17|19|21).*/ 适配CCE 1.21集群 2.10.0 2.21.14 /v1.(17|19|21).*/ 适配CCE 1.21集群 2.10.0 2.21.12 /v1.15.*/ 适配CCE 1.15集群 2.10.0 2.21.11 /v1.(17|19).*/ 适配CCE 1.19集群 2.10.0 1.15.1 /v1.(15|17).*/ Prometheus是一个监控系统和时间序列库 2.10.0
  • Pod安全策略开放非安全系统配置示例 节点池管理中可以为相应的节点池配置allowed-unsafe-sysctls,CCE从1.17.17集群版本开始,需要在Pod安全策略的allowedUnsafeSysctls字段中增加相应的配置才能生效,配置详情请参考表1。 除修改全局Pod安全策略外,也可增加新的Pod安全策略,如开放net.core.somaxconn非安全系统配置,新增Pod安全策略示例参考如下: apiVersion: policy/v1beta1kind: PodSecurityPolicymetadata: annotations: seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' name: sysctl-pspspec: allowedUnsafeSysctls: - net.core.somaxconn allowPrivilegeEscalation: true allowedCapabilities: - '*' fsGroup: rule: RunAsAny hostIPC: true hostNetwork: true hostPID: true hostPorts: - max: 65535 min: 0 privileged: true runAsGroup: rule: RunAsAny runAsUser: rule: RunAsAny seLinux: rule: RunAsAny supplementalGroups: rule: RunAsAny volumes: - '*'---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: sysctl-psprules: - apiGroups: - "*" resources: - podsecuritypolicies resourceNames: - sysctl-psp verbs: - use---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: sysctl-psproleRef: kind: ClusterRole name: sysctl-psp apiGroup: rbac.authorization.k8s.iosubjects:- kind: Group name: system:authenticated apiGroup: rbac.authorization.k8s.io
  • 恢复原始Pod安全策略 如果您已经修改默认Pod安全策略后,想恢复原始Pod安全策略,请执行以下操作。 创建一个名为policy.yaml的描述文件。其中,policy.yaml为自定义名称,您可以随意命名。 vi policy.yaml 描述文件内容如下。 apiVersion: policy/v1beta1kind: PodSecurityPolicymetadata: name: psp-global annotations: seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'spec: privileged: true allowPrivilegeEscalation: true allowedCapabilities: - '*' volumes: - '*' hostNetwork: true hostPorts: - min: 0 max: 65535 hostIPC: true hostPID: true runAsUser: rule: 'RunAsAny' seLinux: rule: 'RunAsAny' supplementalGroups: rule: 'RunAsAny' fsGroup: rule: 'RunAsAny' ---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: psp-globalrules: - apiGroups: - "*" resources: - podsecuritypolicies resourceNames: - psp-global verbs: - use ---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: psp-globalroleRef: kind: ClusterRole name: psp-global apiGroup: rbac.authorization.k8s.iosubjects:- kind: Group name: system:authenticated apiGroup: rbac.authorization.k8s.io 执行如下命令: kubectl apply -f policy.yaml
  • 修改全局默认Pod安全策略 修改全局默认Pod安全策略前,请确保已创建CCE集群,并且通过kubectl连接集群成功。 执行如下命令: kubectl edit psp psp-global 修改所需的参数,如表1。 表1 Pod安全策略配置 配置项 描述 privileged 启动特权容器。 hostPID hostIPC 使用主机命名空间。 hostNetwork hostPorts 使用主机网络和端口。 volumes 允许使用的挂载卷类型。 allowedHostPaths 允许hostPath类型挂载卷在主机上挂载的路径,通过pathPrefix字段声明允许挂载的主机路径前缀组。 allowedFlexVolumes 允许使用的指定FlexVolume驱动。 fsGroup 配置Pod中挂载卷使用的辅组ID。 readOnlyRootFilesystem 约束启动Pod使用只读的root文件系统。 runAsUser runAsGroup supplementalGroups 指定Pod中容器启动的用户ID以及主组和辅组ID。 allowPrivilegeEscalation defaultAllowPrivilegeEscalation 约束Pod中是否允许配置allowPrivilegeEscalation=true,该配置会控制Setuid的使用,同时控制程序是否可以使用额外的特权系统调用。 defaultAddCapabilities requiredDropCapabilities allowedCapabilities 控制Pod中使用的Linux Capabilities。 seLinux 控制Pod使用seLinux配置。 allowedProcMountTypes 控制Pod允许使用的ProcMountTypes。 annotations 配置Pod中容器使用的AppArmor或Seccomp。 forbiddenSysctls allowedUnsafeSysctls 控制Pod中容器使用的Sysctl配置。
  • 容器IP地址管理 容器隧道网络按如下规则分配容器IP: 容器网段需单独分配,与节点网段无关 节点维度划分地址段,集群的所有节点从容器网段中分配一个或多个固定大小(默认16)的IP网段 当节点上的IP地址使用完后,可再次申请分配一个新的IP网段 容器网段依次循环分配IP网段给新增节点或存量节点 调度到节点上的Pod依次循环从分配给节点的一个或多个IP网段内分配IP地址 图2 容器隧道网络IP地址分配 按如上IP分配,容器隧道网络的集群最多能创建节点数量 = 容器网段IP数量 ÷ 节点从容器网段中一次分配的IP网段大小(默认为16) 比如容器网段为172.16.0.0/16,则IP数量为65536,一次分配16,则最多可创建节点数量为65536/16=4096。这是一种极端情况,如果创建4096个节点,则每个节点最多只能创建16个Pod,因为给每个节点只分配了16个IP的网段。另外集群能创建多少节点,还受节点网络和集群规模的影响。 图3 网络模型选择(创建集群时配置)
  • 容器隧道网络模型 容器隧道网络在节点网络基础上通过隧道封装构建的独立于节点网络平面的容器网络平面,CCE集群容器隧道网络使用的封装协议为VXLAN,后端虚拟交换机采用的是openvswitch,VXLAN是将以太网报文封装成UDP报文进行隧道传输。容器隧道网络具有付出少量隧道封装性能损耗,即可获得通用性强、互通性强、高级特性支持全面(例如NetworkPolicy网络隔离)的优势,可以满足大多数性能要求不高的场景。 图1 容器隧道网络 说明如下: 节点内Pod间通信:同节点的Pod间通信直接通过本节点的ovs网桥直接转发。 跨节点Pod间通信:所有跨节点Pod间的通信通过ovs隧道网桥进行封装后,转发到对端节点上。
  • 应用场景 对性能要求不高:由于需要额外的VXLAN隧道封装,相对于另外两种容器网络模式,性能存在一定的损耗。大概有5%-15%的性能损失。所以容器隧道网络适用于对性能要求不是特别高的业务场景,比如:web应用、访问量不大的数据中台、后台服务等。 大规模组网:相比VPC路由网络受限于VPC路由条目配额的限制,容器隧道网络没有网络基础设施的任何限制;同时容器隧道网络把广播域控制到了节点级别,容器隧道网络最大可支持2000节点规模。
  • 网段规划建议 在集群网络构成中介绍集群中网络地址可分为节点网络、容器网络、服务网络三块,在规划网络地址时需要从如下方面考虑: 三个网段不能重叠,否则会导致冲突。且集群所在VPC下所有子网(包括扩展网段子网)不能和容器网段、服务网段冲突。 保证每个网段有足够的IP地址可用。 节点网段的IP地址要与集群规模相匹配,否则会因为IP地址不足导致无法创建节点。 容器网段的IP地址要与业务规模相匹配,否则会因为IP地址不足导致无法创建Pod。每个节点上可以创建多少Pod还与其他参数设置相关,具体请参见节点可创建的最大Pod数量说明。
  • VPC网络模型 VPC网络采用VPC路由方式与底层网络深度整合,适用于高性能场景,节点数量受限于 虚拟私有云VPC 的路由配额。每个节点将会被分配固定大小的IP地址段。VPC网络由于没有隧道封装的消耗,容器网络性能相对于容器隧道网络有一定优势。VPC网络集群由于VPC路由中配置有容器网段与节点IP的路由,可以支持集群外直接访问容器实例等特殊场景。 图1 VPC网络 说明如下: 节点内Pod间通信:ipvlan子接口分配给节点上的Pod,同节点的Pod间通信直接通过ipvlan直接转发。 跨节点Pod间通信:所有跨节点Pod间的通信通过默认路由到默认网关,借助VPC的路由转发能力,转发到对端节点上。
  • 网段规划建议 在集群网络构成中介绍集群中网络地址可分为节点网络、容器网络、服务网络三块,在规划网络地址时需要从如下方面考虑: 三个网段不能重叠,否则会导致冲突。且集群所在VPC下所有子网(包括扩展网段子网)不能和容器网段、服务网段冲突。 保证每个网段有足够的IP地址可用。 节点网段的IP地址要与集群规模相匹配,否则会因为IP地址不足导致无法创建节点。 容器网段的IP地址要与业务规模相匹配,否则会因为IP地址不足导致无法创建Pod。每个节点上可以创建多少Pod还与其他参数设置相关,具体请参见节点可创建的最大Pod数量说明。 例如集群规模为200节点,容器网络模型为VPC网络。 则此时选择节点子网的可用IP数量需要超过200,否则会因为IP地址不足导致无法创建节点。 容器网段为10.0.0.0/16,可用IP数量为65536,如容器IP地址管理中所述,VPC网络IP分配是分配固定大小的网段(使用掩码实现,确定每个节点最多分配多少容器IP),例如上限为128,则此时集群最多支撑65536/128=512个节点,然后去掉Master节点数量,最终结果就是509个。 图4 容器网段配置(创建集群时配置)
  • 容器IP地址管理 VPC网络按如下规则分配容器IP: 容器网段需单独分配 节点维度划分地址段,集群的所有节点从容器网段中分配一个固定大小(用户自己配置)的IP网段 容器网段依次循环分配IP网段给新增节点 调度到节点上的Pod依次循环从分配给节点的IP网段内分配IP地址 图2 VPC网络IP地址管理 按如上IP分配,VPC网络的集群最多能创建节点数量 = 容器网段IP数量 ÷ 节点从容器网段中分配IP网段的IP数量 比如容器网段为172.16.0.0/16,则IP数量为65536,节点分配容器网段掩码为25,也就是每个节点容器IP数量为128,则最多可创建节点数量为65536/128=512。另外,集群能创建多少节点,还受节点网络和集群规模的影响。 图3 容器网段配置(创建集群时配置)
共100000条