Kubernetes HPA 基础回顾:HPA 工作原理、Metrics Server、自定义指标与聚合层

Horizontal Pod Autoscaler(HPA)是 Kubernetes 中实现工作负载弹性伸缩的核心控制器。它通过持续监测 Pod 的负载指标,自动调整副本数量,使应用在流量高峰时获得足够资源,在低谷时释放闲置资源。理解 HPA 的工作原理、指标来源以及聚合层机制,是构建可靠弹性基础设施的前提。

2.1 HPA 工作原理

HPA 以控制循环(Control Loop)方式运行,默认每 15 秒从指标源拉取数据,并根据当前指标值与目标值的比值计算期望副本数。其核心计算公式如下:

desiredReplicas = ceil[currentReplicas × (currentMetricValue / desiredMetricValue)]

HPA 控制器的工作流程分为四个阶段:

  1. 指标采集:通过 Metrics Server 或自定义指标 API 获取当前 Pod 的 CPU、内存或自定义指标值。
  2. 副本计算:根据公式计算期望副本数,并考虑冷却窗口(Cooldown)和容忍度(Tolerance)避免频繁抖动。
  3. 更新目标:调用 Kubernetes API 更新 Deployment/StatefulSet 的 replicas 字段。
  4. 扩缩容执行:ReplicaSet 控制器根据新的副本数创建或删除 Pod。
冷却窗口说明: HPA 默认水平扩容冷却时间为 3 分钟,缩容冷却时间为 5 分钟。这是为了防止指标短暂波动导致副本数频繁变化,影响系统稳定性。
HPA 控制循环流程图 ① 指标采集 ② 副本计算 ③ 更新目标 ④ 扩缩容执行 循环间隔 15s 关键参数 • 默认采集间隔:15s • 扩容冷却:3min • 缩容冷却:5min • 容忍度:默认 0.1

2.2 Metrics Server:资源指标的基石

Metrics Server 是 Kubernetes 集群中资源指标(CPU、内存)的聚合器。它从每个节点上的 kubelet 内置 cAdvisor 接口采集数据,通过 metrics.k8s.io API 对外暴露。Metrics Server 采用内存存储,不持久化历史数据,因此适合用于 HPA 等实时弹性场景。

特性 说明
数据来源 每个节点 kubelet 内置的 cAdvisor
API 组 metrics.k8s.io
存储方式 内存存储,无持久化
采集粒度 默认 60s 轮询一次
资源占用 极低,适合生产环境
支持的指标 CPU 使用率(m)、内存使用量(Mi)
注意: Metrics Server 不适用于监控告警或历史趋势分析。如果需要长期存储指标数据,应结合 Prometheus + Thanos 或 VictoriaMetrics 等方案。

2.3 自定义指标与聚合层

当业务需要基于 QPS、请求延迟、队列深度等自定义指标进行弹性伸缩时,仅靠 Metrics Server 的 CPU/内存指标是不够的。Kubernetes 通过 API 聚合层(API Aggregation Layer) 扩展了指标 API,支持三类指标来源:

  • 资源指标(Resource Metrics):由 Metrics Server 提供,对应 metrics.k8s.io API。
  • 自定义指标(Custom Metrics):由用户部署的适配器提供,对应 custom.metrics.k8s.io API,例如基于 Prometheus Adapter 暴露的应用指标。
  • 外部指标(External Metrics):来自集群外部的指标源,对应 external.metrics.k8s.io API,例如云厂商的负载均衡器连接数、消息队列积压量。

API 聚合层的工作原理如下:

  1. 用户部署一个实现了 /apis/custom.metrics.k8s.io/v1beta1 或 /apis/external.metrics.k8s.io/v1beta1 的 API 服务(如 Prometheus Adapter、Kubernetes Metrics Adapter)。
  2. 该服务注册到 Kubernetes API Server 的聚合层中。
  3. HPA 控制器通过聚合层统一查询指标,无需关心底层数据源的具体实现。
API 聚合层指标架构图 HPA 控制器 API 聚合层(Aggregation Layer) Metrics Server metrics.k8s.io Prometheus Adapter custom.metrics.k8s.io 云厂商 Adapter external.metrics.k8s.io 指标类型对比 资源指标:CPU、内存,由 Metrics Server 提供,无需额外部署 自定义指标:应用级指标(QPS、延迟),需部署 Prometheus Adapter 等适配器

2.4 HPA 配置示例

以下是一个基于 CPU 和自定义 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: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Pods
    pods:
      metric:
        name: http_requests_per_second
      target:
        type: AverageValue
        averageValue: 1000
关键配置说明:
  • autoscaling/v2:支持多指标组合,HPA 会选择所有指标中计算出的最大副本数。
  • type: Resource:引用 Metrics Server 提供的资源指标。
  • type: Pods:引用自定义指标,指标值按 Pod 平均计算。
  • averageUtilization:目标使用率百分比,HPA 会根据当前 Pod 的 Request 值计算。

2.5 常见问题与最佳实践

问题 原因 解决方案
HPA 无法获取指标 Metrics Server 未部署或 Pod 未设置 Resource Request 部署 Metrics Server,确保 Deployment 设置 CPU/Memory Request
扩缩容抖动频繁 指标波动大,冷却窗口过短 调整 --horizontal-pod-autoscaler-downscale-stabilization 参数
自定义指标不生效 API 聚合层未正确注册适配器 检查 APIService 状态,确认适配器 Pod 运行正常
缩容过慢导致资源浪费 默认缩容冷却 5 分钟过长 根据业务容忍度适当缩短冷却时间,或使用 KEDA 等高级方案