4. HPA 支持的指标类型:资源指标、自定义指标与外部指标

Kubernetes Horizontal Pod Autoscaler (HPA) 的核心决策依据来自指标数据。根据指标来源与抽象层级,HPA 支持三类指标:资源指标 (Resource Metrics)、自定义指标 (Custom Metrics) 和 外部指标 (External Metrics)。理解三者的区别与适用场景,是配置高效弹性伸缩策略的前提。

核心原则:资源指标用于“容量驱动”的伸缩,自定义指标用于“业务驱动”的伸缩,外部指标用于“事件驱动”的伸缩。选择错误的指标类型会导致伸缩滞后或误触发。

4.1 三类指标对比总览

维度 资源指标 自定义指标 外部指标
数据来源 cAdvisor / Metrics Server Prometheus / Datadog / 自定义 API 云厂商服务 (AWS SQS / Azure SB / GCP PubSub)
指标粒度 Pod 级别 (CPU/内存) Pod 级别 / 对象级别 (QPS / 连接数) 集群外部全局值 (队列深度 / 事件数)
API 端点 metrics.k8s.io custom.metrics.k8s.io external.metrics.k8s.io
配置复杂度 低 (开箱即用) 中 (需部署 Adapter) 高 (需云厂商集成 + Adapter)
典型场景 Web 服务器、批处理任务 API 网关、消息消费者 事件驱动工作负载、队列处理
伸缩响应速度 中等 (15-30s 延迟) 快 (5-15s,取决于采集间隔) 快 (可实时感知外部事件)

4.2 资源指标 (Resource Metrics)

资源指标是 HPA 最基础的指标类型,直接反映 Pod 的物理资源消耗。Kubernetes 通过 Metrics Server 从每个节点上的 cAdvisor 收集 CPU 和内存使用数据,并通过 metrics.k8s.io API 对外暴露。

  • CPU 指标:以 millicores (m) 为单位,表示 Pod 当前使用的 CPU 时间相对于其 requests 的百分比。例如,targetAverageUtilization: 80 表示当 Pod 平均 CPU 使用率达到 80% 时触发扩容。
  • 内存指标:以字节为单位,表示 Pod 当前内存使用量相对于 requests 的百分比。内存指标通常用于内存密集型应用,如缓存服务或数据处理任务。
适用场景:
  • 无状态 Web 服务:CPU 使用率与请求量呈正相关,适合用 CPU 指标驱动伸缩。
  • 批处理任务:内存占用随数据量增长,适合用内存指标控制 Pod 数量。
  • 快速原型验证:无需额外组件,Metrics Server 安装后即可使用。
局限性:资源指标无法反映业务层面的真实负载。例如,一个 Pod 的 CPU 使用率很低,但可能因为死锁而无法处理请求;或者 CPU 使用率很高,但请求处理效率反而下降(如 I/O 等待)。此时需要自定义指标来补充。

4.3 自定义指标 (Custom Metrics)

自定义指标允许用户基于应用内部的业务数据来驱动伸缩。这些指标通常由 Prometheus Adapter、Datadog Cluster Agent 或 Kubernetes Metrics Adapter 等组件从监控系统中获取,并通过 custom.metrics.k8s.io API 暴露给 HPA。

自定义指标可以按两种粒度配置:

  • Pod 级别指标:每个 Pod 独立上报指标值,HPA 计算所有 Pod 的平均值。例如,每个 Pod 的 HTTP 请求数 (QPS)。
  • 对象级别指标:指标绑定到某个 Kubernetes 对象(如 Service、Ingress),HPA 直接读取该对象的指标值。例如,Ingress 的每秒请求总数。
# 基于 Pod 级别 QPS 的 HPA 配置示例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  minReplicas: 2
  maxReplicas: 20
  metrics:
  - type: Pods
    pods:
      metric:
        name: http_requests_per_second
      target:
        type: AverageValue
        averageValue: 1000
最佳实践:自定义指标应选择与应用吞吐量直接相关的业务指标,如 QPS、活跃连接数、队列处理速率。避免使用过于底层的指标(如 GC 次数)或过于聚合的指标(如集群总请求数)。

4.4 外部指标 (External Metrics)

外部指标用于感知 Kubernetes 集群外部的系统状态,通常来自云厂商的托管服务。这些指标通过 external.metrics.k8s.io API 暴露,需要部署对应的 External Metrics Adapter(如 AWS CloudWatch Adapter、Azure Monitor Adapter)。

外部指标的核心价值在于:在事件到达集群之前触发伸缩,从而消除“先感知、后伸缩”的延迟。

