# 创建CronHPA定时策略
在一些复杂的业务场景下，可能有固定时间段高峰业务，又有日常突发高峰业务。此种情况下，用户既期望能定时弹性伸缩应对固定时间段高峰业务，又期望能根据指标弹性伸缩应对日常突发高峰业务。CCE提供CronHPA的自定义资源，实现在固定时间段对集群进行扩缩容，并且可以和HPA策略共同作用，定时调整HPA伸缩范围，实现复杂场景下的工作负载伸缩。
![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000001887065137.png "点击放大")
CronHPA支持定时调整HPA策略的最大和最小实例数，也可以直接定时调整Deployment的Pod实例数。
#### 前提条件
集群中已安装[CCE容器弹性引擎插件](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0240.html)插件。
 #### 使用CronHPA调整HPA伸缩范围
CronHPA支持定时调整HPA策略的最大和最小实例数，满足复杂场景下的工作负载伸缩。
由于HPA与CronHPA均通过scaleTargetRef字段来获取伸缩对象，如果CronHPA和HPA同时设置Deployment为伸缩对象，两个伸缩策略相互独立，后执行的操作会覆盖先执行的操作，导致伸缩效果不符合预期，因此需避免这种情况发生。
![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000001840864636.png "点击放大")
在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实例数的上下限值。
图1CronHPA扩缩容场景   
![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000001887065149.png "点击放大")
[图1]中为可能存在的扩缩容场景，如下表格以举例的形式说明了不同场景下CronHPA修改HPA的情况。
 表1CronHPA扩缩容场景 
| 场景   | 场景说明                                                       | 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实例数。   |
   
- [通过控制台创建]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
  
  2. 单击左侧导航栏的"工作负载"，在目标工作负载的操作列中单击"弹性伸缩"。 
     ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002510508264.png "点击放大")
     
     
  
  3. 策略类型选择"HPA+CronHPA策略"，启用HPA策略，并同时启用CronHPA策略。 
     此时CronHPA会定时调整HPA策略的最大和最小实例数。
     
     
  
  4. 设置HPA策略，详情请参见[创建HPA策略](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0208.html)。
     
     图2启用HPA策略   
     ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002542108585.png "点击放大")
     表2HPA策略配置 
     | 参数     | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
     |:---|:---|
     | 实例范围   | 请输入最小实例数和最大实例数。 策略触发时，工作负载实例将在此范围内伸缩。 须知： 在CCE Autopilot集群中，如果使用独享型ELB对接到工作负载，则最大实例数不能超过ELB的后端服务器组配额（默认为500），否则将会导致多余的实例无法添加到ELB后端。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
     | 伸缩配置 | - 系统默认：采用社区推荐的默认行为进行负载伸缩，详情请参见[社区默认行为说明](https://kubernetes.io/zh-cn/docs/concepts/workloads/autoscaling/horizontal-pod-autoscale/#default-behavior)。  - 自定义：自定义扩/缩容配置的稳定窗口、步长、优先级等策略，实现更灵活的配置。未配置的参数将采用社区推荐的默认值。 - 禁止扩/缩容：选择是否禁止扩容或缩容。  - 稳定窗口：需要伸缩时，会在一段时间（设定的稳定窗口值）内持续检测，如在该时间段内始终需要进行伸缩（不满足设定的指标期望值）才进行伸缩，避免短时间的指标抖动造成异常。  - 步长策略：扩/缩容的步长，可设置一定时间内扩/缩容Pod数量或百分比。在存在多条策略时，可以选择使Pod数量最多或最少的策略。      |
     | 系统策略   | - 指标：可选择"CPU利用率"或"内存利用率"。 说明： 利用率 = 工作负载容器组（Pod）的实际使用量 / 申请量   - 期望值：请输入期望资源平均利用率。 期望值表示所选指标的期望值，通过向上取整（当前指标值 / 期望值 × 当前实例数）来计算需要伸缩的实例数。 说明： HPA在计算扩容、缩容实例数时，会选择最近5分钟内实例数的最大值。   - 容忍范围：指标处于范围内时不会触发伸缩，期望值必须在容忍范围之间。 当指标值大于缩容阈值且小于扩容阈值时，不会触发扩容或缩容。**阈值仅在1.15及以上版本的集群中支持**。    |
        
     
     
  
  5. 在CronHPA的策略规则中单击![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000001840864640.png "点击放大")，在弹出的窗口中设置伸缩策略参数。
     
     图3启用CronHPA策略   
     ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000001886985621.png "点击放大")
     表3CronHPA策略参数配置 
     | 参数      | 参数说明                                                                                                |
     |:---|:---|
     | 目标实例数 | 策略触发时，将根据实际情况调整HPA策略实例数范围，详情请参见[表1]。 |
     | 触发时间   | 可选择每天、每周、每月或每年的具体时间点。 说明： 触发时间基于集群所在时区进行计算。                            |
     | 是否启用   | 可选择启用或关闭该策略规则。                                                                                       |
        
     
     
  
  6. 填写完成上述参数，单击"确定"，您可以在列表中查看添加的策略规则。重复以上步骤，您可以添加多条策略规则，但策略的触发时间不能相同。
  
  7. 设置完成后，单击"创建"。
   
