CCE CronHPA Controller 说明
更新时间:2024-04-24
组件介绍
CCE定时扩缩容管理组件(CCE-CronHPA-Controller)支持用户通过CRD的方式创建定时规则以对工作负载进行扩缩容。对于具有明显周期性负载的应用,可以通过容器定时水平伸缩的方式提供预弹的能力。
组件功能
- 对指定的工作负载副本数进行定时扩缩容
 
使用场景
- 根据预定的时间表来调整集群资源,通过设定一系列的任务,CronHPA可以在预设的时间点自动执行扩容或缩容操作。
 - 保证在用户访问量激增时,系统资源已经按预期配置调整到位,避免因扩容延迟引发的服务中断。
 
使用限制
- 支持v1.16及以上版本的Kubernetes集群
 
安装组件
- 登录百度智能云官网,并进入管理控制台。
 - 选择”产品服务>云原生>容器引擎CCE”,单击进入容器引擎管理控制台。
 - 单击左侧导航栏中的”集群管理>集群列表”。
 - 在集群列表页面中,单击目标集群名称进入集群管理页面。
 - 在集群管理页面单击”组件管理”。
 - 在组件管理列表中选择“CCE CronHPA Controller”组件单击”安装”。
 - 点击“确认”按钮完成组件的安装。
 
部署情况
安装CCE CronHPA Controller组件,将在Kubernetes集群中部署以下对象:
| 对象名称 | 所属namespace | 所占资源 | 类型 | 
|---|---|---|---|
| cronhpas.cce.baidubce.com | kube-system | - | CRD | 
| cce-cronhpa-controller | kube-system | CPU:100m Memory:100Mi | Deployment | 
使用
通过yaml的方式在集群中部署CronHPA,CCE CronHPA Controller监听到CronHPA的创建进行相应的逻辑处理。
CronHPA模版示例
                Plain Text
                
            
            1apiVersion: cce.baidubce.com/v1
2kind: CronHPA
3metadata:
4  name: cronhpa-sample
5spec:
6   scaleTargetRef:
7      apiVersion: apps/v1
8      kind: Deployment
9      name: nginx-deployment-basic
10   excludeDates:
11   - "* * * 15 11 *"
12   - "* * * 1 11 *"
13   crons:
14   - name: "scale-down"
15     schedule: "30 */1 * * * *"
16     targetSize: 1
17     runOnce: true
18   - name: "scale-up"
19     schedule: "01 */1 * * * *"
20     targetSize: 3
            部署参数介绍
| 名称 | 作用 | 是否必须 | 
|---|---|---|
| spec.scaleTargetRef | 期望扩缩容对象的元数据 | 必须 | 
| crons.name | 任务名称 | 必须 | 
| crons.schedule | 任务触发的时间 | 必须 | 
| 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扩缩容普通对象示例
CronHPA要应用在普通工作负载只需要将spec.scaleTargetRef字段配置成该工作负载的信息,以下是一个具体的CronHPA扩缩容Deployment的示例:  
                YAML
                
            
            1---
2apiVersion: apps/v1 
3kind: Deployment
4metadata:
5  name: nginx-deployment-basic
6  labels:
7    app: nginx
8spec:
9  replicas: 2
10  selector:
11    matchLabels:
12      app: nginx
13  template:
14    metadata:
15      labels:
16        app: nginx
17    spec:
18      containers:
19      - name: nginx
20        image: nginx
21        ports:
22        - containerPort: 80
23---
24apiVersion: cce.baidubce.com/v1
25kind: CronHPA
26metadata:
27  name: cronhpa-sample
28spec:
29  scaleTargetRef: //配置成以上deployment的信息
30    apiVersion: apps/v1
31    kind: Deployment
32    name: nginx-deployment-basic
33  crons:
34  - name: "scale-down"
35    schedule: "30 */1 * * * *"
36    targetSize: 1
37  - name: "scale-up"
38    schedule: "01 */1 * * * *"
39    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示例:
                YAML
                
            
            1---
2apiVersion: autoscaling/v1
3kind: HorizontalPodAutoscaler
4metadata:
5  name: nginx-deployment-basic-hpa
6  namespace: default
7spec:
8  scaleTargetRef:
9    apiVersion: apps/v1
10    kind: Deployment
11    name: nginx-deployment-basic
12  minReplicas: 1
13  maxReplicas: 10
14  targetCPUUtilizationPercentage: 50
15---
16apiVersion: cce.baidubce.com/v1
17kind: CronHPA
18metadata:
19  name: cronhpa-sample
20spec:
21  scaleTargetRef://配置为HPA对象
22    apiVersion: autoscaling/v1
23    kind: HorizontalPodAutoscaler
24    name: nginx-deployment-basic-hpa
25  crons:
26    - name: "scale-down"
27      schedule: "30 */1 * * * *"
28      targetSize: 5
29      runOnce: false
30    - name: "scale-up"
31      schedule: "01 */1 * * * *"
32      targetSize: 10
33      runOnce: false
            版本记录
| 版本号 | 适配集群版本 | 更新时间 | 更新内容 | 影响 | 
|---|---|---|---|---|
| 0.1.0 | CCE/v1.16+ | 2024.03.15 | 首次上线 | - | 
