华为云用户手册

  • 创建HPA策略 创建HPA策略,如下所示,该策略关联了名为hpa-example的负载,期望CPU使用率为50%。 另外有两条注解annotations,一条是CPU的阈值范围,最低30,最高70,表示CPU使用率在30%到70%之间时,不会扩缩容,防止小幅度波动造成影响。另一条是扩缩容时间窗,表示策略成功触发后,在缩容/扩容冷却时间内,不会再次触发缩容/扩容,以防止短期波动造成影响。 apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: hpa-policy annotations: extendedhpa.metrics: '[{"type":"Resource","name":"cpu","targetType":"Utilization","targetRange":{"low":"30","high":"70"}}]' extendedhpa.option: '{"downscaleWindow":"5m","upscaleWindow":"3m"}'spec: scaleTargetRef: kind: Deployment name: hpa-example apiVersion: apps/v1 minReplicas: 1 maxReplicas: 100 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 在控制台创建则参数填写如下所示。
  • 相关操作 通过命令行工具连接集群:请参见通过kubectl连接集群。 登录节点:请参见登录节点。 创建命名空间:同个集群内可创建多个命名空间,形成逻辑上的不同分组,便于不同的分组在共享使用集群资源时还能被分别管理。若您需要为集群创建命名空间,请参见命名空间。 创建工作负载:集群创建完成后,您可以使用镜像创建一个可公网访问的应用,请参见创建无状态负载(Deployment)、创建有状态负载(StatefulSet)或创建守护进程集(DaemonSet)。 单击已成功创建的集群名称,进入“集群详情”页可查看集群详情。 表4 已创建的集群详情 页签类别 说明 集群详情 可查看该集群的详情及运行状态等。 监控 可查看集群下全部节点的CPU和内存分配率(即分配量的最大值),以及控制节点的CPU和内存使用率、控制节点规格等信息。 事件 可以直接在“事件”页签下查看集群的事件。 可以设置查询条件,比如设置事件产生的时间段或搜索事件名称,查看相关事件。 说明: 由于版本更新演进,旧版Console不再支持查看新集群的事件,请前往新版Console使用。 弹性扩容 您可以根据实际业务需要对集群的工作节点进行扩容和缩容,详情请参见集群弹性扩容。 v1.17版本的集群不再支持AOM提供的弹性伸缩机制,请使用节点池功能进行弹性伸缩,详情请参见节点池概述。 kubectl 若您需要从客户端计算机连接到kubernetes集群,请使用kubernetes命令行客户端kubectl,详情请参见通过kubectl连接集群。 资源标签 通过为资源添加标签,可以对资源进行自定义标记,实现资源的分类。 您可以在TMS中创建“预定义标签”,预定义标签对所有支持标签功能的服务资源可见,通过使用预定义标签可以提升标签创建和迁移效率。具体请参见创建预定义标签。 CCE服务会自动帮您创建CCE-Dynamic-Provisioning-Node=节点id的标签,允许增加5个标签。 Istioctl 在集群开启istio服务网格功能后,您使用Istio命令行工具Istioctl配置多种路由策略,从而管理服务流量,包括流量转移、故障注入、限流熔断等。详情请参见启用istio。
  • 约束与限制 创建节点过程中会使用域名方式从OBS下载软件包,需要能够使用云上内网DNS解析OBS域名,否则会导致创建不成功。为此,节点所在子网需要配置为内网DNS地址,从而使得节点使用内网DNS。在创建子网时DNS默认配置为内网DNS,如果您修改过子网的DNS,请务必确保子网下的DNS服务器可以解析OBS服务域名,否则需要将DNS改成内网DNS。 单Region下单用户可创建的集群总数限制为50个,如果配额不满足业务需求,请到“我的配额”提交申请,查看配额请参见关于配额。 CCE Turbo集群的网络模式只支持云原生网络2.0,云原生网络2.0的详细介绍请参见云原生网络2.0。 CCE Turbo集群的节点目前仅支持基于擎天软硬件协同架构的机型。
  • 约束与限制 在CCE所创的集群中,Kubernetes v1.15.11版本是Flexvolume插件(storage-driver)被CSI插件(Everest)兼容接管的过渡版本,v1.17及之后版本的集群中将彻底去除对Flexvolume插件(storage-driver)的支持,请您将Flexvolume插件的使用切换到CSI插件上。CSI和Flexvolume能力对比请参见CSI和Flexvolume存储插件的区别。 CSI插件(Everest)兼容接管Flexvolume插件(storage-driver)后,原有功能保持不变,但请注意不要新建Flexvolume插件(storage-driver)的存储,否则将导致部分存储功能异常。
  • CSI和Flexvolume存储插件的区别 表1 CSI与Flexvolume Kubernetes插件方案 CCE插件名称 插件特性 使用推荐 CSI Everest CSI插件是kubernetes社区推荐的存储插件机制。CCE发布的kubernetes1.15版本及以上版本默认安装CSI插件Everest,并用于对接块存储、文件存储、对象存储、极速文件存储等Iaas存储服务。 Everest插件包含两部分: Everest-csi-controller:提供存储卷的创建、删除、扩容、云盘快照等功能; Everest-csi-driver:提供存储卷在node上的挂载、卸载、格式化等功能。 详情请参见Everest 针对1.15及以上版本的集群,在创建时将默认安装CSI插件(Everest)。CCE会跟随社区持续更新CSI插件的各种能力。 Flexvolume storage-driver Flexvolume插件是kubernetes社区早期实现的存储卷插件机制。自CCE上线伊始,提供的就是Flexvolume数据卷服务。CCE发布的kubernetes 1.13及以下版本安装的插件是“storage-driver”,并用于对接块存储、文件存储、对象存储、极速文件存储等Iaas存储服务。 详情请参见storage-driver 针对已经创建的1.13及以下版本的集群,仍然使用已经安装的Flexvolume存储插件(storage-driver),CCE已停止更新该插件,您可以升级集群版本。 不支持CSI和Flexvolume插件在同一个集群中使用。 不支持将v1.13及以下版本集群的Flexvolume插件转变到CSI插件,v1.13版本的集群可以通过升级集群版本切换为CSI插件。
  • 插件使用推荐 使用CSI插件(Everest)要求Kubernetes版本需为1.15及以上,v1.15及以上版本的集群在创建时将默认安装本插件,v1.13及以下版本集群创建时默认安装Flexvolume插件(storage-driver)。 集群版本由v1.13升级到v1.15后,v1.13版本集群中的Flexvolume容器存储插件(storage-driver)能力将由v1.15的CSI插件(Everest,插件版本v1.1.6及以上)接管,接管后原有功能保持不变。 插件版本为1.2.0的Everest优化了使用OBS存储时的密钥认证功能,低于该版本的Everest插件在升级完成后,需要重启集群中使用OBS存储的全部工作负载,否则工作负载使用存储的能力将受影响!
  • 使用说明 符合标准文件协议:用户可以将文件系统挂载给服务器,像使用本地文件目录一样。 数据共享:多台服务器可挂载相同的文件系统,数据可以共享操作和访问。 私有网络:数据访问必须在数据中心内部网络中。 容量与性能:单文件系统容量较高(PB级),性能极佳(IO读写时延ms级)。 应用场景:适用于多读多写(ReadWriteMany)场景下的各种工作负载(Deployment/StatefulSet)和普通任务(Job)使用,主要面向高性能计算、媒体处理、内容管理和Web服务、大数据和分析应用程序等场景。 详情请参见弹性文件服务产品介绍。
  • 升级前排查项 在集群升级前,请根据如下Checklist进行排查,以便提前发现风险和问题。 表2 集群升级排查项 类别 检查项 集群 确认当前集群的Node IP(包括EIP),是否有作为其他的配置或者白名单等。 执行升级前预检查功能。 工作负载 记录工作负载的数量、工作负载状态,便于升级后对比。 针对您使用的数据库(例如云专线、Redis、Mongdb等),要提前考虑白名单、路由或安全组策略变化等问题。 存储 记录存储状态,保证升级后存储不丢失。 网络 检查使用的负载均衡服务、Ingress,并做好备份。 针对使用云专线的业务场景,需重点关注业务所在的节点或实例IP是否会因为升级而发生变化,若有变化需提前在云专线开通路由。 插件 社区Kubernetes 1.9版本升级1.11版本时,集群的kube-dns会被卸载并替换为CoreDNS,请备份您配置在kube-dns中的DNS地址,以便在域名解析异常时重新在CoreDNS中进行配置。 运维 私有配置:在升级前的集群中检查是否在节点或容器中放置了数据面密码、证书、环境变量等配置,当容器重启(例如节点异常重新调度pod),会导致配置丢失,业务异常。 检查并备份内核参数或者系统配置。
  • 注意事项 集群升级操作不可回退,请务必慎重并选择合适的时间段进行升级,以减少升级对您的业务带来的影响。 集群升级前请参考Kubernetes版本发布说明了解每个集群版本发布的特性以及差异,否则可能因为应用不兼容新集群版本而导致升级后异常。 集群升级中请勿关机或重启节点,否则会导致升级失败。 集群升级前请关闭弹性扩缩容策略,避免在升级过程中扩缩容节点,从而导致升级失败。 如果您本地修改了集群节点的配置,可能导致集群升级失败或升级后配置丢失,建议您通过集群的配置管理和节点池的配置管理修改配置,以便在升级时自动继承。 集群升级过程中,已运行工作负载业务不会中断,但API Server访问会短暂中断,如果业务需要访问API Server可能会受到影响。 请在升级集群前,请查看集群状态是否均为健康状态。若集群不正常,您可以自行修复,若仍有问题请提交工单协助您进行修复。 为了您的数据安全,强烈建议您先备份数据然后再升级,升级过程中不建议对集群进行任何操作。 1.17及以上版本不再支持通过AOM服务进行负载的弹性伸缩,升级前后请根据AOM弹性伸缩切换至HPA/CustomedHPA说明进行弹性伸缩策略的切换。
  • 约束与限制 当前仅支持虚拟机节点的CCE集群升级,暂不支持鲲鹏集群、CCE Turbo集群、使用私有镜像的CCE集群升级。 1.15版本集群原地升级,如果业务中存在initContainer或使用Istio的场景,则需要注意以下约束: 1.16及以上的kubelet统计QosClass和之前版本存在差异,1.15及以下版本仅统计spec.containers下的容器,1.16及以上的kubelet版本会同时统计spec.containers和spec.initContainers下的容器,升级前后会造成Pod的QosClass变化,从而造成Pod中容器重启。建议参考表1在升级前修改业务容器的QosClass规避该问题。 表1 升级前后QosClass变化 init容器(根据spec.initContainers计算) 业务容器(根据spec.containers计算) Pod(根据spec.containers和spec.initContainers计算) 是否受影响 Guaranteed Besteffort Burstable 是 Guaranteed Burstable Burstable 否 Guaranteed Guaranteed Guaranteed 否 Besteffort Besteffort Besteffort 否 Besteffort Burstable Burstable 否 Besteffort Guaranteed Burstable 是 Burstable Besteffort Burstable 是 Burstable Burstable Burstable 否 Burstable Guaranteed Burstable 是
  • 使用说明 使用便捷:您可以像使用传统服务器硬盘一样,对挂载到服务器上的块存储(硬盘)做格式化、创建文件系统等操作。 数据不共享:每台服务器使用独立的块存储(硬盘),多服务器之间数据隔离。 私有网络:数据访问必须在数据中心内部网络中。 容量性能:单卷容量有限(TB级),但性能极佳(IO读写时延ms级)。 使用限制:不支持导入分区或者具有非ext4文件系统的云硬盘。 应用场景:主要面向HPC高性能计算、企业核心集群应用、企业应用系统和开发测试等。适用于供单实例部署的无状态负载(Deployment)和普通任务(Job),以及有状态工作负载(StatefulSet)的每个实例独占式使用。因为云硬盘属于非共享存储,不能同时被多个节点挂载,若两个Pod配置了使用同一个云硬盘,当这两个Pod被调度到不同的节点时,必然有一个Pod会因为无法挂载云硬盘导致无法成功启动。
  • 卸载插件 登录CCE控制台,进入集群,在左侧导航栏选择“插件管理”,在右侧“已安装插件”页签下,单击virtual kubelet下的“卸载”。 在弹出的窗口中,单击“是”,可卸载该插件。(卸载插件会自动删除CCI侧的所有资源,以确保不会有资源残留造成额外计费) 由于virtual-kubelet插件卸载时会在集群中启动Job用于清理资源,卸载插件时请保证集群中至少有一个可以调度的节点,否则卸载插件会失败。若已经因无可调度节点造成插件卸载失败,需要在有可调度节点后重新单击插件卸载。 如果在未卸载virtual-kubelet插件的情况下直接删除集群,CCI侧的资源不会被自动清理,会导致CCI侧资源残留,可能会造成额外计费。因此请确保完成以下任意一操作。 在删除集群前先卸载virtual-kubelet插件。 在直接删除集群后登录CCI控制台删除名为cce-burst-${CLUSTER_ID}的命名空间。 集群休眠时CCI侧正在运行的实例不会自动停止,会持续运行并计费。因此如不需要实例继续运行,请确保在集群休眠前将弹性到CCI的负载实例数缩至0。
  • 注意事项 退订/释放集群会删除集群下的节点(纳管节点不会被删除)、节点挂载的数据盘、工作负载与服务,相关业务将无法恢复。在执行操作前,请确保数据已完成备份或者迁移,退订/释放完成后数据无法找回,请谨慎操作。 部分不是在CCE中创建的资源不会删除: 纳管的节点(仅删除在CCE中创建的节点) Service和Ingress关联的ELB实例(仅删除自动创建的ELB实例) 手动创建PV关联的云存储/导入的云存储(仅删除PVC自动创建的云存储) 退订/释放集群仅退订订单关联的资源,非关联资源不会处理,相关资源会继续计费,请妥善处理。 对于包周期集群,如果过保留期会自动释放,集群下的节点如果同时到期会一并释放,节点如果未到期会重装节点操作系统。请关注您帐号下到期未续费集群,及时续费,防止节点被重装导致数据丢失。 集群资源包含控制节点资源和工作节点所使用的的基础设施,详情请参见计费说明。 订单中存在主从关系的资源,需分别退订。 资源退订,相关注意事项请参见退订规则说明。 如果您正在退订使用中的资源,请仔细确认资源信息和退款信息,资源退订后将无法恢复。若您要保留资源,仅退订未使用的续费周期,请退订续费周期。 如果您退订的资源与其他包年/包月资源关联,退订操作可能会影响关联资源的正常使用,请谨慎操作。 如果已与其他按需资源关联,退订操作完成后,关联的按需资源可以正常使用并计费。 如果您本次退订属于非五天无理由退订,需收取手续费和已消费金额,已使用的代金券和折扣券不退还。
  • 约束及限制 仅支持VPC网络模式的CCE集群和CCE Turbo集群(virtual-kubelet 1.2.5版本及以上支持),暂不支持ARM集群。如果集群中包含ARM节点,插件实例将不会部署至ARM节点。 调度到CCI的实例的存储类型只支持ConfigMap、Secret、emptyDir、SFS、SFS Turbo几种Volume类型,其中emptyDir不支持子路径,且SFS、SFS Turbo类型存储对应的PVC只支持使用CSI类型的StorageClass。 暂不支持守护进程集(DaemonSet)以及HostNetwork网络模式的容器实例(Pod)弹性到CCI。 跨CCE和CCI实例Service网络互通只支持集群内访问(ClusterIP)类型。 跨CCE和CCI实例,在对接LoadBalancer类型的Service或Ingress时,禁止指定健康检查端口: 1. 在CCE集群下,由于CCI的容器与CCE的容器在ELB注册的后端使用端口不一致,指定健康检查端口会导致部分后端健康检查异常。 2. 跨集群使用Service对接同一个ELB的监听器时,需确认健康检查方式,避免服务访问异常。 3. 跨CCE和CCI实例,在对接共享型LoadBalancer类型的Service时,需要放通node安全组下100.125.0.0/16网段的容器端口。 集群所在子网不能与10.247.0.0/16重叠,否则会与CCI命名空间下的Service网段冲突,导致无法使用。 使用插件前需要用户在CCI界面对CCI服务进行授权。 安装virtual-kubelet插件后会在CCI服务新建一个名为"cce-burst-"+集群ID的命名空间,该命名空间完全由virtual-kubelet管理,不建议直接在CCI服务使用该命名空间,如需使用CCI服务,请另外新建命名空间。 实例的规格必须满足云容器实例CCI的容器规范。 使用1.2.5以下版本插件时,各容器的Requests须等于Limits(1.2.5及以上版本插件两者可不相等,弹性到CCI时自动将两者设置为一样,若配置了Limits,则以Limits为准,没有配Limits,则以Requests为准)。 Pod中至少有1个容器配置CPU大于0。 经过资源自动规整后,Pod总CPU不得超过32核,内存不得超过256Gi。 弹性到CCI的业务量不同时,插件的资源占用也不相同。业务申请的POD、Secret、Congfigmap、PV、PVC会占用虚机资源。建议用户评估自己的业务使用量,按以下规格申请对应的虚机大小:1000pod+1000CM(300KB)推荐2U4G规格节点,2000pod+2000CM推荐4U8G规格节点,4000pod+4000CM推荐8U16G规格节点。 当弹性到CCI的资源调度失败时,virtual-kubelet节点会被锁定半小时,期间无法调度至CCI。用户可通过CCE集群控制台,使用kubectl工具查看virtual-kubelet节点状态,若节点被锁定,可手动解锁virtual-kubelet。
  • 安装插件 在CCE控制台,单击集群名称进入集群,单击左侧导航栏的“插件管理”,在右侧找到virtual-kubelet,单击“安装”。 在“规格配置”步骤中,勾选“网络互通”后的选择框,可实现CCE集群中的Pod与CCI集群中的Pod通过Kubernetes Service互通。 图1 勾选“网络互通” 单击“安装”。 勾选了网络互通后,会在CCI运行的Pod中注入一个sidecar用于支持service访问的能力,查询到的运行容器数量会比定义的多一个,属于正常情况。
  • 资源自动规整 对弹性到CCI的Pod,若其配置的资源规格不满足CCI容器规范,virtual-kubelet会自动尝试将Pod资源向上规整到满足CCI容器规范的范围,以规整后的资源规格创建Pod到CCI。 自动规整规则如下: 将Pod中除了BestEffort类型容器外的每个容器CPU向上调整至0.25核的整数倍, Memory向上调整至大于等于0.2Gi。 将整个Pod的Memory向上调整至1Gi的整数倍。 若Pod Memory/CPU的比值小于2,则将Pod Memory向上调整至大于等于CPU的2倍,且满足是1Gi的整数倍;若Pod Memory/CPU的比值大于8,则将Pod CPU向上调整至大于等于Memory的1/8,且满足是0.25核的整数倍。 若向上调整之后,CPU超过32核或Memory超过256Gi,则矫正失败,拒绝创建请求。 以上对Pod级别资源向上调整造成的增量CPU和Memory,全部添加到Pod中第一个不为BestEffort的容器上。
  • 注意事项 集群升级过程中会自动升级插件到目标集群兼容的版本,升级过程中请不要卸载或者重装插件。 升级之前请确认所有的插件都处于运行状态,如果插件升级失败可以在插件问题修复后,重试升级。 升级时会检查插件运行状态,部分插件(如CoreDNS)需要至少两个节点才能维持正常状态,那此时升级就至少需要两个节点。 若在集群升级过程中出现升级失败的提示,请参照提示信息修复问题后单击重试,若重试后仍未成功升级,请提交工单协助您进行修复。 更多注意事项请参见升级前须知。
  • 通过YAMl文件配置 无状态工作负载示例模板: apiVersion: apps/v1kind: Deploymentmetadata: name: test-vk labels: virtual-kubelet.io/burst-to-cci: 'auto'spec: replicas: 20 selector: matchLabels: app: test-vk template: metadata: labels: app: test-vk spec: containers: - name: container-0 image: centos:latest resources: limits: cpu: 500m memory: 1024Mi requests: cpu: 500m memory: 1024Mi command: - /bin/bash - '-c' - sleep 10000 dnsPolicy: Default Pod示例模板: apiVersion: v1kind: Podmetadata: name: nginx labels: virtual-kubelet.io/burst-to-cci: 'auto'spec: containers: - image: nginx:alpine name: container-0 resources: limits: cpu: 500m memory: 1024Mi requests: cpu: 500m memory: 1024Mi imagePullSecrets: - name: default-secret 创建弹性至CCI的负载时需要在工作负载或Pod的labels中添加如下字段: virtual-kubelet.io/burst-to-cci: "auto" 其中,value值支持以下选项: auto:根据用户集群内调度器实际打分结果自动决定是否弹性至CCI,其中在TaintToleration算法上会优先选择调度到CCE节点。 localPrefer:集群资源不足时,将Pod部署到CCI。 enforce:强制调度至CCI。 off:不调度至CCI。
  • 通过kubectl命令行创建 请参见通过kubectl连接集群,使用kubectl连接集群。 创建一个名为securitygroup-demo.yaml的描述文件。 vi securitygroup-demo.yaml 例如,用户创建如下的SecurityGroup资源对象,给所有的app:nginx工作负载绑定上提前已经创建的64566556-bd6f-48fb-b2c6-df8f44617953,5451f1b0-bd6f-48fb-b2c6-df8f44617953的两个安全组。示例如下: apiVersion: crd.yangtse.cni/v1kind: SecurityGroupmetadata: name: demo namespace: defaultspec: podSelector: matchLabels: app: nginx securityGroups: - id: 64566556-bd6f-48fb-b2c6-df8f44617953 - id: 5451f1b0-bd6f-48fb-b2c6-df8f44617953 以上yaml参数说明如表2。 表2 参数说明 字段名称 字段说明 必选/可选 apiVersion 表示API的版本号,版本号为crd.yangtse.cni/v1。 必选 kind 创建的对象类别。 必选 metadata 资源对象的元数据定义。 必选 name SecurityGroup的名称。 必选 namespace 工作空间名称。 必选 Spec 用户对SecurityGroup的详细描述的主体部分都在spec中给出。 必选 podselector 定义SecurityGroup中需要关联安全组的工作负载。 必选 SecurityGroups id为安全组的ID。 必选 执行以下命令,创建SecurityGroup。 kubectl create -f securitygroup-demo.yaml 回显如下表示已开始创建SecurityGroup securitygroup.crd.yangtse.cni/demo created 执行以下命令,查看SecurityGroup。 kubectl get sg 回显信息中有创建的SecurityGroup名称为demo,表示SecurityGroup已创建成功。 NAME POD-SELECTOR AGEall-no map[matchLabels:map[app:nginx]] 4h1ms001test map[matchLabels:map[app:nginx]] 19mdemo map[matchLabels:map[app:nginx]] 2m9s
  • 背景信息 默认情况下,运行中的Pod可以无限制的使用Node节点上的CPU和内存,这意味着任意一个Pod都可以无节制地使用集群的计算资源,某个命名空间的Pod可能会耗尽集群的所有资源。 kubernetes在一个物理集群上提供了多个虚拟集群,这些虚拟集群被称为命名空间。命名空间可用于多种工作用途,满足多用户的使用需求,通过为每个命名空间配置资源额度可以有效限制资源滥用,从而保证集群的可靠性。 您可为命名空间配置包括CPU、内存、Pod数量等资源的额度,更多信息请参见Resource Quotas。 其中,不同的集群规模对应的Pod数量推荐值如下: 集群规模 Pod数量推荐值 50节点 2500 Pod实例 200节点 1W Pod实例 1000节点 3W Pod实例 2000节点 5W Pod实例 从1.21版本集群开始,创建命名空间将会同时创建默认的资源配额Resource Quotas,根据集群规格不同,各个资源的配额如表1所示。您可以根据实际需求修改。 表1 默认资源配额 集群规模 Pod Deployment Secret ConfigMap Service 50节点 2000 1000 1000 1000 1000 200节点 2000 1000 1000 1000 1000 1000节点 5000 2000 2000 2000 2000 2000节点 5000 2000 2000 2000 2000
  • 约束与限制 CustomedHPA策略:仅支持1.15及以上版本的集群创建。 每个工作负载只能创建一个策略,即如果您创建了一个HPA策略,则不能再对其创建CustomedHPA策略或其他HPA策略,您可以删除该HPA策略后再创建。 1.19.10以下版本的集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,当新Pod被调度到另一个节点时,会导致之前Pod不能正常读写。 1.19.10及以上版本集群中,如果使用HPA策略对挂载了EVS卷的负载进行扩容,新Pod会因为无法挂载云硬盘导致无法成功启动。
  • HPA工作原理 HPA(Horizontal Pod Autoscaler)是用来控制Pod水平伸缩的控制器,HPA周期性检查Pod的度量数据,计算满足HPA资源所配置的目标数值所需的副本数量,进而调整目标资源(如Deployment)的replicas字段。 想要做到自动弹性伸缩,先决条件就是能感知到各种运行数据,例如集群节点、Pod、容器的CPU、内存使用率等等。而这些数据的监控能力Kubernetes也没有自己实现,而是通过其他项目来扩展Kubernetes的能力,CCE提供Prometheus和Metrics Server插件来实现该能力: Prometheus是一套开源的系统监控报警框架,能够采集丰富的Metrics(度量数据),目前已经基本是Kubernetes的标准监控方案。 Metrics Server是Kubernetes集群范围资源使用数据的聚合器。Metrics Server从kubelet公开的Summary API中采集度量数据,能够收集包括了Pod、Node、容器、Service等主要Kubernetes核心资源的度量数据,且对外提供一套标准的API。 使用HPA(Horizontal Pod Autoscaler)配合Metrics Server可以实现基于CPU和内存的自动弹性伸缩,再配合Prometheus还可以实现自定义监控指标的自动弹性伸缩。 HPA主要流程如图1所示。 图1 HPA流程图
  • 云原生网络2.0网络模型 云原生网络2.0是自研的新一代容器网络模型,深度整合了虚拟私有云VPC的弹性网卡(Elastic Network Interface,简称ENI)和辅助弹性网卡(Sub Network Interface,简称Sub-ENI)的能力,直接从VPC网段内分配容器IP地址,支持ELB直通容器,绑定安全组,绑定弹性公网IP,享有高性能。 图1 云原生网络2.0 说明如下: 节点内Pod间通信:直接通过VPC的弹性网卡/弹性辅助网卡进行流量转发。 跨节点Pod间通信:直接通过VPC的弹性网卡/弹性辅助网卡进行流量转发。
  • 网段规划建议 在集群网络构成中介绍集群中网络地址可分为节点网络、容器网络、服务网络三块,在规划网络地址时需要从如下方面考虑: 三个网段不能重叠,否则会导致冲突。且集群所在VPC下所有子网(包括扩展网段子网)不能和容器网段、服务网段冲突。 保证每个网段有足够的IP地址可用。 节点网段的IP地址要与集群规模相匹配,否则会因为IP地址不足导致无法创建节点。 容器网段的IP地址要与业务规模相匹配,否则会因为IP地址不足导致无法创建Pod。 云原生网络2.0模型下,由于容器网段与节点网段共同使用VPC下的网络地址,建议容器子网与节点子网不要使用同一个子网,否则容易出现IP资源不足导致容器或节点创建失败的情况。 另外云原生网络2.0模型下容器网段支持在创建集群后增加子网,扩展可用IP数量,此时需要注意增加的子网不要与容器网段其他子网存在网络冲突。 图3 网段配置
  • AutoScaler架构 AutoScaler架构如图1所示,主要由以下几个核心模块组成: 图1 AutoScaler架构图 说明如下: Estimator: 负责扩容场景下,评估满足当前不可调度Pod时,每个节点池需要扩容的节点数量。 Simulator: 负责缩容场景下,找到满足缩容条件的节点。 Expander: 负责在扩容场景下,根据用户设置的不同的策略来,从Estimator选出的节点池中,选出一个最佳的选择。当前Expander有多种策略: Random: 随机选择一个节点池,如果用户没有设置的话,默认是Random。 most-Pods: 选择此次扩容后能满足调度最多Pod的节点池,如果有相同的,再随机选择一个。 least-waste: 选择此次扩容完成后,具有最小浪费的CPU或者Mem资源的节点池。 price: 选择此次扩容所需节点金额最小的节点池。 priority: 根据用户自定义的权重,选择权重最高的节点池。 当前CCE提供除Price以外的所有的策略,当前CCE插件默认使用least-waste策略。
  • Autoscaler工作原理 Autoscaler(简称CA)的主要流程包括两部分: ScaleUp流程: CA会每隔10s检查一次所有不可调度的Pod,根据用户设置的策略,选择出一个符合要求的节点组进行扩容。 ScaleDown流程:CA每隔10s会扫描一次所有的Node,如果该Node上所有的Pod Requests少于用户定义的缩容百分比时,CA会模拟将该节点上的Pod是否能迁移到其他节点,如果可以的话,当满足不被需要的时间窗以后,该节点就会被移除。 如上所述,当集群节点处于一段时间空闲状态时(默认10min),会触发集群缩容操作。 当节点存在以下几种状态的pod时,不可缩容: 节点上的pod有设置PodDisruptionBudget,当移除pod不满足对应条件时,节点不会缩容。 节点上的pod由于一些限制,如亲和、反亲和或者taints等,无法调度到其他节点,节点不会缩容。 节点上的pod拥有"cluster-autoscaler.kubernetes.io/safe-to-evict": "false"这个annotations时,节点不缩容。 节点上存在kube-system namespace下的Pod(除kube-system daemonset创建的Pod),节点不缩容。 节点上有非controller(deployment/replica set/job/stateful set)创建的Pod,节点不缩容。
  • 应用场景 对性能要求不高:由于需要额外的VXLAN隧道封装,相对于另外两种容器网络模式,性能存在一定的损耗。大概有5%-15%的性能损失。所以容器隧道网络适用于对性能要求不是特别高的业务场景,比如:web应用、访问量不大的数据中台、后台服务等。 大规模组网:相比VPC路由网络受限于VPC路由条目配额的限制,容器隧道网络没有网络基础设施的任何限制;同时容器隧道网络把广播域控制到了节点级别,容器隧道网络最大可支持2000节点规模。
  • 网络隔离说明 打开网络隔离其实是在这个命名空间下创建一个NetworkPolicy,这个NetworkPolicy选择命名空间下所有的Pod,然后不让其他命名空间的Pod访问。 kind: NetworkPolicyapiVersion: networking.k8s.io/v1metadata: name: deny-default namespace: defaultspec: ingress: - from: - podSelector: {} podSelector: {} # {}表示选择所有Pod NetworkPolicy还可以自定义,具体请参见网络策略(NetworkPolicy)。
  • 容器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 网络模型选择
  • 网段规划建议 在集群网络构成中介绍集群中网络地址可分为节点网络、容器网络、服务网络三块,在规划网络地址时需要从如下方面考虑: 三个网段不能重叠,否则会导致冲突。且集群所在VPC下所有子网(包括扩展网段子网)不能和容器网段、服务网段冲突。 保证每个网段有足够的IP地址可用。 节点网段的IP地址要与集群规模相匹配,否则会因为IP地址不足导致无法创建节点。 容器网段的IP地址要与业务规模相匹配,否则会因为IP地址不足导致无法创建Pod。每个节点上可以创建多少Pod还与其他参数设置相关,具体请参见节点最多可以创建多少个Pod。 如下所示的配置中,集群规模为200节点,容器网络模型为容器隧道网络。 则此时选择节点子网的可用IP数量需要超过200,否则会因为IP地址不足导致无法创建节点。 容器网段为10.0.0.0/16,可用IP数量为65533,这些IP最多能分配到4096个节点上(每个节点单次分配16个IP,具体分配方法请参见容器IP地址管理)。
共100000条