CCE 集群节点弹性伸缩
概述
CCE 集群由一组节点提供 CPU、内存、磁盘等计算资源。业务负载增长或出现流量峰值时,固定规模的集群可能因资源不足导致 Pod 无法调度;业务负载下降后,长期保留空闲节点又会增加资源成本。
开启节点弹性伸缩后,CCE 会根据集群中的 Pod 调度状态和已配置的伸缩规则,自动增加或减少节点组中的节点。您可以通过最小节点数和最大节点数限定每个节点组的伸缩范围,并通过集群级弹性伸缩规则统一控制扩容节点组的选择方式、检查周期和自动缩容行为。
配置作用范围
- 节点组级配置:是否开启弹性伸缩、最小节点数、最大节点数、扩容优先级、扩容机型和子网等。每个节点组单独配置。
- 集群级配置:节点组扩容顺序策略、弹性灵敏度、自动缩容及缩容参数。在集群中统一配置,对集群内所有开启弹性伸缩的节点组生效。
前提条件
- 已创建并可访问集群 ID 以
cce-开头的 CCE 集群。 - 已具备集群查看、节点组管理和弹性伸缩配置权限。
- 账号状态正常,且资源配额和余额能够满足扩容需要。自动扩容会创建云服务器等资源并产生相应费用。
- 如需使用
kubectl查看伸缩组件状态或日志,已获取目标集群的kubeconfig,并能够连接集群。
工作原理
自动扩容
当集群中存在因 CPU、内存等资源不足而无法调度的 Pod 时,弹性伸缩组件会检查已开启弹性伸缩的节点组。对于节点数尚未达到最大节点数、且新增节点能够承载待调度 Pod 的节点组,组件根据集群级“节点组扩容顺序策略”选择目标节点组并发起扩容。
扩容是否成功还取决于账号余额、资源配额、云服务器库存、子网可用 IP 数量、安全组配额等基础资源条件。
自动缩容
开启自动缩容后,弹性伸缩组件会定期评估节点的资源请求率。当节点持续满足缩容阈值和缩容触发时延,且节点上的 Pod 可以迁移到其他节点时,CCE 会对节点执行排水并缩减节点组规模。
即使节点资源请求率低于阈值,存在以下情况时也可能不会缩容:
- 缩容后节点组节点数将低于最小节点数。
- 节点上的 Pod 无法调度到其他节点。
- 节点开启了缩容保护,或设置了
cluster-autoscaler.kubernetes.io/scale-down-disabled: "true"注解。 - 节点仍处于静默时间内。
- 节点包含当前“不缩容节点”规则要求跳过的 Pod。
- 最近发生扩容失败、缩容操作或其他需要等待的伸缩活动。
弹性伸缩根据 Pod 的资源请求量(Request)进行判断,而不是根据节点的实时 CPU、内存使用率判断。请为业务 Pod 合理配置
requests。
核心概念
| 概念 | 作用范围 | 说明 |
|---|---|---|
| 节点组(伸缩组) | 节点组级 | 具有相同节点配置的一组节点。CCE 以节点组为单位执行自动扩容和自动缩容。本文中的“节点组”和“伸缩组”含义相同。 |
| 最小节点数(min) | 节点组级 | 自动缩容后,该节点组保留的节点数不会低于此值。 |
| 最大节点数(max) | 节点组级 | 自动扩容后,该节点组的节点数不会高于此值。 |
| 节点组扩容顺序策略 | 集群级 | 多个节点组均满足扩容条件时,用于选择目标节点组。 |
| 弹性灵敏度 | 集群级 | 弹性伸缩组件检查集群是否需要扩缩容的时间间隔。 |
| 缩容阈值 | 集群级 | 节点 CPU、内存等资源的请求量与可分配资源量之比持续低于该阈值时,节点可能进入缩容流程。 |
| 缩容触发时延 | 集群级 | 节点持续满足缩容阈值后,触发缩容前需要等待的时间。 |
| 静默时间 | 集群级 | 节点扩容完成后,重新参与缩容评估前需要等待的时间。历史文档中的“扩容后缩容启动间隔”指此配置。 |
| 最大并发缩容数 | 集群级 | 一次允许并发缩容的最大节点数。 |
开通弹性伸缩
首次使用节点组弹性伸缩时,需要先完成服务授权。
- 登录 容器引擎 CCE 控制台。
- 进入集群 ID 以
cce-开头的目标集群。 - 在左侧导航栏选择“节点管理 > 节点组”。
- 在“弹性伸缩规则”区域单击“授权开通弹性伸缩”,按页面提示完成授权。
您也可以在首次创建节点组并开启弹性伸缩时,根据页面提示完成授权。
配置节点组级弹性伸缩
节点组级配置决定某个节点组是否参与弹性伸缩,以及该节点组允许伸缩的节点数量范围。
- 登录 容器引擎 CCE 控制台,进入目标集群。
- 在左侧导航栏选择 “节点管理 > 节点组”。
- 新建节点组,或编辑已有节点组。
- 开启“弹性伸缩”。
- 配置节点组级参数并保存。
| 配置项 | 说明 |
|---|---|
| 弹性伸缩 | 开启后,该节点组参与集群节点弹性伸缩。若期望节点数大于 0,则不支持同时开启弹性伸缩。 |
| 最小节点数 | 节点组自动缩容后的节点数下限。请结合高可用要求和常驻工作负载设置。 |
| 最大节点数 | 节点组自动扩容后的节点数上限。请结合资源配额、成本预算和业务峰值设置。 |
| 扩容优先级 | 集群级“节点组扩容顺序策略”选择“优先级策略”时生效。取值范围为 0~100,数值越大,优先级越高。 |
| 机型配置顺序 | 当前节点组扩容时,按照主机型和备选机型的配置顺序尝试创建节点。该配置只决定同一节点组内使用哪种机型。 |
| 多子网均匀分布 | 配置多个子网时,尽最大努力在指定可用区或子网间均匀分配新增节点。 |
“机型配置顺序”和“节点组扩容顺序策略”的作用不同:前者在一个节点组内选择机型,后者在多个可扩容节点组之间选择目标节点组。 自动扩容会创建云服务器等资源,并根据实际创建结果产生费用。保存前请确认资源配额、库存和成本预算。
配置集群级弹性伸缩规则
集群级规则对集群中所有开启弹性伸缩的节点组生效。
- 登录 容器引擎 CCE 控制台,进入目标集群。
- 在左侧导航栏选择 “节点管理 > 节点组”。
- 在“弹性伸缩规则”区域单击“编辑”。
- 配置以下参数并保存。
基础规则
| 配置项 | 说明 |
|---|---|
| 节点组扩容顺序策略 | 节点组弹性扩容时所采用的扩容算法类型,包括:
|
| 弹性灵敏度 | 用于判断集群弹性伸缩的时间间隔,支持取值:10s、15s、30s、60s、120s、180s 和 300s。默认是60s。 |
| 自动缩容 | 是否开启节点的自动缩容: |
自动缩容规则
| 配置项 | 说明 |
|---|---|
| 非 GPU 节点的缩容阈值 | 当非 GPU 类型节点的 CPU、内存资源请求率(单资源请求量÷单资源总量*100%)低于该阈值时,可能会触发自动缩容。默认 50%。 |
| GPU 节点的缩容阈值 | GPU 类型节点的缩容策略根据其是否使用 mGPU 能力,有不同的缩容策略,默认阈值为 30%。 |
| 利用率计算忽略命名空间 | 计算节点 CPU、GPU 资源利用率时,忽略已选命名空间下所有 Pod 的资源占用,仅以业务 Pod 负载判断节点空闲,提升缩容精准度。支持从集群命名空间中多选。 |
| 缩容触发时延 | 当节点资源请求率低于阈值,并持续该时间段后,集群将触发自动缩容。默认 10 分钟。 |
| 静默时间 | 节点进行扩容后,能再次执行缩容所需等待的时间间隔。默认 10 分钟。 |
| 节点缩容批量执行间隔 | 控制批量缩容节点时相邻缩容操作的执行间隔,单位为秒。默认值为 0 秒。支持输入 0 或正整数,取值范围为 0~600。 |
| 最大并发缩容数 | 节点缩容时,允许同时进行缩容的并发数目。默认 10。 |
| Pod终止超时时间 | 节点排水时等待 Pod 终止的最大等待时间。整数形式,取值范围为 1~10000,单位为秒。默认为 600 秒。 |
| Pod最小副本数 | 节点排水时允许存在的最小 Pod 数量。整数形式,取值范围为 1~10000。默认为 0。 |
| 开启 Daemonset 排水 | 节点缩容前是否驱逐节点上 DaemonSet 类型的 Pod。 |
| 不缩容节点 | 勾选不进行缩容的节点。可选项如下: |