云服务 典型外部指标 适用场景
AWS SQS ApproximateNumberOfMessagesVisible 消息消费者工作负载,根据队列深度伸缩
Azure Service Bus ActiveMessages 事件驱动架构,根据消息积压量伸缩
GCP Pub/Sub subscription/num_undelivered_messages 流处理任务,根据未确认消息数伸缩
AWS S3 / CloudFront BucketSizeBytes / Requests 数据处理管道,根据存储量或请求率伸缩
# 基于 AWS SQS 队列深度的 HPA 配置示例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: sqs-consumer-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: sqs-consumer
  minReplicas: 1
  maxReplicas: 50
  metrics:
  - type: External
    external:
      metric:
        name: aws_sqs_queue_depth
        selector:
          matchLabels:
            queue: my-queue
      target:
        type: AverageValue
        averageValue: 100

4.5 三类指标的选择决策流程

HPA 指标类型选择决策流程 确定伸缩驱动因素 指标来源 在集群内部? 是 指标粒度 Pod 级别? 是 资源指标 CPU / 内存 否 自定义指标 QPS / 连接数 / 延迟 否 外部指标 队列深度 / 事件数 配置 HPA 指标数组 可组合多种指标类型 💡 组合策略 资源指标 + 自定义指标 可同时配置,取最大值

4.6 多指标组合策略

HPA 允许在同一个 metrics 数组中配置多种指标类型。当配置多个指标时,HPA 会分别计算每个指标建议的副本数,然后取最大值作为最终的伸缩目标。这种机制可以避免单一指标的盲区。

# 多指标组合 HPA 示例:资源指标 + 自定义指标
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: multi-metric-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: api-server
  minReplicas: 3
  maxReplicas: 30
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Pods
    pods:
      metric:
        name: requests_per_second
      target:
        type: AverageValue
        averageValue: 500
组合策略建议:
  • 基础 + 业务:CPU 资源指标作为保底伸缩条件,QPS 自定义指标作为业务驱动条件。当 CPU 未达到阈值但 QPS 激增时,HPA 仍会扩容。
  • 内部 + 外部:内存资源指标控制 Pod 数量上限,外部队列深度指标触发提前扩容。适用于消息消费者场景。
  • 避免冗余:不要同时配置 CPU 和内存两个资源指标,除非应用对两者都有明确的线性关系。通常选择一个即可。

4.7 指标适配器部署要求

自定义指标和外部指标需要额外的适配器组件才能被 HPA 使用。以下是常见适配器的部署要点:

适配器 支持的指标类型 部署方式 关键配置
Prometheus Adapter 自定义指标 Helm Chart / 手动部署 prometheus.url、rules 指标映射规则
Kubernetes Metrics Adapter 自定义指标 + 外部指标 Helm Chart metricSources 配置外部数据源
AWS CloudWatch Adapter 外部指标 (AWS) Helm Chart + IAM 角色 region、metrics 列表
Azure Monitor Adapter 外部指标 (Azure) Helm Chart + 托管身份 azure.resourceGroup、azure.subscriptionId
注意:适配器本身会成为集群的故障点。建议为适配器配置资源限制和 Pod 反亲和性,避免适配器宕机导致 HPA 无法获取指标。同时,适配器的指标采集延迟会直接影响 HPA 的响应速度,应确保采集间隔 ≤ 15s。
三类指标在 HPA 伸缩流程中的位置 数据源层 Metrics Server cAdvisor → CPU/内存 Prometheus Adapter Prometheus → 自定义指标 CloudWatch Adapter AWS SQS → 外部指标 API 层 metrics.k8s.io | custom.metrics.k8s.io | external.metrics.k8s.io HPA 控制器 HorizontalPodAutoscaler → 计算目标副本数 (取最大值) Deployment / StatefulSet

4.8 选择建议与避坑指南

  • 优先使用资源指标:对于大多数无状态应用,CPU 指标已经足够。不要为了“炫技”而引入自定义指标,增加运维复杂度。
  • 自定义指标要选择“领先指标”:选择那些在资源消耗之前就能反映负载变化的指标。例如,QPS 上升 10 秒后 CPU 才会上升,那么 QPS 就是领先指标。
  • 外部指标要注意数据新鲜度:云服务指标通常有 1-5 分钟的延迟。如果应用对延迟敏感,考虑使用更实时的指标源或缩短适配器的轮询间隔。
  • 避免指标数量过多:HPA 每次评估都会查询所有配置的指标。指标越多,API 调用次数越多,评估延迟越大。建议不超过 3 个指标。
  • 测试指标可用性:在配置 HPA 之前,先通过 kubectl get --raw 验证指标 API 是否返回数据。例如:kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"。