概述
在一些复杂的业务场景下,可能有固定时间段高峰业务,又有日常突发高峰业务。此种情况下,用户既期望能定时弹性伸缩应对固定时间段高峰业务,又期望能根据指标弹性伸缩应对日常突发高峰业务。CCE提供CronHPA的自定义资源,实现在固定时间段对集群进行扩缩容,并且可以和HPA策略共同作用,定时调整HPA伸缩范围,实现复杂场景下的工作负载伸缩。

CronHPA支持定时调整HPA策略的最大和最小实例数,也可以直接定时调整Deployment的Pod实例数。
CronHPA的YAML示例如下:
apiVersion: autoscaling.cce.io/v2alpha1 
kind: CronHorizontalPodAutoscaler 
metadata: 
  name: ccetest 
  namespace: default 
spec: 
   scaleTargetRef:                  # 关联HPA策略或Deployment 
      apiVersion: autoscaling/v1 
      kind: HorizontalPodAutoscaler 
      name: hpa-test 
   rules: 
   - ruleName: "scale-down"   
     schedule: "15 * * * *"         # 指定任务运行时间与周期,参数格式请参见Cron,例如0 * * * * 或@hourly。 
     targetReplicas: 1              # 目标实例数量 
     disable: false 
   - ruleName: "scale-up" 
     schedule: "13 * * * *" 
     targetReplicas: 6 
     disable: false
表 CronHPA关键字段说明
| 字段 | 说明 | 
|---|---|
| apiVersion | API版本,固定值“autoscaling.cce.io/v2alpha1”。 | 
| kind | API类型,固定值“CronHorizontalPodAutoscaler”。 | 
| metadata.name | CronHPA策略名称。 | 
| metadata.namespace | CronHPA策略所在的命名空间。 | 
| spec.scaleTargetRef | 指定CronHPA的扩缩容对象,可配置以下字段: apiVersion:CronHPA扩缩容对象的API版本。 kind:CronHPA扩缩容对象的API类型。 name:CronHPA扩缩容对象的名称。CronHPA支持HPA策略或Deployment。 | 
| spec.rules | CronHPA策略规则,可添加多个规则。每个规则可配置以下字段: ruleName:CronHPA规则名称,该名称需唯一。 schedule:指定任务运行时间与周期,参数格式与CronTab类似,请参见Cron,例如0 * * * * 或@hourly。 targetReplicas:扩缩容的Pod数目。 disable:参数值为“true”或“false”。其中“false”表示该规则生效,“true”则表示该规则不生效。 | 
前提条件
已安装1.2.13及以上版本cce-hpa-controller。
使用CronHPA调整HPA伸缩范围
CronHPA支持定时调整HPA策略的最大和最小实例数,满足复杂场景下的工作负载伸缩。
由于HPA与CronHPA均通过scaleTargetRef字段来获取伸缩对象,如果CronHPA和HPA同时设置Deployment为伸缩对象,两个伸缩策略相互独立,后执行的操作会覆盖先执行的操作,导致伸缩效果不符合预期,因此需避免这种情况发生。

当CronHPA与HPA兼容使用时,需要将CronHPA中的scaleTargetRef字段设置为HPA策略,而HPA策略的scaleTargetRef字段设置为Deployment,这样CronHPA策略会在固定的时间调整HPA策略的实例数量上下限,即可实现工作负载定时伸缩和弹性伸缩的兼容。
步骤 1 为Deployment创建HPA策略。
apiVersion: autoscaling/v1 
kind: HorizontalPodAutoscaler 
metadata: 
  name: hpa-test 
  namespace: default 
spec: 
  maxReplicas: 10               #  最大实例数 
  minReplicas: 5               #  最小实例数 
  scaleTargetRef:              #  关联Deployment 
    apiVersion: apps/v1 
    kind: Deployment 
    name: nginx 
  targetCPUUtilizationPercentage: 50
步骤 2 创建CronHPA策略,并关联步骤1中创建的HPA策略。
apiVersion: autoscaling.cce.io/v2alpha1 
kind: CronHorizontalPodAutoscaler 
metadata: 
  name: ccetest 
  namespace: default 
spec: 
   scaleTargetRef:                  # 关联HPA策略 
      apiVersion: autoscaling/v1 
      kind: HorizontalPodAutoscaler 
      name: hpa-test 
   rules: 
   - ruleName: "scale-down"   
     schedule: "15 * * * *"         # 指定任务运行时间与周期,参数格式请参见Cron,例如0 * * * * 或@hourly。 
     targetReplicas: 1              # 目标实例数量 
     disable: false 
   - ruleName: "scale-up" 
     schedule: "13 * * * *" 
     targetReplicas: 11 
     disable: false