修改节点组或集群级伸缩规则后,伸缩组件可能重启并重新评估节点。配置不会保证立即触发扩容或缩容,实际执行还取决于扫描周期、静默时间、Pod 调度条件和基础资源状态。
验证弹性伸缩
查看伸缩活动
- 在集群左侧导航栏选择“节点管理 > 节点组”。
- 单击目标节点组名称。
- 在“伸缩活动”页签查看伸缩节点数量、活动状态和失败原因。
查看伸缩组件状态
已使用 kubectl 连接集群时,执行以下命令查看组件状态:
1kubectl get configmap cluster-autoscaler-status -n kube-system -o yaml
执行以下命令查看自动伸缩日志:
1kubectl logs $(kubectl get pods -n kube-system | grep cluster-autoscaler | awk '{print $1}') -n kube-system -f
使用指定节点组承载业务
调度 Pod 到指定节点组
- 在创建或编辑节点组时,展开“高级设置(节点)”,为节点组配置用于调度的标签键和值。
- 创建 Pod 时,通过
nodeSelector或nodeAffinity指定相同的节点标签。 - 确保标签、污点和容忍、亲和性、资源请求等全部调度条件能够被目标节点组满足。
当目标节点组当前节点数为 0 时,只要待调度 Pod 的调度条件与该节点组匹配,且节点组尚未达到最大节点数,弹性伸缩组件即可评估是否扩容该节点组。
使用 GPU 节点组
- 创建 GPU 类型的节点组,并开启弹性伸缩。
- 根据业务需求配置 GPU 机型、驱动和相关组件。
- 在 Pod 的
requests和limits中通过nvidia.com/gpu声明所需 GPU 卡数。GPU 卡数仅支持整数。
请确保 GPU 节点组的最大节点数大于当前节点数,并确认目标地域和可用区有对应 GPU 机型库存。
常见问题
什么情况下会触发自动扩容?
同时满足以下主要条件时,集群可能触发自动扩容:
- 集群中存在因 CPU、内存等资源不足而处于 Pending 状态的 Pod。
- 至少有一个开启弹性伸缩的节点组能够满足该 Pod 的调度条件。
- 目标节点组的节点数尚未达到最大节点数。
- 账号余额、资源配额、云服务器库存、子网 IP 等基础资源满足扩容要求。
如果 Pod 因镜像拉取、存储挂载、准入策略等非节点资源原因处于 Pending 状态,增加节点通常不能解决问题。
为什么节点组无法缩容到 0?
可能原因包括:
- 节点组的最小节点数大于 0。
- 节点上存在无法迁移的 Pod。
- 伸缩组件或其他系统组件运行在该节点上,且无法迁移到其他节点。
- 节点开启了缩容保护或命中了“不缩容节点”规则。
- 调整配置后伸缩组件正在重启或重新评估节点。
为什么新扩容的节点不会立即缩容?
新扩容节点需要等待“静默时间”结束后才会参与缩容评估。默认静默时间为 10 分钟;如果已修改配置,以控制台当前配置为准。
为什么修改配置后没有立即生效?
修改节点组配置或集群级缩容规则后,伸缩组件可能重启并重新评估已有节点。节点还需满足弹性灵敏度、缩容触发时延和静默时间等条件,因此配置保存后不一定立即发生伸缩活动。
为什么节点满足缩容阈值和缩容触发时延,仍未被缩容?
按以下顺序排查:
- 检查节点组是否已达到最小节点数。
- 检查节点上的 Pod 是否可以调度到其他节点,包括资源、亲和性、反亲和性、污点和容忍、拓扑约束等条件。
- 检查节点是否开启缩容保护,或是否设置
cluster-autoscaler.kubernetes.io/scale-down-disabled: "true"注解。 - 检查节点是否仍处于静默时间内。
- 检查是否命中包含本地存储 Pod、
kube-system非 DaemonSet Pod 等“不缩容节点”规则。 - 检查近期是否有扩容失败、缩容活动或组件重启。
- 查看节点组“伸缩活动”的失败原因,并结合伸缩组件状态和日志进一步排查。
CCE 托管弹性伸缩组件的启动参数由平台管理。scale-down-delay-after-add、scale-down-delay-after-failure、scale-down-delay-after-delete 和 scan-interval 等参数用于解释组件工作原理;请通过控制台开放的弹性伸缩规则调整对应行为,不要直接修改托管组件启动参数。控制台未提供的参数当前不支持用户配置。
为什么伸缩组件显示的资源使用率与自行计算的结果不同?
CCE 会为操作系统和 Kubernetes 组件预留部分节点资源。弹性伸缩组件基于节点可分配资源(Allocatable)以及 Pod 的资源请求量(Request)计算资源请求率,而不是直接使用云服务器标称资源或实时监控使用率,因此结果可能与自行计算的值不同。
注意事项
- 自动扩容会创建云服务器等资源并产生费用;自动缩容会释放节点资源。请合理设置最小节点数、最大节点数和成本告警。
- 自动缩容前会对节点执行排水。请为工作负载配置合理的副本数、PodDisruptionBudget、终止宽限期和跨节点调度策略,避免缩容影响业务可用性。
- 使用本地存储、严格节点亲和性、特定可用区资源或独占 GPU 的 Pod 可能限制节点缩容。
- 弹性伸缩依赖 Pod 的资源请求量。未配置或配置不合理的
requests可能导致扩缩容结果不符合预期。 - 节点组级配置只影响当前节点组;集群级弹性伸缩规则影响集群中所有已开启弹性伸缩的节点组。修改集群级规则前,请评估对全部节点组的影响。
评价此篇文章
