前提条件
已创建集群,具体操作请参见 用户指南 > 集群 > 新建集群 章节。若已有集群,无需重复操作。
集群已安装cube-cluster-autoscaler插件且版本高于1.0.5,可参考 用户指南 > 插件 章节。
创建节点池时开启弹性伸缩,若用已有节点池,编辑开启弹性伸缩
包周期节点池不支持自定义节点弹性伸缩策略
创建/编辑节点弹性伸缩策略
登陆CCE控制台, 点击左侧导航栏中的“集群”,进入集群列表页。
在集群列表中点击需要创建策略的集群,进入集群管理页面。
点击左侧导航栏的“节点池”,进入到节点池列表页
在节点池列表页选择需要创建策略的节点池,点击操作栏的“更多”,点击“弹性伸缩”按钮
在伸缩规则的管理页中点击“+”按钮,添加指标、周期、告警类型的规则
删除节点弹性伸缩策略
登陆CCE控制台, 点击左侧导航栏中的“集群”,进入集群列表页。
在集群列表中点击需要创建策略的集群,进入集群管理页面。
点击左侧导航栏的“节点池”,进入到节点池列表页
在节点池列表页选择需要创建策略的节点池,点击操作栏的“更多”,点击“弹性伸缩”按钮
点击“删除”按钮,删除对应的规则
弹性伸缩策略配置说明
自定义规则
规则类型 | 参数设置 |
---|---|
指标触发 |
|
定时触发 |
|
告警触发 |
|
冷却时间
冷却时间为节点池级别的配置,当上一次触发扩缩之后在冷却时间内即使弹性伸缩条件满足,也不会触发弹性伸缩
YAML样式
kind: HorizontalNodeAutoscaler
apiVersion: autoscaler.ccse.ctyun.cn/v1
metadata:
name: {节点池名称}-{集群Id} // default-a2f1e09a01da444d989f7861a55c1c5e
spec:
disable: false //禁用状态,false表示开启
rules:
- action:
type: ScaleUp //ScaleDown表示缩容,ScaleUp表示扩容
unit: Node //当前仅支持Node
value: 1 //扩缩节点的数量
cronTrigger: //当type为Cron时,传cronTrigger;type为Metric时传metricTrigger;type为Alarm时传alarmTrigger
schedule: 8 17 * * * //定时的cron表达式
disable: false
ruleName: rule04130 //每一个rule的ruleName唯一即可,
type: Cron //策略类型,包括Cron(定时)、Metric(监控)、Alarm(告警)
- action:
type: ScaleUp
unit: Node
value: 1
disable: false //禁用状态
metricTrigger: //type为Metric时传metricTrigger
metricName: cpu_util //指标名称,支持cpu_util、mem_util
metricOperation: gt //gt大于,lt:小于
metricValue: '80' //阈值
ruleName: rule09974
type: Metric
- action:
type: ScaleUp
unit: Node
value: 1
disable: false
alarmTrigger:
evaluationCount: 2 //1-99 ,连续出现n次
fun: avg //avg(平均值)、max(最大值)、min(最小值)
metric: cpu_util //disk_read_bytes_rate(磁盘读速率)、disk_write_bytes_rate(磁盘写速率)、mem_util(内存使用率)、disk_read_requests_rate(磁盘读请求速率)、disk_write_requests_rate(磁盘写请求速率)、net_out_bytes_rate(网络流出速率)、net_in_bytes_rate(网络流入速率)
operator: ge //取值范围:eq:等于。gt:大于。ge:大于等于。lt:小于。le:小于等于
value: '80' //阈值
period: 5m //监控周期
ruleName: rule42857
type: Alarm
targetNodepools:
- default //节点池的名称
coolDown: 3 //冷却时间,单位为min
关键参数说明
参数 | 参数类型 | 是否必填 | 描述 |
---|---|---|---|
spec.coolDown | Integer | 必填 | 冷却时间,单位为min |
spec.disable | Bool | 是 | 伸缩策略开关,会对策略中的所有规则生效 |
spec.rules | Array | 否 | 伸缩策略中的所有规则 |
spec.rules[x].action.type | String | 当spec.rules不为空时必填 | 规则操作类型,当前支持“ScaleUp”、“ScaleDown” |
spec.rules[x].action.unit | String | 当spec.rules不为空时必填 | 规则操作单位,当前仅支持“Node” |
spec.rules[x].action.value | Integer | 当spec.rules不为空时必填 | 规则操作数值 |
spec.rules[x].alarmTrigger | / | 否 | 可选,仅在告警规则中有效 |
spec.rules[x].alarmTrigger.evaluationCount | Integer | 当spec.rules[x].alarmTrigger不为空时必填 | 告警规则的连续持续n次,防止抖动,最小为1 |
spec.rules[x].alarmTrigger.fun | String | 当spec.rules[x].alarmTrigger不为空时必填 | avg(平均值)、max(最大值)、min(最小值) |
spec.rules[x].alarmTrigger.metric | String | 当spec.rules[x].alarmTrigger不为空时必填 | 告警规则对应的指标,当前支持 disk_read_bytes_rate(磁盘读速率)、disk_write_bytes_rate(磁盘写速率)、mem_util(内存使用率)、disk_read_requests_rate(磁盘读请求速率)、disk_write_requests_rate(磁盘写请求速率)、net_out_bytes_rate(网络流出速率)、net_in_bytes_rate(网络流入速率) |
spec.rules[x].alarmTrigger.operator | String | 当spec.rules[x].alarmTrigger不为空时必填 | 告警规则的比较符,取值范围:eq:等于。gt:大于。ge:大于等于。lt:小于。le:小于等于 |
spec.rules[x].alarmTrigger.period | String | 当spec.rules[x].alarmTrigger不为空时必填 | 告警规则的监控周期,支持5m、20m、1h、4h、12h、24h |
spec.rules[x].alarmTrigger.value | String | 当spec.rules[x].alarmTrigger不为空时必填 | 告警规则的阈值,支持1-100之间的所有整数,需以字符串表示; |
spec.rules[x].cronTrigger | / | 否 | 可选,仅在周期规则中有效 |
spec.rules[x].cronTrigger.schedule | String | 当spec.rules[x].cronTrigger不为空时必填 | 周期规则的cron表达式 |
spec.rules[x].disable | Bool | 当spec.rules不为空时必填 | 规则开关,当前仅支持“false” |
spec.rules[x].metricTrigger | / | 否 | 可选,仅在指标规则中有效 |
spec.rules[x].metricTrigger.metricName | String | 当spec.rules[x].metricTrigger不为空时必填 | 指标规则对应的指标,当前支持“Cpu”和“Memory”两种类型 |
spec.rules[x].metricTrigger.metricOperation | String | 当spec.rules[x].metricTrigger不为空时必填 | 指标规则的比较符,当前仅支持“gt”、“lt” |
spec.rules[x].metricTrigger.metricValue | String | 当spec.rules[x].metricTrigger不为空时必填 | 指标规则的阈值,支持1-100之间的所有整数,需以字符串表示; |
spec.rules[x].ruleName | String | 当spec.rules不为空时必填 | 规则名称,单个策略中唯一 |
spec.rules[x].type | String | 当spec.rules不为空时必填 | 规则类型,当前支持“Cron”、“Metric”、"Alarm"两种类型 |
spec.targetNodepools | Array | 必填 | 伸缩策略关联的节点池 |
spec.targetNodepools[x] | String | 必填 | 伸缩策略关联节点池名称 |
注意事项
单一规格的ECS库存容量波动较大,建议在伸缩组中配置库存充裕的实例规格,提高节点伸缩成功率。
由于节点标签和污点配置映射到伸缩组Tag后自动伸缩才可识别,并且伸缩组Tag有数目上限限制,开启自动伸缩的节点池配置的ECS标签、污点和节点标签的总数需要控制在一定数量之内。
自动伸缩的节点池避免手动干预,经过弹性伸缩的ECS在移出节点池后,但在伸缩组中还存在,缩容时也会缩该节点。
常见问题
为什么节点自动伸缩组件无法弹出节点?
请检查是否存在如下几种场景:
1、配置伸缩组的实例规格无法满足Pod的资源申请(Request)。或者实例规则是已售罄的规格,实际运行时请考虑以下资源预留。
在创建实例的过程中因为虚拟化、OS占用掉一部分。
需要占用一定的节点资源来运行相关组件(例如kubelet、kube-proxy、calico、Container Runtime等)。
默认节点会安装系统组件,Pod的申请资源要小于实例的规格。
2、开启自动伸缩的节点池中出现如下异常情况。
实例未加入到集群且超时。
节点未ready且超时。
为保证后续扩缩准确性,弹性插件以阻塞方式处理异常情况,在处理完异常情况节点前,不进行扩缩容。
为什么节点自动伸缩组件无法缩容节点?
请检查是否存在如下几种场景:
节点Pod的资源申请(Request)阈值高于设置的缩容阈值。
节点上运行kube-system命名空间的Pod。
节点上的Pod包含强制的调度策略,导致其他节点无法运行此Pod。
节点上的Pod拥有PodDisruptionBudget,且到达了PodDisruptionBudget的最小值。
多个伸缩组在弹性伸缩的时候是如何被选择的?
在Pod处在无法调度时,会触发弹性伸缩组件的模拟调度逻辑,会根据伸缩组配置的标签和污点以及实例规格等信息进行判断。当配置的伸缩组可以模拟调度Pod的时候,就会被选择进行节点弹出。当同时有多个伸缩组满足模拟调度条件的时候,根据配置的策略选择。默认采用的是最少浪费原则,即根据模拟弹出后节点上剩余的资源最小为原则进行抉择。