2. HPA 指标类型:资源指标、自定义指标与外部指标

HPA(Horizontal Pod Autoscaler)的扩缩容决策完全依赖于指标数据。理解指标的类型、来源与聚合方式是校准 SLO 和配置 HPA 策略的基础。Kubernetes 将 HPA 支持的指标划分为三大类:资源指标、自定义指标和外部指标。

2.1 资源指标(Resource Metrics)

资源指标是最基础、最常用的指标类型,由 Metrics Server 从 kubelet 的 cAdvisor 收集,并通过 metrics.k8s.io API 暴露。HPA 直接使用 Pod 的 requests 值作为分母计算利用率。

指标名称 来源 聚合方式 典型用途
cpu Metrics Server / cAdvisor 利用率(当前使用量 / requests) CPU 密集型服务扩缩容
memory Metrics Server / cAdvisor 利用率(当前使用量 / requests) 内存敏感型服务保护
口径校准要点: 资源指标默认使用 利用率(Utilization) 而非原始使用量。利用率 = Pod 当前使用量 ÷ Pod 的 requests 值。如果 requests 设置过高或过低,会导致 HPA 行为异常。SLO 校准时应优先检查 Pod 的 requests 配置是否合理。

2.2 自定义指标(Custom Metrics)

自定义指标允许用户基于应用层数据(如 QPS、请求延迟 P99、队列深度)进行扩缩容。这些指标通过 Custom Metrics API(custom.metrics.k8s.io)暴露,通常由 Prometheus Adapter、Kubernetes Metrics Adapter 或 Datadog Cluster Agent 等适配器提供。

  • 指标来源: Prometheus、StatsD、Datadog、自定义 exporter
  • 聚合粒度: 支持 Pod 级别聚合(平均值、总和)和 Object 级别聚合(单个对象的指标值)
  • 典型场景: 基于 HTTP 请求速率、gRPC 延迟、消息队列积压、数据库连接数
# HPA 使用自定义指标示例(基于 QPS)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: webapp-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: webapp
  minReplicas: 2
  maxReplicas: 20
  metrics:
  - type: Pods
    pods:
      metric:
        name: http_requests_per_second
      target:
        type: AverageValue
        averageValue: 1000
常见陷阱: 自定义指标适配器配置复杂,容易因指标名称不匹配、标签缺失或聚合周期不一致导致 HPA 无法获取数据。建议在部署前使用 kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1 验证指标是否正常暴露。

2.3 外部指标(External Metrics)

外部指标用于引用 集群外部 的指标数据,例如云服务商提供的负载均衡器连接数、消息队列(如 AWS SQS、Kafka)的积压消息数、数据库连接池使用率等。这些指标通过 External Metrics API(external.metrics.k8s.io)暴露。

特性 资源指标 自定义指标 外部指标
数据范围 集群内 Pod 集群内 Pod / Object 集群外系统
API 组 metrics.k8s.io custom.metrics.k8s.io external.metrics.k8s.io
聚合方式 利用率 / 平均值 平均值 / 目标值 目标值
典型适配器 Metrics Server Prometheus Adapter AWS / GCP / Azure 云适配器
# HPA 使用外部指标示例(基于 AWS SQS 队列深度)
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_approximate_number_of_messages_visible
        selector:
          matchLabels:
            queue: my-queue
      target:
        type: AverageValue
        averageValue: 100

2.4 指标来源与聚合架构

下图展示了 HPA 指标采集、聚合与决策的完整链路:

HPA 指标来源与聚合架构 资源指标 Metrics Server CPU / Memory 利用率 自定义指标 Prometheus Adapter QPS / 延迟 / 队列深度 外部指标 云服务适配器 SQS / Kafka / LB 连接数 Kubernetes API Server 聚合层 metrics.k8s.io | custom.metrics.k8s.io | external.metrics.k8s.io HPA 控制器 指标聚合 → 目标副本数计算 → 更新 Deployment/StatefulSet Deployment / StatefulSet 指标聚合周期:15s 默认同步间隔:15s

2.5 指标聚合与目标值类型

HPA v2 支持三种目标值类型,不同指标类型适用的聚合方式不同:

目标值类型 适用指标类型 计算方式 示例
Utilization 资源指标(CPU/Memory) 所有 Pod 当前使用量之和 ÷ 所有 Pod requests 之和 CPU 利用率目标 80%
AverageValue 自定义指标(Pods 类型)、外部指标 所有 Pod 指标值之和 ÷ Pod 副本数 平均 QPS 目标 1000
Value 自定义指标(Object 类型)、外部指标 直接使用指标原始值,不除以副本数 Ingress 连接数目标 5000
SLO 校准建议:
  • 资源指标: 将 HPA 目标利用率设置为 SLO 响应时间阈值的 60%-70%,预留缓冲空间。
  • 自定义指标: 优先使用 AverageValue 类型,确保指标口径与业务 SLO 对齐(如 P99 延迟 ≤ 200ms)。
  • 外部指标: 注意指标采集延迟(通常 1-5 分钟),避免因数据滞后导致扩缩容震荡。

2.6 多指标组合策略

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: http_requests_per_second
      target:
        type: AverageValue
        averageValue: 500
  - type: External
    external:
      metric:
        name: queue_depth
      target:
        type: AverageValue
        averageValue: 50
多指标冲突处理: 当不同指标给出的建议副本数差异较大时(如 CPU 建议 5 副本,队列深度建议 20 副本),HPA 会采用最大值。这可能导致资源浪费,建议将指标目标值校准到相近的扩缩容阈值区间。