
# 创建使用自定义指标的HPA策略
Kubernetes默认的HPA策略只支持基于CPU和内存的自动伸缩，在复杂的业务场景中，仅使用CPU和内存使用率指标进行弹性伸缩往往无法满足日常运维需求。通过自定义指标配置工作负载HPA策略，可以根据业务自身特点，通过更多指标实现更灵活的弹性配置。
图1使用自定义指标的HPA策略示意图   
![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000002527868302.png "点击放大")
本文介绍如何部署示例Nginx应用，并通过Prometheus标准方式暴露container_cpu_usage_core_per_second的指标用来标识容器每秒使用CPU核心数。关于Prometheus指标的更多信息，请参见[metric_type](https://prometheus.io/docs/concepts/metric_types/)。
#### 步骤一：安装云原生监控插件
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 单击左侧导航栏的"插件中心"，在页面右侧找到云原生监控插件，单击"安装"。 
   建议您关注以下配置，其他配置可按需进行设置。
   - 数据存储配置：选择**本地数据存储** 和**监控数据上报至对接AOM服务** 。
     ![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000002530210746.png)
     
     
   
   - 自动服务发现：如果[使用Annotations监控自定义指标](https://support.huaweicloud.com/usermanual-cce/cce_10_0373.html)，还需要开启插件的"自动服务发现"开关，否则将无法自动发现并采集指标。
   
   
   
   
3. 插件配置完成后，单击"安装"。
 
#### 步骤二：注册Metrics API
需将Prometheus注册为Metrics API的服务，详情如下。
![](https://support.huaweicloud.com/usermanual-ucs/public_sys-resources/note_3.0-zh-cn.png)
- 仅云原生监控插件开启本地数据存储时，可通过Metrics API提供基础资源指标。
- 如果集群中已安装"Kubernetes Metrics Server"插件，需要卸载此插件。
 
容器和节点的资源指标，如CPU、内存使用量，可通过Kubernetes的Metrics API获得。这些指标可以直接被用户访问，比如用kubectl top命令，也可以被HPA或者CustomedHPA使用，根据资源使用率使负载弹性伸缩。
插件可为Kubernetes提供Metrics API，但默认未开启，若要将其开启，需要创建以下APIService对象：
```
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  labels:
    app: custom-metrics-apiserver
    release: cceaddon-prometheus
  name: v1beta1.metrics.k8s.io
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: custom-metrics-apiserver
    namespace: monitoring
    port: 443
  version: v1beta1
  versionPriority: 100
```
可以将该对象保存为文件，命名为metrics-apiservice.yaml，然后执行以下命令：
```
kubectl create -f metrics-apiservice.yaml
```
执行kubectl top pod -n monitoring命令，若显示如下，则表示Metrics API能正常访问：
```
NAME                                                      CPU(cores)   MEMORY(bytes)
......
custom-metrics-apiserver-d4f556ff9-l2j2m                  38m          44Mi
......
```
![](https://support.huaweicloud.com/usermanual-ucs/public_sys-resources/notice_3.0-zh-cn.png)
卸载插件时，需要执行以下kubectl命令，同时删除APIService对象，否则残留的APIService资源将导致Kubernetes Metrics Server插件安装失败。
```
kubectl delete APIService v1beta1.metrics.k8s.io
```
#### 步骤三：修改配置文件
1. 在集群控制台左侧导航栏中选择"配置与密钥"，切换至"monitoring"命名空间。
2. 更新user-adapter-config配置项，通过修改user-adapter-config中rules字段将Prometheus暴露出的指标转换为HPA可关联的指标。 
   添加以下示例规则：
   ```
   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-ucs/zh-cn_image_0000002527868312.png "点击放大")
   
   
   
4. 等待约15秒后，执行命令查看指标是否添加成功。 
   ```
   kubectl get --raw  "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/container_cpu_usage_core_per_second"
   ```
   ![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000002558988139.png "点击放大")
   
   
 
#### 步骤四：创建示例工作负载
通过联邦控制台创建工作负载，详情请参见[无状态负载](https://support.huaweicloud.com/usermanual-ucs/ucs_01_0255.html)。
#### 步骤五：创建HPA策略
在联邦控制台中创建HPA策略，选择上一步创建的工作负载作为伸缩目标。详情请参见[创建FederatedHPA策略以按指标扩缩工作负载](https://support.huaweicloud.com/usermanual-ucs/ucs_01_0404.html)。
