Kubernetes HPA 基础:工作原理、Metrics Server 与自定义指标、水平扩缩容触发条件

水平 Pod 自动扩缩容(Horizontal Pod Autoscaler,HPA)是 Kubernetes 实现弹性伸缩的核心机制。它通过持续监控工作负载的资源利用率或自定义业务指标,自动调整 Pod 副本数量,使应用始终运行在预期的容量范围内。理解 HPA 的工作原理、指标来源与触发条件是构建容量调优体系的第一步。

HPA 工作原理

HPA 以控制循环(Control Loop)的方式运行,默认每 15 秒从 Metrics Server 或自定义指标 API 拉取一次指标数据,计算期望副本数,并与当前副本数对比,最终通过 Scale 子资源调整 Deployment、StatefulSet 或 ReplicaSet 的副本数。

核心计算逻辑:
期望副本数 = ceil(当前副本数 × (当前指标值 / 目标指标值))

当指标值超过目标值时,副本数向上取整扩容;低于目标值时,缩容。HPA 内置了冷却机制(Cooldown)和容忍窗口(Tolerance),防止指标抖动导致频繁扩缩。

冷却机制说明:默认扩容冷却时间为 3 分钟,缩容冷却时间为 5 分钟。这意味着 HPA 在触发一次扩缩动作后,必须等待冷却时间结束才能执行下一次扩缩,避免系统震荡。
HPA 控制循环流程 Metrics Server / 自定义指标 API HPA Controller 计算期望副本数 Scale 子资源(调整副本数) 循环间隔 15s 关键参数 • --horizontal-pod-autoscaler-sync-period • --horizontal-pod-autoscaler-downscale-stabilization • --horizontal-pod-autoscaler-tolerance

Metrics Server 与自定义指标

HPA 的指标来源分为三个层级,从基础资源指标到业务自定义指标,覆盖不同的扩缩容场景。

指标层级 数据来源 典型指标 适用场景
资源指标 Metrics Server(kubelet cAdvisor) CPU 使用率、内存使用率 通用型工作负载,资源敏感型应用
自定义指标 自定义指标 API(Prometheus Adapter / KEDA) QPS、请求延迟 P99、队列深度 业务驱动型扩缩容,如 Web 服务、消息处理
外部指标 外部指标 API(云厂商或第三方系统) Kafka 消费延迟、CloudWatch 队列长度 依赖外部系统的弹性场景
Metrics Server 部署前提:Metrics Server 不是 Kubernetes 默认安装的组件,必须手动部署。它通过 kubelet 的 Summary API 收集每个节点的资源使用数据,聚合后暴露给 HPA。如果集群中未部署 Metrics Server,基于 CPU/内存的 HPA 将无法工作。

水平扩缩容触发条件

HPA 的触发条件由 spec.metrics 字段定义,支持多种指标类型和聚合方式。以下是最常用的三种触发模式:

1. 基于资源指标的触发

直接使用 CPU 或内存的平均利用率(相对于 Pod 的 Request)作为触发条件。这是最基础的 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: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

2. 基于自定义指标的触发

通过 Prometheus Adapter 或 KEDA 将业务指标暴露给 HPA,实现更精细的弹性策略。

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-custom-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

3. 多指标组合触发

HPA 支持同时配置多个指标,系统会分别计算每个指标对应的期望副本数,最终取最大值作为扩缩容依据。

多指标决策逻辑:当 CPU 利用率要求扩容到 8 个副本,而 QPS 指标要求扩容到 12 个副本时,HPA 会选择 12 作为最终副本数。缩容时同样取最大值,确保不会因单一指标下降而过早缩容。
多指标 HPA 触发决策树 HPA Controller CPU 利用率 → 期望 8 副本 内存利用率 → 期望 5 副本 QPS 指标 → 期望 12 副本 取最大值:max(8, 5, 12) = 12 副本 执行 Scale 到 12 副本

触发条件的关键参数

HPA 的行为不仅取决于指标值,还受以下参数影响,这些参数直接决定了扩缩容的激进程度和稳定性。

参数 默认值 作用 调优建议
--horizontal-pod-autoscaler-sync-period 15s HPA 控制循环的轮询间隔 对延迟敏感的应用可缩短至 10s
--horizontal-pod-autoscaler-downscale-stabilization 5m 缩容稳定窗口,防止频繁缩容 突发流量场景可延长至 10m
--horizontal-pod-autoscaler-tolerance 0.1 容忍度,当前指标与目标指标的偏差比例 指标抖动大时可增大至 0.2
behavior.scaleUp.stabilizationWindowSeconds 0 扩容稳定窗口(HPA v2 行为配置) 快速扩容场景保持默认
behavior.scaleDown.stabilizationWindowSeconds 300 缩容稳定窗口(HPA v2 行为配置) 根据业务波动周期调整
生产环境最佳实践:在配置 HPA 时,始终设置 minReplicas 和 maxReplicas 的合理边界。minReplicas 应保证基础流量承载,maxReplicas 应防止无限扩容耗尽集群资源。同时,建议为关键业务配置多个指标(如 CPU + QPS),避免单一指标误判。