
# 创建CustomedHPA策略
随着应用复杂度的增加和业务需求的多样化，企业和开发者在实际使用中发现，标准的HPA虽然能够根据CPU利用率和内存使用量自动调整Pod数量，但在某些特定场景下，这种单一的扩缩策略可能并不能完全满足需求。例如，某些应用的负载可能会在特定时间段内急剧变化，或者需要基于指标对扩缩容动作进行更精细的控制，如扩缩容步长等。
CustomedHPA策略是CCE在HPA基础上提供的弹性伸缩增强能力，能够提供更加灵活、多样化的弹性伸缩能力，以满足复杂多变的业务需求。CustomedHPA支持基于指标（CPU利用率、内存利用率）或周期（每天、每周、每月或每年的具体时间点），对无状态工作负载进行弹性扩缩容。
主要功能如下：
- **支持按照当前实例数的百分比进行扩缩容**：设置扩缩容的百分比，在调整Pod数量时更加灵活，能够更好地适应不同负载情况。
- **支持设置一次扩缩容的最小步长**：通过设置最小步长，可以避免频繁调整，减少系统开销和资源波动。
- **支持按照实际指标值执行不同的扩缩容动作**：可以定义多个指标阈值和对应的扩缩容策略，使得系统能够在不同负载情况下采取不同的应对措施。
 
