
# 水平扩缩容（HPA）
水平扩缩容（Horizontal Pod Autoscaler, HPA）是一种资源对象，能够根据某些指标对无状态负载中的容器组数量进行动态伸缩，使运行在上面的服务对指标的变化有一定的自适应能力。HPA会根据租户配置的策略自动增加或减少容器组数量以满足租户需求。
#### 约束与限制
在CCI 2.0，每个容器组所在环境都存在辅助运行的系统组件，由于这些系统组件会占用部分资源，因此可能导致容器组的资源使用达不到预期上限，进而影响您设置的HPA规则的触发条件。您可参考[预留系统开销说明](https://support.huaweicloud.com/usermanual-cci2/cci_01_1146.html)避免此类情形。
#### 通过控制台创建和管理HPA策略
1. 登录[云容器实例 CCI2.0](https://console.huaweicloud.com/cci2.0/?#/cci/cluster/list)控制台。
2. 在左侧导航栏中选择"负载管理 \> 无状态负载"，单击工作负载名称进入负载详情。
3. 在负载详情中，单击"弹性伸缩"。
4. 单击"创建HPA策略"，根据界面提示补充相关信息。相关配置项如[表1]所示。
    表1创建HPA策略 
   | 配置项    | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   |:---|:---|
   | 名称     | 自定义HPA策略名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | 命名空间   | 选择指定命名空间。如需新建请单击"创建命名空间"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | 关联工作负载 | 系统会自动匹配关联工作负载。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | 实例范围   | HPA可伸缩的Pod实例数量上下限。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | 伸缩配置   | - 系统默认 选择系统默认则采用K8S社区推荐的默认行为进行负载伸缩。   - 自定义 选择自定义则用户可以自定义稳定窗口、步长、优先级等策略实现更灵活的配置，未配置的参数将采用K8S社区推荐的默认值。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   | 系统策略   | - 指标： 触发弹性伸缩的监控数据类型，支持选择"CPU 利用率"或"内存利用率"。   说明： 计算方式：利用率 = 工作负载容器组（Pod）的实际使用量 / 申请量 - 期望值：您希望工作负载在运行时的"理想资源利用率"。期望值不仅代表目标利用率，系统还会以它为核心，通过公式**向上取整 (当前指标值 / 期望值 × 当前实例数) 来计算需要伸缩的目标实例数。** *计算示例：* 假设当前实例数为2，期望值为50%。若当前实际指标值升高至85%，系统会按公式 向上取整 (85% / 50% × 2) = 向上取整(3.4)，得出此时需要将实例数伸缩为**4**个。     - 容忍范围：为了防止指标的短暂波动导致系统频繁扩缩容（即"震荡"），系统引入了容忍度机制（默认为0.1，即10%）。 - **免扩缩容区间：** 实际指标在 \[期望值 × (1 - 容忍度), 期望值 × (1 + 容忍度)\] 这个范围内浮动时，系统认为当前状态可以接受，**不会触发**计算和扩缩容动作。  - *运行示例：* 当期望值为50%，容忍度为0.1。则免扩缩容区间为45%到55%。只有当实际利用率持续大于55%（扩容）或持续小于45%（缩容）时，才会真正执行上述期望值的伸缩计算。   当指标值大于缩容阈值且小于扩容阈值时，不会触发扩容或缩容。**阈值仅在1.15及以上版本的集群中支持**。    须知： 可以设置多条系统策略。 |
      
   ![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0000002472619028.png "点击放大")
   
   
5. **可选：**通过界面上的"更新HPA策略"和"删除HPA策略"可以对已创建的HPA策略进行更新和删除。
 
#### 通过YAML文件创建HPA策略
![](https://support.huaweicloud.com/usermanual-cci2/public_sys-resources/note_3.0-zh-cn.png)
- 当配置spec.metrics.resource.target.type为Utilization时，您需要在创建工作负载时指定资源的requests值。
- 当配置spec.metrics.resource.target.type为Utilization时，其数值的计算规则为：资源使用率 = 资源使用量 / 用户实际可使用的容器组规格。您可参考[容器组规格的计算方法](https://support.huaweicloud.com/usermanual-cci2/cci_01_0071.html)来确认您的容器组实际规格。
 
您可以根据业务需求自行定义伸缩策略，包括弹性指标、阈值以及步长等，以降低人为反复调整资源以应对业务变化和高峰压力的工作量，帮助您节约资源和人力成本。当前支持一种弹性伸缩策略：
告警策略：支持根据CPU/内存的使用率，进行工作负载的自动伸缩。工作负载创建完成后即可设置，在CPU/内存超过或少于一定值时，自动增减实例。
1. 登录[云容器实例 CCI2.0](https://console.huaweicloud.com/cci2.0/?#/cci/cluster/list)控制台。
2. 在左侧导航栏中选择"负载管理 \> 无状态负载"，单击工作负载名称进入负载详情。
3. 在"负载详情"中，单击"弹性伸缩"，单击"YAML创建"配置弹性伸缩策略。 弹性伸缩策略文件格式说明
   - hpa.yaml资源描述
     ```
     kind: HorizontalPodAutoscaler
     apiVersion: cci/v2
     metadata:
       name: nginx              # HPA的名称    
       namespace: test          # HPA所在的命名空间
     spec:
       scaleTargetRef:         # 引用进行自动伸缩的目标资源
         kind: Deployment      # 目标资源类型，例Deployment 
         name: nginx           # 目标资源名称   
         apiVersion: cci/v2    # 目标资源版本  
       minReplicas: 1          # HPA伸缩的最小副本数
       maxReplicas: 5          # HPA伸缩的最大副本数
       metrics:
         - type: Resource                 # 使用资源指标
           resource:
             name: memory                 # 资源名称，例如cpu或memory    
             target:
               type: Utilization          # 指标类型，可以是Utilization（百分比）或AverageValue（绝对值）
               averageUtilization: 50     # 资源使用率，例当CPU使用率达到50%时触发扩容
       behavior:
         scaleUp:
           stabilizationWindowSeconds: 30  # 扩容后稳定时间，单位为秒
           policies:
           - type: Pods           #指定扩缩容的Pods数量
             value: 1
             periodSeconds: 30  # 每 30 秒检查一次
         scaleDown:
           stabilizationWindowSeconds: 30  # 缩容后稳定时间，单位为秒
           policies:
           - type: Percent      #按照现有Pods的百分比来扩缩容
             value: 50
             periodSeconds: 30  # 每 30 秒检查一次
     ```
     
   
   - hpa.json资源描述
     ```
     {
     "kind": "HorizontalPodAutoscaler",
     "apiVersion": "cci/v2",
     "metadata": {
     "name": "nginx",             # HPA的名称
     "namespace": "test"          # HPA所在的命名空间
     },
     "spec": {
     "scaleTargetRef": {         # 引用进行自动伸缩的目标资源
     "kind": "Deployment",        # 目标资源类型，例Deployment
     "name": "nginx",             # 目标资源名称
     "apiVersion": "cci/v2"       # 目标资源版本
     },
     "minReplicas": 1,             # HPA伸缩的最小副本数
     "maxReplicas": 5,             # HPA伸缩的最大副本数
     "metrics": [
     {
     "type": "Resource",             # 使用资源指标
     "resource": {
     "name": "memory",       # 资源名称，例如cpu或memory
     "target": {
     "type": "Utilization",           # 指标类型，可以是Utilization（百分比）或AverageValue（绝对值）
     "averageUtilization": 50         # 资源使用率，例当CPU使用率达到50%时触发扩容  
     }
     }
     }
     ],
     "behavior": {
     "scaleUp": {
     "stabilizationWindowSeconds": 30,
     "policies": [
     {
     "type": "Pods",
     "value": 1,
     "periodSeconds": 30
     }
     ]
     },
     "scaleDown": {
     "stabilizationWindowSeconds": 30,
     "policies": [
     {
     "type": "Percent",
     "value": 50,
     "periodSeconds": 30
     }
     ]
     }
     }
     }
     }
     ```
     
    
4. 单击"确定"。
   可看到弹性伸缩策略。
   图1弹性伸缩策略   
   ![](https://support.huaweicloud.com/usermanual-cci2/zh-cn_image_0000002481489116.png "点击放大")
   
   待到触发条件发生时，弹性伸缩策略会自动启动。
   
 
