# 创建使用自定义指标的HPA策略
Kubernetes默认的HPA策略只支持基于CPU和内存的自动伸缩，在复杂的业务场景中，仅使用CPU和内存使用率指标进行弹性伸缩往往无法满足日常运维需求。通过自定义指标配置工作负载HPA策略，可以根据业务自身特点，通过更多指标实现更灵活的弹性配置。
本文介绍如何部署示例Nginx应用，并通过Prometheus标准方式暴露container_cpu_usage_core_per_second的指标用来标识容器每秒使用CPU核心数。关于Prometheus指标的更多信息，请参见[metric_type](https://prometheus.io/docs/concepts/metric_types/)。
#### 工作原理
CCE全面对接开源Prometheus生态，支持类型丰富的自定义指标监控，同时支持使用自定义指标实现弹性伸缩，原理如下图所示：
图1使用自定义指标的HPA策略示意图   
![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002625369495.png "点击放大")
利用自定义指标实现HPA弹性伸缩的核心流程如下：
1. **指标暴露**：业务应用需要在代码里预置指标上报能力，将关键指标（如队列长度、在线用户数、每秒请求量）暴露出来。
2. **指标采集**：如果应用无法直接暴露指标，可以部署一个专用的Exporter组件，它负责从应用中抓取数据，并转换成Prometheus能识别的格式。
3. **指标存储**：Prometheus定期从Exporter或应用直接拉取指标，并进行存储，形成历史数据，供后续查询和分析。
4. **指标转换**：通过配置文件（user-adapter-config）定义"PromQL查询语句"与"Kubernetes自定义指标API名称"之间的映射关系。
5. **API接入**：在API Server中注册自定义指标API，使得HPA可以像查询CPU指标一样，通过统一的API接口查询到自定义指标。
6. **执行伸缩**：HPA定期查询自定义指标的值，计算工作负载的期望副本数量并执行扩缩容。
 
#### 步骤一：安装云原生监控插件
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 单击左侧导航栏的"插件中心"，在页面右侧找到云原生监控插件，单击"安装"。 
   建议您关注以下配置，其他配置可按需进行设置。详情请参见[云原生监控插件](https://support.huaweicloud.com/usermanual-cce/cce_10_0406.html)。
   - 数据存储配置：必选**本地数据存储** ，可选监控数据是否对接AOM或三方监控平台。
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002515006758.png "点击放大")
     
     
   
   - 自动服务发现：如果[使用Annotations监控自定义指标](https://support.huaweicloud.com/usermanual-cce/cce_10_0373.html)，还需要开启插件的"自动服务发现"开关，否则将无法自动发现并采集指标。
   
   
   
   
3. 插件配置完成后，单击"安装"。
 
#### 步骤二：注册Metrics API
需将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，无需重复注册。
#### 步骤三：创建示例工作负载
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在集群控制台左侧导航栏中选择"工作负载"，单击右上角"创建工作负载"。在default命名空间下创建一个Nginx工作负载，详情请参见[创建无状态负载（Deployment）](https://support.huaweicloud.com/usermanual-cce/cce_10_0047.html)。
 
#### 步骤四：修改配置文件
1. 在集群控制台左侧导航栏中选择"配置与密钥"，切换至"monitoring"命名空间。
2. 更新user-adapter-config配置项，通过修改user-adapter-config中rules字段将Prometheus暴露出的指标转换为HPA可关联的指标。 
   添加以下示例规则：
   ```
   ...
   data:
     config.yaml: |
       rules:
         - seriesQuery: 'container_cpu_usage_seconds_total{namespace!="",pod!=""}'
           seriesFilters: []
           resources:
             overrides:
               namespace:
                 resource: namespace
               pod:
                 resource: pod
           name:
             matches: "^(.*)_seconds_total"
             as: "${1}_core_per_second"
           metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>)'
   ...
   ```
   此配置项示例中，通过现有的container_cpu_usage_seconds_total指标，聚合成 container_cpu_usage_core_per_second 指标，供后续的HPA策略中使用。关于采集规则配置详情请参见[Metrics Discovery and Presentation Configuration](https://github.com/kubernetes-sigs/prometheus-adapter/blob/master/docs/config.md)。
   - seriesQuery：PromQL请求数据（用户需要查询的指标，可根据实际情况填写）。
   
   - metricsQuery：对seriesQuery中PromQL请求的数据进行聚合操作。
   
   - resources：是PromQL里的数据Label，与resource进行匹配。此处的resource是指集群内的api-resource，例如Pod、Namespace和Node。您可以通过**kubectl api-resources -o wide**命令查看。此处Key对应Prometheus数据中的LabelName，请确认Prometheus指标数据中有此LabelName。
   
   - name：指根据正则匹配把Prometheus指标名转为比较可读的指标名，此处将container_cpu_usage_seconds_total转为container_cpu_usage_core_per_second。
   
   
   
   
3. 重新部署monitoring命名空间下的custom-metrics-apiserver工作负载。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002096356777.png "点击放大")
   
   
   
4. 等待插件就绪后，执行命令查看指标是否添加成功。 
   ```
   kubectl get --raw  "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/container_cpu_usage_core_per_second"
   ```
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002080592981.png "点击放大")
   
   
 
#### 步骤五：测试HPA弹性功能
1. 单击左侧导航栏的"工作负载"，在目标工作负载的操作列中单击"更多 \> 弹性伸缩"。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002060243252.png "点击放大")
   
   
   
2. 策略类型选择"HPA+CronHPA策略"，并启用HPA策略， 可以直接选择配置在rules里面的自定义指标创建HPA策略。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002060257750.png "点击放大")
   
   
   
3. 单击工作负载名称，切换至"弹性伸缩"页签查看HPA状态，成功触发HPA策略。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002060260194.png "点击放大")
   
   
   
 
#### 相关文档
- 如果该应用使用ELB对外提供访问，您可以根据ELB的监控指标（如QPS）进行弹性伸缩，详情请参见[基于ELB监控指标的弹性伸缩实践](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_00283.html)。
- 如果该应用使用Nginx Ingress实现流量路由转发，您可以根据Nginx Ingress监控指标进行弹性伸缩，详情请参见[通过Nginx Ingress对多个应用进行弹性伸缩](https://support.huaweicloud.com/bestpractice-cce/cce_bestpractice_10038.html)。
 
