You need to enable JavaScript to run this app.
文档中心
容器服务

容器服务

复制全文
下载 pdf
指标伸缩(HPA)
使用自定义指标实现弹性伸缩
复制全文
下载 pdf
使用自定义指标实现弹性伸缩
本文主要介绍创建指标伸缩时,通过 YAML 方式定义 HPA(Horizontal Pod Autoscaler,水平 Pod 弹性伸缩)的自定义指标,并进行弹性伸缩的操作步骤。​
背景信息​
基本概念​
默认情况下,HPA (Horizontal Pod Autoscaler,水平 Pod 弹性伸缩)只支持基于 CPU 和内存的自动扩缩容,并不能满足复杂业务的诉求。通过在集群中开启云原生观测接入,可以监控、采集和查询集群中组件的各项指标。配合 prometheus-adapter 组件即可通过这些指标实现工作负载的自动扩缩容,使得业务负载可以更好地按需扩展,保证稳定性并平衡成本。​
使用自定义指标进行弹性伸缩主要分为三个步骤:​
  1. 在 VKE 集群中开启云原生观测,采集并透出指标。支持按需采集指标,详情请参见 基础观测。​
  1. 配置原始指标与自定义指标间的映射关系,通过 prometheus-adapter 实现两者的映射。​
  1. 配置 HPA,使用自定义指标实现工作负载自动扩缩容。​
指标映射​
默认情况下,系统中的 HPA 组件无法识别托管 Prometheus 中采集到的原始指标。因此,需要使用 prometheus-adapter 组件进行指标映射,将托管 Prometheus 中的原始指标映射为自定义指标,然后 HPA 组件才能识别和使用。​
prometheus-adapter 组件安装完成后,会在集群的kube-system命名空间下新增配置项prometheus-adapter-config,用于记录预置的指标映射关系,配置项中的参数样式如下所示:​
​
rules:​
- seriesQuery: 'container_network_receive_bytes_total'​
resources:​
overrides:​
namespace: {resource: "namespace"}​
pod: {resource: "pod"}​
name: {as: 'k8s_pod_network_receive_throughput'}​
metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>,cluster="ccmketollk1b***",pod!=""}[1m])) by (<<.GroupBy>>) / 125000.0'​
​
映射配置中的参数说明,如下表所示。​
​
参数​
说明​
seriesQuery​
托管 Prometheus 中的原始指标,支持配置标签,例如container_network_receive_bytes_total{cluster="ccm5pq1j5i7***"}​
resources.overrides​
将 Kubernetes 原生资源映射为托管 Prometheus 中指标的标签,其中:​
  • 键:为托管 Prometheus 中指标的标签。​
  • 值:为需要映射的 Kubernetes 原生资源,支持pod、namespace、node等。当 HPA 使用自定义指标时,其会将该指标的原生资源名称自动填充为托管 Prometheus 中指标的标签。​
说明​
您可以通过kubectl api-resources -o wide命令,查看集群的原生资源。​
name​
自定义指标名称,例如k8s_pod_network_receive_throughput,该自定义指标支持在 HPA 中使用。​
metricsQuery​
聚合托管 Prometheus 中指标的查询语句。其中:​
  • <<.Series>>会被填充为seriesQuery中指定的原始指标。在本例中为container_network_receive_bytes_total。​
  • <<.LabelMatchers>>会被填充为待查询指标的namespace和pod两个标签键值对。​
  • <<.GroupBy>>会被填充为pod,即按照pod维度进行聚合。​
