创建节点伸缩策略
CCE的自动伸缩能力是通过节点自动伸缩组件autoscaler实现的,可以按需弹出节点实例,支持多可用区、多实例规格、多种伸缩模式,满足不同的节点伸缩场景。
当节点伸缩中创建的策略和autoscaler插件中的配置同时生效时(比如不可调度和指标规则同时满足时),将优先执行不可调度扩容。
- 若不可调度执行成功,则会跳过指标规则逻辑,进入下一次循环。
- 若不可调度执行失败,将执行指标规则逻辑。
前提条件
使用节点伸缩功能前,集群中需要安装autoscaler插件,插件版本要求1.13.8及以上。
约束限制
- 弹性伸缩的策略作用在节点池,当节点池中节点为0时,且按CPU/内存弹性伸缩时,不会触发节点伸缩。
- 缩容节点会导致与节点关联的本地持久卷类型的PVC/PV数据丢失,无法恢复,且PVC/PV无法再正常使用。缩容节点时使用了本地持久存储卷的Pod会从缩容的节点上被驱逐,并重新创建Pod,Pod会一直处于pending状态,因为Pod使用的PVC带有节点标签,由于冲突无法调度成功。
- 使用autoscaler插件时,部分污点/注解可能会影响弹性伸缩功能,因此集群中应避免使用以下污点/注解:
- 节点避免使用ignore-taint.cluster-autoscaler.kubernetes.io的污点:该污点作用于节点。由于autoscaler原生支持异常扩容保护策略,会定期评估集群的可用节点比例,非Ready分类节点数统计比例超过45%比例会触发保护机制;而集群中任何存在该污点的节点都将从自动缩放器模板节点中过滤掉,记录到非Ready分类的节点中,进而影响集群的扩缩容。
- Pod避免使用cluster-autoscaler.kubernetes.io/enable-ds-eviction的注解:该注解作用于Pod,控制DaemonSet Pod是否可以被autoscaler驱逐。详情请参见Kubernetes原生的标签、注解和污点。
操作步骤
- 在CCE控制台,单击集群名称进入集群。
- 单击左侧导航栏的“节点伸缩”,进入创建节点伸缩策略页面。
- 若插件名称后方显示“未安装”,请单击插件后方的“安装”,根据业务需求配置插件参数后单击“安装”,等待插件安装完成。
- 若插件名称后方显示“已安装”,则说明插件已安装成功。
- 单击右上角“创建节点伸缩策略”,参照如下参数设置策略。
- 策略名称:新建策略的名称,请自定义。
- 关联节点池:选择要关联的节点池。您可以关联多个节点池,以使用相同的伸缩策略。
- 执行规则:单击“添加规则”,在弹出的添加规则窗口中设置如下参数:
规则名称:请输入规则名称,可自定义。
规则类型:可选择“指标触发”或“周期触发”,两种类型区别如下:
- 指标触发:
触发条件:请选择“CPU分配率”或“内存分配率”,输入百分比的值。该百分比应大于autoscaler插件中配置的缩容百分比。
- 分配率 = 节点池容器组(Pod)资源申请量 / 节点池Pod可用资源量 (Node Allocatable) 。
- 如果多条规则同时满足条件,会有如下两种执行的情况:
如果同时配置了“CPU分配率”和“内存分配率”的规则,两种或多种规则同时满足扩容条件时,执行扩容节点数更多的规则。
如果同时配置了“CPU分配率”和“周期触发”的规则,当达到“周期触发”的时间值时CPU也满足扩容条件时,较早执行的A规则会将节点池状态置为伸缩中状态,导致B规则无法正常执行。待A规则执行完毕,节点池状态恢复正常后,B规则也不会执行。
- 配置了“CPU分配率”和“内存分配率”的规则后,策略的检测周期会因autoscaler每次循环的处理逻辑而变动。只要一次检测出满足条件就会触发扩容(还需要满足冷却时间、节点池状态等约束条件)。
- 周期触发:
触发时间:可选择每天、每周、每月或每年的具体时间点。
执行动作:与上述“触发条件”或“触发时间”相对应,达到触发条件或触发时间值后所要执行的动作。
您可以单击“添加规则”,设置多条节点伸缩策略。您最多可以添加1条CPU使用率指标规则、1条内存使用率指标规则,且规则总数小于等于10条。
- 指标触发:
- 设置完成后,单击“确定”。
缩容说明
节点伸缩策略中不能直接设置缩容策略,您可以在安装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 |