You need to enable JavaScript to run this app.
导航
使用自定义指标实现弹性伸缩
最近更新时间:2024.07.24 16:13:37首次发布时间:2024.05.31 17:50:38

本文主要介绍创建指标伸缩时,通过 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