4. HPA基础:Horizontal Pod Autoscaler工作原理、指标采集与扩缩容决策

Horizontal Pod Autoscaler(HPA)是 Kubernetes 实现工作负载弹性伸缩的核心控制器。在 Serverless 与容量 SLO 场景中,HPA 负责根据实时负载指标自动调整 Pod 副本数,从而在满足性能目标的同时控制资源成本。理解 HPA 的完整工作链路——从指标采集、聚合计算到扩缩容决策——是构建可靠容量管理面板的前提。

4.1 HPA 核心工作流程

HPA 以控制循环(Control Loop)方式运行,默认每 15 秒(由 --horizontal-pod-autoscaler-sync-period 控制)执行一次完整的“采集-计算-决策-执行”流程。下图展示了 HPA 从指标源到最终扩缩容动作的完整链路:

HPA 指标采集与扩缩容决策流程 HPA 指标采集与扩缩容决策流程 指标源 Metrics Server / 自定义API 指标采集 kube-apiserver 代理 HPA Controller 控制循环计算 扩缩容决策 期望副本数计算 Deployment / RS 更新副本数 Pod 实例 反馈循环(15s 周期) 关键参数 • 同步周期:15s(默认) • 稳定窗口:300s(默认) • 容忍度:0.1(10%)

4.2 指标采集机制

HPA 支持三类指标源,每种指标的采集路径与聚合方式不同:

指标类型 采集源 聚合方式 典型指标
Resource Metric Metrics Server(kubelet cAdvisor) 所有 Pod 当前值取平均 CPU 使用率、内存使用率
Custom Metric 自定义 API(Prometheus Adapter 等) 按 Pod 标签聚合或取平均值 QPS、请求延迟 P99
External Metric 外部系统 API(云服务、消息队列) 全局单一值,不按 Pod 拆分 队列深度、连接数
实践建议:在 Serverless 容量 SLO 场景中,推荐优先使用 Custom Metric(如请求速率、错误率)作为扩缩容依据,因为 CPU 使用率在突发流量下存在滞后性,且受 Pod 规格影响较大。

4.3 扩缩容决策算法

HPA 控制器在每个同步周期执行以下核心计算:

期望副本数 = ceil( 当前副本数 × ( 当前指标值 / 目标指标值 ) )

以 CPU 使用率为例,假设目标值为 50%,当前 Pod 平均使用率为 80%,当前副本数为 3:

期望副本数 = ceil( 3 × ( 80% / 50% ) ) = ceil( 4.8 ) = 5

HPA 在决策过程中还包含以下关键机制:

  • 容忍度(Tolerance):默认 0.1(10%),当 |当前指标值 / 目标指标值 - 1| < 0.1 时,不触发扩缩容,避免频繁抖动。
  • 冷却窗口(Cooldown):通过 --horizontal-pod-autoscaler-downscale-stabilization-window(默认 5 分钟)防止快速缩容导致的服务波动。
  • 扩缩容速率限制:每 15 秒周期内,扩容最多翻倍,缩容最多减半,防止系统过载。

4.4 多指标组合决策

当 HPA 配置了多个指标时,控制器会分别计算每个指标对应的期望副本数,然后取 最大值 作为最终决策:

多指标组合决策示例 多指标组合决策:取最大值 指标1:CPU 使用率 当前 80% → 目标 50% 期望副本数:5 指标2:QPS 当前 1200 → 目标 800 期望副本数:6 指标3:内存使用率 当前 60% → 目标 70% 期望副本数:3 最终决策:max(5, 6, 3) = 6
注意:多指标配置时,如果某个指标数据缺失(例如 Metrics Server 重启导致 CPU 数据暂时不可用),HPA 会跳过该指标,仅基于可用指标进行决策。这可能导致扩缩容行为与预期不符,建议在面板中监控指标健康状态。

4.5 HPA 配置示例

以下是一个生产级 HPA 配置,同时使用 CPU 使用率和自定义 QPS 指标:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: serverless-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: serverless-app
  minReplicas: 2
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60
  - type: Pods
    pods:
      metric:
        name: requests_per_second
      target:
        type: AverageValue
        averageValue: 800
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Percent
        value: 50
        periodSeconds: 60
    scaleUp:
      stabilizationWindowSeconds: 0
      policies:
      - type: Percent
        value: 100
        periodSeconds: 60
      - type: Pods
        value: 4
        periodSeconds: 60
      selectPolicy: Max

4.6 关键参数速查表

参数 默认值 说明 调优建议
--horizontal-pod-autoscaler-sync-period 15s HPA 控制循环周期 Serverless 场景可缩短至 10s
--horizontal-pod-autoscaler-downscale-stabilization-window 5min 缩容稳定窗口 延迟敏感服务可缩短至 2min
--horizontal-pod-autoscaler-tolerance 0.1 扩缩容容忍度 高精度场景可设为 0.05
behavior.scaleDown.stabilizationWindowSeconds 300 HPA 行为配置中的缩容窗口 覆盖全局默认值
关键要点:
  • HPA 是 Kubernetes 原生弹性控制器,通过控制循环实现自动扩缩容。
  • 指标采集支持 Resource、Custom、External 三类,Serverless 场景推荐使用 Custom Metric。
  • 扩缩容决策基于 期望副本数 = ceil(当前副本数 × 当前指标值 / 目标指标值)。
  • 多指标时取最大值,配合容忍度和冷却窗口防止抖动。
  • 生产环境应配置 behavior 字段精细控制扩缩容速率。