CCE 集群节点弹性伸缩
概述
本文档介绍 CCE 集群弹性伸缩的功能、核心概念、控制台配置方法和常见问题。
CCE 的运行基于一组百度智能云服务器组成的集群,集群为容器运行提供必要的基础资源,如 CPU、内存和磁盘等。通常,集群规模在创建 CCE 服务时由用户定义,在使用 CCE 过程中也可以随时对集群进行扩容或缩容。但是,当业务增长速度超过预期或出现波动峰值时,集群提供的资源可能不足以支撑服务所需,导致服务运行变慢。
开启 CCE 的自动伸缩功能后,集群会在资源不足时自动创建新节点,在资源富余时自动释放多余节点,从而保障集群资源始终足以支撑业务负载,并尽量节约成本。开启自动伸缩时,还可以设置扩缩容的最大、最小节点数,从而确保扩缩容在预期范围内进行。
前提条件
- 已创建并可访问目标
cce-开头的 CCE 集群。 - 已具备集群查看、节点组管理和弹性伸缩配置权限。
- 若需新建集群或节点组,请确保账号状态正常,且满足所需资源与费用要求;若需查看伸缩组件状态或日志,请已获取目标集群的
kubeconfig并可使用kubectl连接集群。## 概念解释
| 概念 | 说明 |
|---|---|
| 伸缩组 | 指具有相同配置的节点的集合,基于该组的机器配置进行自动扩容、自动缩容 |
| 伸缩组 min | 伸缩组符合缩容条件时,保证缩容后的伸缩组节点数目不低于该值 |
| 伸缩组 max | 伸缩组符合扩容条件时,保证扩容后的伸缩组节点数目不高于该值 |
| 缩容阈值 | 伸缩组内节点资源(cpu、mem)的请求资源(Request)与资源容量(Capacity)的比值均低于设定阈值时,集群可能会触发自动缩容。 |
| 缩容触发时延 | 在配置的缩容触发时延内,节点资源利用率持续低于缩容阈值,集群可能会触发自动缩容。 |
| 最大并发缩容数 | 该值为整数,表示可并发缩容、且资源利用率为 0 的节点数目。 |
| 扩容后缩容启动间隔 | 该值为整数,单位分钟,扩容出来的节点经过此间隔后开始评估是否可以被缩容。 |
| 使用本地存储的pod | 缩容时可选择跳过包含本地存储 pod的节点 |
| kube-system命名空间下的pod | 缩容时可选择跳过kube-system命名空间下的非DaemonSet pod的节点 |
| 弹性灵敏度 | 用于控制集群自动伸缩的检查间隔。 |
集群操作指导(集群 ID 为 cce- 开头)
新建节点组
导航路径:产品服务->云原生->容器引擎 CCE,进入目标 cce- 开头的集群详情页,点击 【节点管理->节点组】。
注意: 新建节点组和自动扩缩容可能产生资源费用,请在操作前确认账号状态、资源配额和业务规划。
- 进入节点组列表页,点击 【新建节点组】。
- 按页面要求配置节点组基础信息、节点规格和节点数量等参数。

开启自动扩缩容
导航路径:产品服务->云原生->容器引擎 CCE,进入目标 cce- 开头的集群详情页,点击 【节点管理->节点组】。
- 在 【新建节点组】 页面找到自动扩缩容相关配置。
- 如果集群尚未开通弹性伸缩,请先完成“配置集群的自动伸缩”中的授权操作。
- 开启自动扩缩容,并按需设置伸缩组的
min、max及相关缩容参数。

配置集群的自动伸缩
导航路径:产品服务->云原生->容器引擎 CCE,进入目标 cce- 开头的集群详情页,点击 【节点管理->节点组】。
- 进入节点组列表页。首次配置时,在“弹性伸缩规则”模块点击 【授权开通弹性伸缩】。

- 授权完成后,点击 【编辑】,按需配置集群级自动伸缩规则。