#### 前提条件
使用CustomedHPA策略必须安装[CCE容器弹性引擎](https://support.huaweicloud.com/usermanual-cce/cce_10_0240.html)，若该插件版本低于1.2.11，则必须安装[prometheus](https://support.huaweicloud.com/usermanual-cce/cce_10_0221.html)插件；若插件版本大于或等于1.2.11，则需要安装能够提供Metrics API的插件，您可根据集群版本和实际需求选择其中之一：
- [Kubernetes Metrics Server](https://support.huaweicloud.com/usermanual-cce/cce_10_0205.html)：提供基础资源使用指标，例如容器CPU和内存使用率，默认采集周期为60s。所有集群版本均可安装。
- [云原生监控插件](https://support.huaweicloud.com/usermanual-cce/cce_10_0406.html)：使用HPA需要开启本地数据存储。该插件支持v1.17及以后的集群版本，默认采集周期为15s。
  - 根据基础资源指标进行弹性伸缩：需将Prometheus注册为Metrics API的服务，详见[通过Metrics API提供基础资源指标](https://support.huaweicloud.com/usermanual-cce/cce_10_0406.html#cce_10_0406__section17830202915211)。如果集群中已安装[Kubernetes Metrics Server](https://support.huaweicloud.com/usermanual-cce/cce_10_0205.html)，该插件默认提供Metrics API，无需重复注册。
  
  - 根据自定义指标进行弹性伸缩：除了将Prometheus注册为Metrics API的服务，还需要将自定义指标聚合到Kubernetes API Server，详情请参见[使用自定义指标创建HPA策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0406.html#cce_10_0406__section11927514174016)。
   
- [Prometheus（停止维护）](https://support.huaweicloud.com/usermanual-cce/cce_10_0221.html)：如果集群中未安装[Kubernetes Metrics Server](https://support.huaweicloud.com/usermanual-cce/cce_10_0205.html)，需手动为Prometheus创建Metrics API，详见[通过Metrics API提供资源指标](https://support.huaweicloud.com/usermanual-cce/cce_10_0221.html#cce_10_0221__section13409107262)。该插件仅支持v1.21及之前的集群版本。在1.21以上版本集群中已经停止维护该插件。在CCE集群中不推荐使用该插件，推荐使用[云原生监控插件](https://support.huaweicloud.com/usermanual-cce/cce_10_0406.html)或者[Kubernetes Metrics Server](https://support.huaweicloud.com/usermanual-cce/cce_10_0205.html)。
 
#### 约束与限制
- CustomedHPA策略仅支持1.15及以上版本的集群。
- 1.19.10以下版本的集群中，如果使用CustomedHPA策略对挂载了EVS卷的负载进行扩容，当新Pod被调度到另一个节点时，会导致之前Pod不能正常读写。 1.19.10及以上版本集群中，如果使用CustomedHPA策略对挂载了EVS卷的负载进行扩容，新Pod会因为无法挂载云硬盘导致无法成功启动。
  
- CCE容器弹性引擎插件的资源使用量主要受集群中总容器数量和伸缩策略数量影响，通常场景下建议每5000容器配置CPU 500m, 内存1000Mi资源，每1000伸缩策略CPU 100m，内存500Mi。
- 若[CCE容器弹性引擎](https://support.huaweicloud.com/usermanual-cce/cce_10_0240.html)插件版本低于1.2.11，不支持使用[云原生监控插件](https://support.huaweicloud.com/usermanual-cce/cce_10_0406.html)提供Metrics API来实现工作负载弹性伸缩。
- 创建CustomedHPA策略后，不支持将已关联的工作负载修改为其他工作负载。
 
#### 创建CustomedHPA策略
1. 在CCE控制台，单击集群名称进入集群。
2. 单击左侧导航栏的"工作负载"，在目标工作负载的操作列中单击"弹性伸缩"。
3. 策略类型选择"CustomedHPA策略"，并填写策略参数。 
    表1CustomedHPA策略参数配置 
   | 参数   | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   |:---|:---|
   | 实例范围 | 请输入最小实例数和最大实例数。 策略触发时，工作负载实例将在此范围内伸缩。 须知： 在CCE Turbo集群中，如果使用独享型ELB对接到工作负载，则最大实例数不能超过ELB的后端服务器组配额（默认为500），否则将会导致多余的实例无法添加到ELB后端。                                                                                                                                                                                                                                                                     |
   | 冷却时间 | 请输入冷却时间值，单位为分钟。 策略成功触发后，在此冷却时间内，不会再次触发缩容/扩容，目的是等待伸缩动作完成后在系统稳定且集群正常的情况下进行下一次策略匹配。 说明： CCE容器弹性引擎插件为1.3.10及以上版本时，冷却时间仅对指标类策略生效，周期类策略不受冷却时间影响。                                                                                                                                                                                                                                                            |
   | 策略规则 | 单击![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002485782238.png "点击放大")在弹出的窗口中设置伸缩策略参数： - 类型：可选择"指标触发"（参见[表2]）或"周期触发"（参见[表3]）。选择类型后，可设置不同的触发条件及动作。  - 是否启用：可选择启用或关闭该策略规则。   填写完成上述参数，单击"确定"，您可以在列表中查看添加的策略规则。 |
      
    表2指标触发类型规则 
   | 参数   | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   |:---|:---|
   | 触发条件 | 请选择"CPU利用率"或"内存利用率"，选择"\>"或"\<"，并输入百分比的值。 说明： 利用率 = 工作负载所有Pod实际资源使用量的平均值 / 资源申请量（Request）                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   | 执行动作 | 与上述"触发条件"相对应，达到触发条件值后所要执行的动作，可添加多个执行动作。 - 伸缩至：将实例数调整至设定的目标值，支持填写实例数或百分比。该动作支持扩容或缩容实例数，如果当前实例数小于目标值（或百分比大于100%），会将实例数扩容至目标值；如果当前实例数大于目标值（或百分比小于100%），则会将实例数缩容至目标值。  - 增加：当"触发条件"选择"\>"时设置。在当前实例数的基础上增加指定的实例数，支持填写实例数或百分比。该动作仅支持扩容实例数。  - 减少：当"触发条件"选择"\<"时设置。在当前实例数的基础上减少指定的实例数，支持填写实例数或百分比。该动作仅支持缩容实例数。   说明： 以上执行动作均支持填写具体实例数或百分比。 填写百分比时，还需填写至少存在的实例数。此时默认按以下公式计算最终实例个数：（当前实例数×百分比，然后向上取整）。若计算结果小于设置的最少实例数，以设置值为准；否则，以计算结果为准。 如下图中所示，当CPU利用率超过50%时将伸缩至5个实例，当超过70%时伸缩至8个实例，当超过90%时在8个实例基础上再增加10个实例。反之，按此规则执行缩容。 图1触发条件 ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001655224385.png "点击放大") |
      
    表3周期触发类型规则 
   | 参数   | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   |:---|:---|
   | 触发时间 | 可选择每天、每周、每月或每年的具体时间点。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   | 执行动作 | 与上述"触发时间"相对应，达到触发时间值后所要执行的动作。如下图中所示，即每天17:00时将执行增加1个实例的动作。 - 伸缩至：将实例数调整至设定的目标值，支持填写实例数或伸缩百分比。该动作支持扩容或缩容实例数，如果当前实例数小于目标值（或百分比大于100%），会将实例数扩容至目标值；如果当前实例数大于目标值（或百分比小于100%），则会将实例数缩容至目标值。  - 增加：在当前实例数的基础上增加指定的实例数，支持填写实例数或百分比。该动作仅支持扩容实例数。  - 减少：在当前实例数的基础上减少指定的实例数，支持填写实例数或百分比。该动作仅支持缩容实例数。   说明： 以上执行动作均支持填写具体实例数或百分比。 填写百分比时，还需填写至少存在的实例数。此时默认按以下公式计算最终实例个数：（当前实例数×百分比，然后向上取整）。若计算结果小于设置的最少实例数，以设置值为准；否则，以计算结果为准。 图2周期触发-每天 ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001606344138.png "点击放大") |
      
   
   
4. 设置完成后，单击"创建"。
 
#### 使用kubectl创建
CustomHPA是一种CRD资源，可按如下YAML定义。
```
apiVersion: autoscaling.cce.io/v1alpha1
kind: CustomedHorizontalPodAutoscaler
metadata:
  name: customhpa-example
  namespace: default
spec:
  coolDownTime: 3m             # 冷却时间
  maxReplicas: 10              # 最大实例数
  minReplicas: 1               # 最小实例数
  rules:
    - actions:                          # 策略规则
        - metricRange: 0,0.1            # 指标范围，表示从0到10%（不含10%）
          operationType: ScaleDown      # 伸缩类型，ScaleDown表示减少
          operationUnit: Task           # 操作单位，Task表示个数
          operationValue: 1             # 每次伸缩的数量
        - metricRange: 0.1,0.3          # 指标范围，表示从10%到30%（不含30%）
          operationType: ScaleDown
          operationUnit: Task
          operationValue: 2
      disable: false                    # 是否禁用此规则
      metricTrigger:                    # 触发条件
        hitThreshold: 1
        metricName: CPURatioToRequest   # 指标名称，CPURatioToRequest为CPU利用率，MemoryRatioToRequest为内存利用率
        metricOperation: <              # 指标表达式操作符，表示小于metricValue值时触发
        metricValue: 0.3                # 指标表达式右侧取值
        periodSeconds: 60
        statistic: instantaneous
      ruleName: low                     # 规则名称
      ruleType: Metric                  # 规则类型，表示指标触发
    - actions:
        - metricRange: 0.7,0.9
          operationType: ScaleUp
          operationUnit: Task
          operationValue: 1
        - metricRange: 0.9,+Infinity
          operationType: ScaleUp
          operationUnit: Task
          operationValue: 2
      disable: false
      metricTrigger:
        hitThreshold: 1
        metricName: CPURatioToRequest
        metricOperation: '>'
        metricValue: 0.7
        periodSeconds: 60
        statistic: instantaneous
      ruleName: high
      ruleType: Metric
  scaleTargetRef:                # 关联负载      
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
```
#### 相关文档
- 如果您需要基于CPU使用率、内存使用率进行扩缩容，请参见[创建HPA策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0208.html)。
- 如果您希望使用自定义指标进行弹性伸缩，请参见[创建使用自定义指标的HPA策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0944.html)。
- 您的应用如果存在资源使用率的周期性变化，且希望按类似Crontab的策略定时扩缩容Pod，可参考[创建CronHPA定时策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0415.html)。
- 若需要基于Pod实际资源使用情况自动调整其资源限制（以保证Pod获得充足的计算资源），可参考[创建VPA策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0921.html)。
- 如果资源使用率虽有周期性变化，但难以用固定规则定义，推荐使用AHPA策略，它能根据业务历史指标自动识别水位周期并完成扩缩容，详情请参见[创建AHPA策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0934.html)。
 