- [通过kubectl命令行创建]
  当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
     ```
     表4CronHPA关键字段说明 
     | 字段                 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
     |:---|:---|
     | 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，具体用法请参见[使用CronHPA调整HPA伸缩范围]或[使用CronHPA直接调整Deployment实例数量]。                                                                                                            |
     | spec.rules          | CronHPA策略规则，可添加多个规则。每个规则可配置以下字段： - ruleName：CronHPA规则名称，该名称需唯一。  - schedule：指定任务运行时间与周期，参数格式与CronTab类似，请参见[Cron](https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/cron-jobs/#cron-schedule-syntax)，例如0 \* \* \* \* 或@hourly。 说明： 触发时间基于集群所在时区进行计算。   - targetReplicas：扩缩容的Pod数目。  - disable：参数值为"true"或"false"。其中"false"表示该规则生效，"true"则表示该规则不生效。   |
        
     
     
   
 #### 使用CronHPA直接调整Deployment实例数量
CronHPA还可以单独调整关联Deployment，定时调整Deployment的实例数。您可以通过控制台或kubectl命令行创建。
- [通过控制台创建]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
  
  2. 单击左侧导航栏的"工作负载"，在目标工作负载的操作列中单击"弹性伸缩"。 
     ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002510508264.png "点击放大")
     
     
  
  3. 策略类型选择"HPA+CronHPA策略"，选择不启用HPA策略，并选择启用CronHPA策略。 
     此时CronHPA会直接定时调整工作负载的实例数。
     
     
  
  4. 在CronHPA的策略规则中单击![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000001887065153.png "点击放大")，在弹出的窗口中设置伸缩策略参数。
     
     图4使用CronHPA调整工作负载实例数   
     ![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000001886987089.png "点击放大")
     表5CronHPA策略参数配置 
     | 参数    | 参数说明                                                                     |
     |:---|:---|
     | 目标实例数 | 策略触发时，工作负载实例将调整至该数值。                                                     |
     | 触发时间     | 可选择每天、每周、每月或每年的具体时间点。 说明： 触发时间基于集群所在时区进行计算。 |
     | 是否启用  | 可选择启用或关闭该策略规则。                                                           |
        
     
     
  
  5. 填写完成上述参数，单击"确定"，您可以在列表中查看添加的策略规则。重复以上步骤，您可以添加多条策略规则，但策略的触发时间不能相同。
  
  6. 设置完成后，单击"创建"。
   
- [通过kubectl命令行创建]
  ```
  apiVersion: 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
  ```