可重点关注以下配置项:
| 参数 | 必填 | 说明 |
|---|---|---|
| 节点组扩容顺序策略 | 否 | 多个伸缩组同时满足扩容条件时的选择策略。random:随机选择;least-waste:选择部署完 Pending Pod 后空闲 CPU 最少的伸缩组;most-pods:选择能够部署最多 Pod 的伸缩组;priority:选择优先级最高的伸缩组。 |
| 弹性灵敏度 | 否 | 用于控制集群自动伸缩的检查间隔。 |
| 自动缩容 | 否 | 开启后,可继续配置非 GPU 节点缩容阈值、GPU 节点缩容阈值、缩容触发时延、静默时间、最大并发缩容数、Pod 终止超时时间、Pod 最小副本数、是否驱逐 DaemonSet Pod,以及“不缩容节点”规则。 |
更多扩容算法说明可参考:https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#what-are-expanders
自动缩容常见问题
- 什么情况下触发扩容?
- 集群中存在因为资源(cpu、内存)不足而处于pending的pod
- 伸缩组的节点未达到max值
- 为什么有时候伸缩组内节点无法缩容至0?
- 每次修改配置,伸缩组件都会删除、重启,伸缩组组件被调度到伸缩组内的节点时,伸缩组内的该节点不会被缩容。(见问题5)
- 为什么刚扩容出来的机器满足条件不会被缩容?
- 刚扩容出的机器会有10分钟的保护时间,过了十分钟后,才会考虑缩容。
- 为什么修改配置后没有立刻生效?
- 修改配置(组配置、缩容配置)后伸缩组件会重启,伸缩组内已经存在的节点会被标识成刚扩容出来的节点,重新等待10分钟(时间可调节)后,节点才会匹配缩容条件。
- 为什么符合缩容阈值与缩容时间机器没有被缩容?
- 首先判断组内的节点数是否达到设定的min
- 该机器上的pod是否可以调度到其他节点,不能,该机器也不会被缩容
- 是否设置了该节点为不可缩容("cluster-autoscaler.kubernetes.io/scale-down-disabled": "true")
- 这个节点是否是刚扩容出来的节点(-scale-down-delay-after-add,默认设置10分钟,意思是刚扩容出来的节点10分钟内不会被判定缩容)
- 这个组过去3分钟是否出现过扩容失败(--scale-down-delay-after-failure,该参数可设置)
- 是否设置了--scale-down-delay-after-delete(相邻两次缩容的间隔) 和 --scan-interval(扫描间隔)这两个参数
- 如何在集群内查看伸缩组件的状态
- 查看configMap ->
kubectl get configmap cluster-autoscaler-status -n kube-system -o yaml - 查看自动伸缩log ->
kubectl logs $(kubectl get pods -n kube-system | grep cluster-autoscaler | awk '{print $1}') -n kube-system -f
- 为什么伸缩组件显示的使用率跟我计算的不一样?
- CCE会对机器资源进行一定的保留,伸缩组件计算的CPU核数与内存数是用户可分配的资源数
如何调度 Pod 到指定伸缩组?
导航路径:产品服务->云原生->容器引擎 CCE,进入目标集群详情页,点击 【节点管理->节点组】,在创建或编辑节点组时展开 【高级设置(节点)】 并配置 标签。
- 为目标伸缩组添加用于调度的标签键和值。
- 在创建 Pod 时,通过
nodeSelector或nodeAffinity将 Pod 调度到带有该标签的节点组。 - 确保节点标签与 Pod 中的调度条件完全一致。



如何使用 GPU 伸缩组?
导航路径:产品服务->云原生->容器引擎 CCE,在创建集群或创建节点组时,进入节点组配置页面。
- 创建 GPU 类型的伸缩组,并按业务需求配置 GPU 相关参数。
- 在创建 Pod 时,通过
requests、limits中的nvidia.com/gpu字段声明所需的 GPU 卡数;GPU 卡数仅支持整数。



注意事项
- 如果服务无法容忍中断,则不建议使用自动扩缩。因为某些 Pod在缩容时可能在其他节点上重启,可能会导致短暂的中断。
- 不要直接修改属于伸缩组的节点,处于同一个伸缩组的节点应该具有相同的机器配置(cpu、内存..),相同的label,相同的系统pod。
- 判断您的账户支持机器实例数是否在符合设置伸缩组的min/max。
- 创建 Pod 时,请指定
requests字段。 限制伸缩组组件的使用MEM与CPU资源,伸缩组件默认需求内存300m,CPU 0.1 Core, 且未设置资源限制。为保护您的机器资源,如果您的集群规模较大可以带入如下公式,计算伸缩组件配额。 `MEM = job_num10KB + pod_num25KB + 22MB + node_num 200KB ;CPU = 0.5 Core ~ 1 Core`这里计算的是理想状态下最小需求,当集群有大量pod pending、扩容、缩容时可能会额外需求更多CPU、MEM资源。
评价此篇文章
