You need to enable JavaScript to run this app.
容器服务

容器服务

复制全文
指标伸缩(HPA)
使用自定义指标实现弹性伸缩
复制全文
使用自定义指标实现弹性伸缩

本文主要介绍创建指标伸缩时,通过 YAML 方式定义 HPA(Horizontal Pod Autoscaler,水平 Pod 弹性伸缩)的自定义指标,并进行弹性伸缩的操作步骤。

背景信息

基本概念

默认情况下,HPA (Horizontal Pod Autoscaler,水平 Pod 弹性伸缩)只支持基于 CPU 和内存的自动扩缩容,并不能满足复杂业务的诉求。通过在集群中开启云原生观测接入,可以监控、采集和查询集群中组件的各项指标。配合 prometheus-adapter 组件即可通过这些指标实现工作负载的自动扩缩容,使得业务负载可以更好地按需扩展,保证稳定性并平衡成本。

使用自定义指标进行弹性伸缩主要分为三个步骤:

  1. 在 VKE 集群中开启云原生观测,采集并透出指标。支持按需采集指标,详情请参见 基础观测
  2. 配置原始指标与自定义指标间的映射关系,通过 prometheus-adapter 实现两者的映射。
  3. 配置 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 原生资源,支持podnamespacenode等。当 HPA 使用自定义指标时,其会将该指标的原生资源名称自动填充为托管 Prometheus 中指标的标签。

说明

您可以通过kubectl api-resources -o wide命令,查看集群的原生资源。

name自定义指标名称,例如k8s_pod_network_receive_throughput,该自定义指标支持在 HPA 中使用。

metricsQuery

聚合托管 Prometheus 中指标的查询语句。其中:

  • <<.Series>>会被填充为seriesQuery中指定的原始指标。在本例中为container_network_receive_bytes_total
  • <<.LabelMatchers>>会被填充为待查询指标的namespacepod两个标签键值对。
  • <<.GroupBy>>会被填充为pod,即按照pod维度进行聚合。

注意

为了避免 prometheus-adapter 查询的指标量过大,seriesQuerymetricsQuery建议配置过滤标签。同时,由于托管 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 组件将无法正常转换数据。

操作步骤

步骤一:创建自定义指标并配置映射

  1. 登录 容器服务控制台
  2. 单击左侧导航栏中的 集群
  3. 在集群列表页面,单击需要配置的目标集群。
  4. 在集群管理页面的左侧导航栏中,选择 配置管理 > 配置项,在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. 登录 容器服务控制台
  2. 在左侧导航栏中选择 集群
  3. 单击目标集群,在集群管理页面的左侧导航栏中,选择 弹性伸缩 > 指标伸缩
  4. 在指标伸缩列表中,选择需要更新的指标伸缩,单击 操作 栏中的 ... > 更新

结果验证

  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   
    
  2. 当 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
    
最近更新时间:2025.04.14 11:26:00
这个页面对您有帮助吗?
有用
有用
无用
无用