在CronHPA与HPA共同使用时,CronHPA规则是在HPA策略的基础上生效的,CronHPA不会直接调整Deployment的副本数目,而是通过HPA来操作Deployment,因此了解以下参数可帮助您更好地理解其工作原理。
- CronHPA的目标实例数(targetReplicas):表示CronHPA设定的实例数,在CronHPA生效时用于调整HPA的最大/最小实例数,从而间接调整Deployment实例数。
- HPA的最小实例数(minReplicas):Deployment的实例数下限。
- HPA的最大实例数(maxReplicas):Deployment的实例数上限。
- Deployment的实例数(replicas):CronHPA策略生效之前Deployment的Pod数量。
在CronHPA规则生效时,通过比较目标实例数(targetReplicas)与实际Deployment的实例数,并结合HPA的最小实例数或最小实例数的数值大小,来调整Deployment实例数的上下限值。
图 CronHPA扩缩容场景

上图为可能存在的扩缩容场景,如下表格以举例的形式说明了不同场景下CronHPA修改HPA的情况。
| 场景 | 场景说明 | Cronhpa (targetReplicas) | Deployment (replicas) | HPA (minReplicas / maxReplicas) | 最终结果 | 操作说明 | 
|---|---|---|---|---|---|---|
| 场景一 | targetReplicas< minReplicas ≤ replicas ≤ maxReplicas | 4 | 5 | 5/10 | HPA: 4/10 Deployment: 5 | CronHPA目标实例数低于HPA最小实例数(minReplicas)时: 修改HPA的最小实例数。 Deployment实例数无修改。 | 
| 场景二 | targetReplicas= minReplicas ≤ replicas ≤ maxReplicas | 5 | 6 | 5/10 | HPA: 5/10 Deployment: 6 | CronHPA目标实例数等于HPA最小实例数(minReplicas)时: HPA的最小实例数无修改。 Deployment实例数无修改。 | 
| 场景三 | minReplicas < targetReplicas< replicas ≤ maxReplicas | 4 | 5 | 1/10 | HPA: 4/10 Deployment: 5 | CronHPA目标实例数大于HPA最小实例数(minReplicas), 小于Deployment实例数(replicas)时: 修改HPA的最小实例数。 Deployment实例数无修改。 | 
| 场景四 | minReplicas < targetReplicas = replicas < maxReplicas | 5 | 5 | 1/10 | HPA: 5/10 Deployment: 5 | CronHPA目标实例数大于HPA最小实例数(minReplicas), 等于Deployment实例数(replicas)时: 修改HPA的最小实例数。 Deployment实例数无修改。 | 
| 场景五 | minReplicas ≤ replicas < targetReplicas < maxReplicas | 6 | 5 | 1/10 | HPA: 6/10 Deployment: 6 | CronHPA目标实例数大于Deployment实例数(replicas), 小于HPA最大实例数(maxReplicas)时: 修改HPA的最小实例数。 修改Deployment实例数。 | 
| 场景六 | minReplicas ≤ replicas < targetReplicas = maxReplicas | 10 | 5 | 1/10 | HPA: 10/10 Deployment: 10 | CronHPA目标实例数大于Deployment实例数(replicas), 等于HPA最大实例数(maxReplicas)时: 修改HPA的最小实例数。 修改Deployment实例数。 | 
| 场景七 | minReplicas ≤ replicas ≤ maxReplicas < targetReplicas | 11 | 5 | 5/10 | HPA: 11/11 Deployment: 11 | CronHPA目标实例数大于HPA最大实例数(maxReplicas)时: 修改HPA的最小实例数。 修改HPA的最大实例数。 修改Deployment实例数。 | 
使用CronHPA直接调整Deployment实例数量
CronHPA还可以单独调整关联Deployment,定时调整Deployment的实例数,使用方法如下。
piVersion: autoscaling.cce.io/v2alpha1 
kind: CronHorizontalPodAutoscaler 
metadata: 
  name: ccetest 
  namespace: default 
spec: 
   scaleTargetRef:             # 关联Deployment 
      apiVersion: apps/v1 
      kind: Deployment 
      name: nginx 
   rules: 
   - ruleName: "scale-down" 
     schedule: "08 * * * *"    # 指定任务运行时间与周期,参数格式请参见Cron,例如0 * * * * 或@hourly。 
     targetReplicas: 1 
     disable: false 
   - ruleName: "scale-up" 
     schedule: "05 * * * *" 
     targetReplicas: 3 
     disable: false