​
注意​
为了避免 prometheus-adapter 查询的指标量过大,seriesQuery和metricsQuery建议配置过滤标签。同时,由于托管 Prometheus 的工作区可以对接多个集群,因此为查询参数配置标签时务必添加集群标签。​
配置自定义指标后,您可以通过kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta2/" | jq .命令查看自定义指标。​
​
{​
"kind": "APIResourceList",​
"apiVersion": "v1",​
"groupVersion": "custom.metrics.k8s.io/v1beta2",​
"resources": [​
{​
"name": "pods/k8s_pod_network_receive_throughput",​
"singularName": "",​
"namespaced": true,​
"kind": "MetricValueList",​
"verbs": [​
"get"​
]​
},​
{​
"name": "namespaces/k8s_pod_network_receive_throughput",​
"singularName": "",​
"namespaced": false,​
"kind": "MetricValueList",​
"verbs": [​
"get"​
]​
}​
]​
}​
​
您可以通过kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta2/namespaces/kube-system/pods/*/k8s_pod_network_receive_throughput" | jq .查询kube-system命名空间下所有 Pod 的入带宽指标。​
​
{​
"kind": "MetricValueList",​
"apiVersion": "custom.metrics.k8s.io/v1beta2",​
"metadata": {},​
"items": [​
{​
"describedObject": {​
"kind": "Pod",​
"namespace": "kube-system",​
"name": "coredns-59f55659db-s94hm",​
"apiVersion": "/v1"​
},​
"metric": {​
"name": "k8s_pod_network_receive_throughput",​
"selector": null​
},​
"timestamp": "2024-04-12T10:13:04Z",​
"value": "1m"​
},​
{​
"describedObject": {​
"kind": "Pod",​
"namespace": "kube-system",​
"name": "metrics-server-6c487585c5-fl792",​
"apiVersion": "/v1"​
},​
"metric": {​
"name": "k8s_pod_network_receive_throughput",​
"selector": null​
},​
"timestamp": "2024-04-12T10:13:04Z",​
"value": "18m"​
}​
// ...​
]​
}​
​
前提条件​
说明​
请将 prometheus-adapter 组件升级至 v1.1.0 及以上版本。如使用旧版本,则需要确保安装 prometheus-adapter 组件时配置的托管 Prometheus 工作区与集群绑定的托管 Prometheus 工作区一致。否则 prometheus-adapter 组件将无法正常转换数据。​
  • (可选)使用 kubectl 连接目标集群,详情请参见 连接集群。​
操作步骤​
步骤一:创建自定义指标并配置映射​
  1. 单击左侧导航栏中的 集群。​
  1. 在集群列表页面,单击需要配置的目标集群。​
  1. 在集群管理页面的左侧导航栏中,选择 配置管理 > 配置项,在kube-system命名空间下找到prometheus-adapter-config配置项,在 操作 栏中单击 编辑 Yaml,增加自定义指标的映射关系,本文以container_network_receive_bytes_total指标为例,自定义指标名称为k8s_pod_network_receive_throughput。​
  • ​
    rules:​
    - seriesQuery: 'container_network_receive_bytes_total'​
    resources:​
    overrides:​
    namespace: {resource: "namespace"}​
    pod: {resource: "pod"}​
    name: {as: 'k8s_pod_network_receive_throughput'}​
    metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>,cluster="ccmketollk1b***",pod!=""}[1m])) by (<<.GroupBy>>) / 125000.0'​
    ​
  1. 单击 确定,完成配置。​
步骤二:使用自定义指标配置 HPA​
  1. 创建工作负载。本示例以创建无状态负载(Deployment)为例。​
  • ​
    apiVersion: apps/v1​
    kind: Deployment​
    metadata:​
    name: workload-demo​
    namespace: default​
    spec:​
    replicas: 1​
    selector:​
    matchLabels:​
    app: workload-demo​
    template:​
    metadata:​
    labels:​
    app: workload-demo​
    spec:​
    containers:​
    - name: nginx​
    image: nginx:1.14.2​
    ports:​
    - containerPort: 80​
    ​
  1. 创建与工作负载关联的 HPA,指定按照自定义指标进行弹性伸缩。其中:​
  • metrics.type指定为Pods。​
  • metrics.pods.metric.name为上文中配置的自定义指标名称,即k8s_pod_network_receive_throughput。​
  • metrics.pods.target.type指定为AverageValue类型。​
  • metrics.pods.target.averageValue指定为触发扩容行为的阈值。​
  • ​
    apiVersion: autoscaling/v2​
    kind: HorizontalPodAutoscaler​
    metadata:​
    name: hpa-demo​
    spec:​
    scaleTargetRef:​
    apiVersion: apps/v1​
    kind: Deployment​
    name: workload-demo​
    minReplicas: 1​
    maxReplicas: 10​
    metrics:​
    - type: Pods​
    pods:​
    metric:​
    name: k8s_pod_network_receive_throughput # 配置为自定义指标名称​
    target:​
    type: AverageValue # AverageValue 类型的目标值,Pod 指标类型下只支持 AverageValue 类型的目标值​
    averageValue: 20 # 配置 HPA 触发阈值​
    ​
结果验证​
  1. 当 Pod 自定义指标达到阈值后会触发扩容,通过如下命令查看 HPA 信息。​
  • ​
    kubectl get hpa ​
    ​
  • 预期返回结果如下,Deployment 的副本数扩容到 2。​
  • ​
    NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE​
    hpa-demo Deployment/workload-demo 23/20m 1 10 2 62s ​
    ​
  1. 当 Pod 自定义指标的使用率下降到阈值以下会触发缩容,通过如下命令查看 HPA 信息。​
  • ​
    kubectl get hpa ​
    ​
  • 预期返回结果如下,Deployment 的副本数缩容到 1。​
  • ​
    NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE​
    hpa-demo Deployment/workload-demo 0/20m 1 10 1 20m​
    ​
​
最近更新时间:2026.04.01 17:14:09
这个页面对您有帮助吗?
有用
有用
无用
无用