CCE的自动伸缩能力是通过节点自动伸缩组件autoscaler实现的,可以按需弹出节点实例,支持多可用区、多实例规格、多种伸缩模式,满足不同的节点伸缩场景。
当节点伸缩中创建的策略和autoscaler插件中的配置同时生效时(比如不可调度和指标规则同时满足时),将优先执行不可调度扩容。
- 若不可调度执行成功,则会跳过指标规则逻辑,进入下一次循环。
- 若不可调度执行失败,将执行指标规则逻辑。
前提条件
使用节点伸缩功能前,需要安装autoscaler插件,插件版本要求1.13.8及以上。
约束限制
- 仅按需计费节点池支持弹性伸缩。
- 弹性伸缩的策略作用在节点池,当节点池中节点为0时,且按CPU/内存弹性伸缩时,不会触发节点伸缩。
- 缩容节点会导致与节点关联的本地持久存储卷类型的PVC/PV数据丢失,无法恢复,且PVC/PV无法再正常使用。缩容节点时使用了本地持久存储卷的Pod会从缩容的节点上被驱逐,并重新创建Pod,Pod会一直处于pending状态,因为Pod使用的PVC带有节点标签,由于冲突无法调度成功。
操作步骤
步骤 1 在CCE控制台,单击集群名称进入集群。
步骤 2 单击左侧导航栏的“节点伸缩”,进入创建节点伸缩策略页面。
- 若插件名称后方显示“未安装”,请单击插件后方的“安装”,根据业务需求配置插件参数后单击“安装”,等待插件安装完成。
- 若插件名称后方显示“已安装”,则说明插件已安装成功。
步骤 3 单击右上角“创建节点伸缩策略”,参照如下参数设置策略。
- 策略名称:新建策略的名称,请自定义。
- 关联节点池:选择要关联的节点池。您可以关联多个节点池,以使用相同的伸缩策略。
说明节点池新增了优先级功能,弹性扩容时CCE将按照如下策略来选择节点池进行扩容:
1. 通过预判算法判断节点池是否能满足让Pending的Pod正常调度的条件,包括节点资源大于Pod的request值、nodeSelect、nodeAffinity和taints等是否满足Pod正常调度的条件;另外还会过滤掉扩容失败(因为资源不足等原因)还处于15min冷却时间的节点池。
2. 有多个节点池满足条件时,判断节点池设置的优先级(优先级默认值为0,取值范围为0-100,其中100为最高,0为最低),选择优先级最高的节点池扩容。
3. 如果有多个节点池处于相同的优先级,或者都没有配置优先级时,通过最小浪费原则,根据节点池里设置的虚拟机规格,计算刚好能满足Pending的Pod正常调度,且浪费资源最少的节点池。
4. 如果还是有多个节点池的虚拟机规格都一样,只是AZ不同,那么会随机选择其中一个节点池触发扩容。
5. 如果出现优先选择的节点池资源不足,会按照优先级顺序自动选择下一个节点池。
节点池优先级功能详情请参见创建节点池。
- 执行规则:单击“添加规则”,在弹出的添加规则窗口中设置如下参数:
规则名称: 请输入规则名称,可自定义。
规则类型: 可选择“指标触发”或“周期触发”,两种类型区别如下:指标触发:
触发条件:请选择“CPU分配率”或“内存分配率”,输入百分比的值。该百分比应大于autoscaler插件中配置的缩容百分比。
说明
分配率= 节点池容器组(Pod)资源申请量 / 节点池Pod可用资源量 (Node Allocatable) 。
如果多条规则同时满足条件,会有如下两种执行的情况:
如果同时配置了“CPU分配率”和“内存分配率”的规则,两种或多种规则同时满足扩容条件时,执行扩容节点数更多的规则。
如果同时配置了“CPU分配率”和“周期触发”的规则,当达到“周期触发”的时间值时CPU也满足扩容条件时,较早执行的A规则会将节点池状态置为伸缩中状态,导致B规则无法正常执行。待A规则执行完毕,节点池状态恢复正常后,B规则也不会执行。
- 配置了“CPU分配率”和“内存分配率”的规则后,策略的检测周期会因autoscaler每次循环的处理逻辑而变动。只要一次检测出满足条件就会触发扩容(当然还要满足冷却时间、节点池状态等约束条件)。
周期触发:
触发时间:可选择每天、每周、每月或每年的具体时间点,如下图所示,则为每天15:00触发。
图 周期触发时间
执行动作 :与上述“触发条件”或“触发时间”相对应,达到触发条件或触发时间值后所要执行的动作。
您可以单击“添加规则”,设置多条节点伸缩策略。您最多可以添加1条CPU使用率指标规则、1条内存使用率指标规则,且规则总数小于等于10条。
步骤 4 设置完成后,单击“确定”。
缩容说明
节点伸缩策略中不能直接设置缩容策略,您可以在安装autoscaler插件时进行设置。
节点缩容仅支持资源分配率缩容机制,当集群下CPU和内存分配率低于您设置的门限(在安装/编辑autoscaler插件时设置)时将对节点池下节点启动缩容(该功能可以关闭)。
图 自动缩容设置
YAML样例
节点伸缩策略Yaml样例如下:
apiVersion: autoscaling.cce.io/v1alpha1
kind: HorizontalNodeAutoscaler
metadata:
creationTimestamp: "2020-02-13T12:47:49Z"
generation: 1
name: xxxx
namespace: kube-system
resourceVersion: "11433270"
selfLink: /apis/autoscaling.cce.io/v1alpha1/namespaces/kube-system/horizontalnodeautoscalers/xxxx
uid: c2bd1e1d-60aa-47b5-938c-6bf3fadbe91f
spec:
disable: false
rules:
- action:
type: ScaleUp
unit: Node
value: 1
cronTrigger:
schedule: 47 20 * * *
disable: false
ruleName: cronrule
type: Cron
- action:
type: ScaleUp
unit: Node
value: 2
disable: false
metricTrigger:
metricName: Cpu
metricOperation: '>'
metricValue: "40"
unit: Percent
ruleName: metricrule
type: Metric
targetNodepoolIds:
- 7d48eca7-3419-11ea-bc29-0255ac1001a8
表 关键参数说明
参数 | 参数类型 | 描述 |
---|---|---|
spec.disable | Bool | 伸缩策略开关,会对策略中的所有规则生效 |
spec.rules | Array | 伸缩策略中的所有规则 |
spec.rules[x].ruleName | String | 规则名称 |
spec.rules[x].type | String | 规则类型,当前支持“Cron”和“Metric”两种类型 |
spec.rules[x].disable | Bool | 规则开关,当前仅支持“false” |
spec.rules[x].action.type | String | 规则操作类型,当前仅支持“ScaleUp” |
spec.rules[x].action.unit | String | 规则操作单位,当前仅支持“Node” |
spec.rules[x].action.value | Integer | 规则操作数值 |
spec.rules[x].cronTrigger | / | 可选,仅在周期规则中有效 |
spec.rules[x].cronTrigger.schedule | String | 周期规则的cron表达式 |
spec.rules[x].metricTrigger | / | 可选,仅在指标规则中有效 |
spec.rules[x].metricTrigger.metricName | String | 指标规则对应的指标, 当前支持“Cpu”和“Memory”两种类型 |
spec.rules[x].metricTrigger.metricOperation | String | 指标规则的比较符,当前仅支持“>” |
spec.rules[x].metricTrigger.metricValue | String | 指标规则的阈值, 支持1-100之间的所有整数,需以字符串表示 |
spec.rules[x].metricTrigger.Unit | String | 指标规则阈值的单位,当前仅支持“%” |
spec.targetNodepoolIds | Array | 伸缩策略关联的所有节点池 |
spec.targetNodepoolIds[x] | String | 伸缩策略关联节点池的uid |