容器定时水平伸缩(CronHPA)
更新时间:2025-03-17
对于某些可预知的业务情形,可提前设置好定时伸缩任务,在业务波峰来临之前扩容工作容器,可以减少运维人员的工作量。目前CCE支持对Deployment、StatefulSet设置定时伸缩任务,同时支持定时伸缩与HPA结合使用,极大扩展了弹性伸缩的应用场景。
前提条件
- 已创建 CCE 集群,具体操作请参见 创建CCE集群。
- 已安装CCE-CronHPA-Controller组件,具体操作请参见CCE CronHPA Controller 说明。
操作步骤
通过控制台使用CronHPA
方式一:为已有工作负载开启CronHPA
- 登录百度智能云管理控制台,进入产品服务 > 云原生 > 容器引擎 CCE,单击集群管理 > 集群列表,单击目标集群名称,进入"集群详情"页,在侧边栏单击自动伸缩 > 定时伸缩(CronHPA)。
- 在定时水平伸缩列表页面单击创建定时水平伸缩操作。
-
在“创建定时水平伸缩”页面配置伸缩配置。
配置项 必选/可选 配置说明 名称 必选 指定定时水平伸缩的名称,长度为1-63个字符,只能包含数字、小写字母、和“-”,且必须以字母开头,数字或字母结尾。 命名空间 必选 选择定时水平伸缩所在的命名空间。 关联对象类型 必选 支持为Deployment、StatefulSet以及水平伸缩HPA设置定时水平伸缩。 关联对象 必选 选择需要开启的Deployment、StatefulSet以及水平伸缩HPA的资源。 定时任务 必选 配置定时执行伸缩规则的策略,支持添加多个定时任务。
名称:指定定时任务的名称,长度为1-63个字符,只能包含数字、小写字母、和“-”,且必须以字母开头,数字或字母结尾。
定时规则:输入定时规则,格式:秒 分 时 天 月 周(如:1 2 3 4 * * 表示每月4日3点2分1秒执行一次伸缩任务),更多信息请见go-cron。
单词执行:配置是否开启定时任务仅支持一次,若勾选则该任务仅执行一次。目标副本数:指定伸缩的Pod实例数。任务跳过时间 可选 设置任务不执行时间规则,当匹配到该时间时不触发定时任务,格式为 秒 分 时 天 月 周,最小单位为天。 - 单击确定,即可完成创建。
方式二:在创建工作负载过程中开启CronHPA
当前以创建无状态部署为例:
- 登录百度智能云管理控制台,进入产品服务>云原生>容器引擎 CCE,单击集群管理>集群列表,单击目标集群名称,进入"集群详情"页,在侧边栏单击工作负载>无状态部署。
- 在"无状态部署"页面单击新建无状态部署操作。
-
在“新建无状态部署-高级设置”页面勾选定时水平伸缩为该工作负载开启水平伸缩CronHPA。
配置项 必选/可选 配置说明 名称 必选 指定定时水平伸缩的名称,长度为1-63个字符,只能包含数字、小写字母、和“-”,且必须以字母开头,数字或字母结尾。 命名空间 必选 选择定时水平伸缩所在的命名空间。 关联对象类型 必选 支持为Deployment、StatefulSet以及水平伸缩HPA设置定时水平伸缩。 关联对象 必选 选择需要开启的Deployment、StatefulSet以及水平伸缩HPA的资源。 定时任务 必选 配置定时执行伸缩规则的策略,支持添加多个定时任务。
名称:指定定时任务的名称,长度为1-63个字符,只能包含数字、小写字母、和“-”,且必须以字母开头,数字或字母结尾。
定时规则:输入定时规则,格式:秒 分 时 天 月 周(如:1 2 3 4 * * 表示每月4日3点2分1秒执行一次伸缩任务),更多信息请见go-cron。
单词执行:配置是否开启定时任务仅支持一次,若勾选则该任务仅执行一次。目标副本数:指定伸缩的Pod实例数。任务跳过时间 可选 设置任务不执行时间规则,当匹配到该时间时不触发定时任务,格式为 秒 分 时 天 月 周,最小单位为天。 - 单击完成,一个支持CronHPA的无状态部署就已配置完成。
通过kubectl命令使用CronHPA
以下是一个具体的CronHPA示例:
apiVersion: cce.baidubce.com/v1
kind: CronHPA
metadata:
name: cronhpa-sample
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment-basic
excludeDates:
- "* * * 15 11 *"
- "* * * 1 11 *"
crons:
- name: "scale-down"
schedule: "30 */1 * * * *"
targetSize: 1
runOnce: true
- name: "scale-up"
schedule: "01 */1 * * * *"
targetSize: 3
部署参数介绍
名称 | 作用 | 是否必须 |
---|---|---|
spec.scaleTargetRef | 期望扩缩容对象的元数据 | 必须 |
crons.name | 任务名称 | 必须 |
crons.schedule | 任务触发的时间 | 必须 |
crons.runOnce | 任务单次执行 | 可选 |
crons.targetSize | 期望副本数 | 必须 |
spec.excludeDates | 任务不触发的时间 | 可选 |
其中schedule
同excludeDates
需要按照如下格式配置:
字段名称 | 是否必填 | 允许值 | 允许的特殊字符 |
---|---|---|---|
Seconds | 是 | 0-59 | */,- |
Minutes | 是 | 0-59 | */,- |
Hours | 是 | 0-23 | */,- |
Day of month | 是 | 1-31 | */,-? |
Month | 是 | 1-12 或 JAN-DEC | */,- |
Day of week | 是 | 0-6 或 SUN-SAT | */,-? |
特殊字符说明
- 星号 (*) 表示表达式能匹配该字段的所有值。如在第5个字段使用星号(month),表示每个月。
- 斜线(/) 表示增长间隔,如第1个字段(minutes) 值是 3-59/15,表示每小时的第3分钟开始执行一次,之后每隔 15 分钟执行一次(即 3、18、33、48 这些时间点执行),这里也可以表示为:3/15
- 逗号(,) 用于枚举值,如第6个字段值是 MON,WED,FRI,表示 星期一、三、五 执行。
- 连字号(-) 表示一个范围,如第3个字段的值为 9-17 表示 9am 到 5pm 直接每个小时(包括9和17))
- 问号(?) 只用于日(Day of month)和星期(Day of week),\表示不指定值,可以用于代替 *
cron举例说明
- 每隔5秒执行一次:/5 * * * ?
- 每隔1分钟执行一次:0 /1 * * ?
- 每天23点执行一次:0 0 23 * * ?
- 每天凌晨1点执行一次:0 0 1 * * ?
- 每月1号凌晨1点执行一次:0 0 1 1 * ?
- 在26分、29分、33分执行一次:0 26,29,33 * * * ?
- 每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
CronHPA扩缩容Deployment示例
CronHPA要应用在普通工作负载只需要将spec.scaleTargetRef
字段配置成该工作负载的信息,以下是一个具体的CronHPA扩缩容Deployment的示例:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-basic
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: cce.baidubce.com/v1
kind: CronHPA
metadata:
name: cronhpa-sample
spec:
scaleTargetRef: //配置成以上deployment的信息
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment-basic
crons:
- name: "scale-down"
schedule: "30 */1 * * * *"
targetSize: 1
- name: "scale-up"
schedule: "01 */1 * * * *"
targetSize: 3
CronHPA兼容HPA示例
从CronHPA和HPA的模板定义中可以看出:
- CronHPA和HPA都是通过scaleTargetRef字段来获取伸缩对象。
- CronHPA通过jobs的crontab规则定时伸缩副本数。
- HPA通过资源利用率判断伸缩的情况。
如果同时设置CronHPA和HPA,那么会出现CronHPA和HPA同时操作一个scaleTargetRef的场景。CronHPA和HPA相互独立无法感知,后执行的操作会覆盖先执行的操作,例如刚刚定时扩容完成但是又由于资源利用率低被缩容回去了。
所以当期望扩缩容的对象被HPA引用的时候,为了避免HPA与CronHPA的冲突导致结果被覆盖,需要把spec.scaleTargetRef
配置为对应的HPA对象,这样CronHPA能够感知HPA的状态并且通过调整HPA的上下限来调整副本数。
以下是一些兼容CronHPA与HPA来实现定时扩缩容的具体场景示例:
HPA(min/max) | CronHPA | deployment | result | 说明 |
---|---|---|---|---|
1/10 | 5 | 5 | HPA(1/10) deployment 5 | CronHPA期望副本数为固定一致,无需变更 |
1/10 | 4 | 5 | HPA(1/10) deployment 5 | 当前副本数5高于CronHPA期望副本数4,并且期望副本数在区间[1,10]内,无需变更 |
1/10 | 6 | 5 | HPA(6/10) deployment 6 | CronHPA期望副本数6高于当前副本数5,调整HPA下限自动扩容副本数至6 |
5/10 | 4 | 5 | HPA(4/10) deployment 5 | CronHPA期望副本数低于当前副本数5,保留当前副本数 CronHPA期望副本数低于HPA下限,修改HPA下限(保证至少有4个副本) |
5/10 | 11 | 5 | HPA(11/11) deployment 11 | CronHPA期望副本数高于HPA上限,修改HPA下限至CronHPA期望副本数,上限同下限 |
如下是CronHPA兼容HPA具体的yaml示例:
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: nginx-deployment-basic-hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment-basic
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50
---
apiVersion: cce.baidubce.com/v1
kind: CronHPA
metadata:
name: cronhpa-sample
spec:
scaleTargetRef://配置为HPA对象
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
name: nginx-deployment-basic-hpa
crons:
- name: "scale-down"
schedule: "30 */1 * * * *"
targetSize: 5
runOnce: false
- name: "scale-up"
schedule: "01 */1 * * * *"
targetSize: 10
runOnce: false