更新时间:2026-03-30 GMT+08:00
分享

创建使用自定义指标的HPA策略

Kubernetes默认的HPA策略只支持基于CPU和内存的自动伸缩,在复杂的业务场景中,仅使用CPU和内存使用率指标进行弹性伸缩往往无法满足日常运维需求。通过自定义指标配置工作负载HPA策略,可以根据业务自身特点,通过更多指标实现更灵活的弹性配置。

图1 使用自定义指标的HPA策略示意图

本文介绍如何部署示例Nginx应用,并通过Prometheus标准方式暴露container_cpu_usage_core_per_second的指标用来标识容器每秒使用CPU核心数。关于Prometheus指标的更多信息,请参见metric_type

步骤一:安装云原生监控插件

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 单击左侧导航栏的“插件中心”,在页面右侧找到云原生监控插件,单击“安装”。

    建议您关注以下配置,其他配置可按需进行设置。

    • 数据存储配置:选择本地数据存储监控数据上报至对接AOM服务

    • 自动服务发现:如果使用Annotations监控自定义指标,还需要开启插件的“自动服务发现”开关,否则将无法自动发现并采集指标。

  3. 插件配置完成后,单击“安装”。

步骤二:注册Metrics API

需将Prometheus注册为Metrics API的服务,详情如下。

  • 仅云原生监控插件开启本地数据存储时,可通过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
......

卸载插件时,需要执行以下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

    • 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工作负载。

  4. 等待约15秒后,执行命令查看指标是否添加成功。

    kubectl get --raw  "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/container_cpu_usage_core_per_second"

步骤四:创建示例工作负载

通过联邦控制台创建工作负载,详情请参见无状态负载

步骤五:创建HPA策略

在联邦控制台中创建HPA策略,选择上一步创建的工作负载作为伸缩目标。详情请参见创建FederatedHPA策略以按指标扩缩工作负载

相关文档