4. HPA 算法与行为:扩缩容公式、稳定窗口与策略周期

HPA(Horizontal Pod Autoscaler)的核心在于一套闭环控制算法:它周期性地采集 Pod 的指标实际值,与用户设定的目标值进行比较,计算出期望副本数,再经过稳定窗口、策略和周期等行为约束,最终决定是否执行扩缩容操作。本章深入拆解这一算法的每个环节。

4.1 核心算法公式:期望副本数的计算

HPA 控制器在每个同步周期(默认 15 秒)内,对每个 Pod 计算当前指标的实际值,然后使用以下公式计算期望副本数:

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

其中:

  • currentReplicas:当前运行的 Pod 副本数。
  • currentMetricValue:所有目标 Pod 的指标实际值的聚合结果(如平均值、利用率)。
  • desiredMetricValue:用户在 HPA 中设定的目标值。
  • ceil:向上取整,确保副本数为整数。

关键理解: 该公式本质上是线性比例控制。当实际值超过目标值时,期望副本数按比例增加;当实际值低于目标值时,期望副本数按比例减少。例如,当前 10 个 Pod 的 CPU 平均利用率为 80%,目标值为 50%,则期望副本数 = ceil[10 × (80% / 50%)] = ceil[16] = 16 个 Pod。

4.2 目标值与实际值的计算口径

不同类型的指标,其“实际值”的聚合方式不同,直接影响扩缩容的灵敏度。

指标类型 实际值计算方式 典型场景
Resource Metric(CPU/内存) 所有目标 Pod 的指标值之和 ÷ Pod 数量(平均值) CPU 利用率、内存利用率
Pod Metric(自定义指标) 所有目标 Pod 的指标值之和 ÷ Pod 数量(平均值) QPS、请求延迟 P99
Object Metric(对象指标) 直接取单个对象的指标值(不除以 Pod 数) Ingress 的请求数、Service 的连接数

避坑提示: 对于 Pod Metric,如果某个 Pod 尚未就绪或刚启动,其指标可能为 0 或缺失,这会导致平均值被拉低,可能引发误缩容。建议配合 --horizontal-pod-autoscaler-tolerance(默认 0.1)的容忍度来避免微小波动导致的频繁扩缩。

4.3 稳定窗口(stabilizationWindowSeconds)

稳定窗口是 HPA 行为配置中最重要的平滑机制。它通过“历史决策缓存”来抑制噪声,防止副本数在短时间内剧烈抖动。

  • 扩容稳定窗口:HPA 在窗口期内记录所有“建议的期望副本数”,最终选择 最大值 作为实际执行值。这保证了系统能快速响应突发流量,不会因为单次采样回落而取消扩容。
  • 缩容稳定窗口:HPA 在窗口期内记录所有“建议的期望副本数”,最终选择 最小值 作为实际执行值。这避免了因瞬时指标抖动而过度缩容。

默认行为: 如果未显式配置 stabilizationWindowSeconds,Kubernetes 默认扩容稳定窗口为 0 秒(立即响应),缩容稳定窗口为 300 秒(5 分钟)。这是生产环境中最常见的误缩容来源——建议根据业务容忍度适当调整缩容窗口。

稳定窗口(Stabilization Window)决策流程 指标采样 每 15s 采集一次 计算期望副本数 公式:ceil(current × ratio) 稳定窗口缓存 扩容:取窗口内最大值 缩容:取窗口内最小值 最终执行副本数 经过窗口平滑后的值 默认值 扩容窗口:0s 缩容窗口:300s

4.4 策略(policy)与周期(periodSeconds)

策略和周期共同定义了 HPA 在单个时间窗口内允许变化的 Pod 数量上限,是防止扩缩容过冲的第二道防线。

4.4.1 策略类型

策略类型 含义 示例
Pods 在周期内最多允许变化 N 个 Pod pods: 4 → 每周期最多增减 4 个 Pod
Percent 在周期内最多允许变化当前副本数的百分比 percent: 50 → 当前 10 个 Pod,最多增减 5 个

4.4.2 周期(periodSeconds)

周期定义了策略生效的时间窗口。例如,periodSeconds: 60 表示每 60 秒内,策略限制的 Pod 变化量不能超过设定值。周期结束后,计数器重置。

组合使用示例:

behavior:
  scaleDown:
    policies:
    - type: Percent
      value: 10
      periodSeconds: 60
    - type: Pods
      value: 2
      periodSeconds: 60
    selectPolicy: Min  # 选择限制更严格的策略

上述配置表示:在每 60 秒内,缩容最多允许减少当前副本数的 10% 或 2 个 Pod(取两者中更小的值)。这有效防止了大规模缩容。

4.5 算法行为综合流程图

以下 SVG 展示了从指标采集到最终执行扩缩容的完整链路,包含稳定窗口和策略周期的交互位置。

HPA 扩缩容算法完整行为流程 1. 指标采集 Metrics Server / 自定义 API 2. 计算期望副本 公式:ceil(current × ratio) 3. 稳定窗口平滑 扩容取 max / 缩容取 min 4. 策略 & 周期检查 Pods / Percent + periodSeconds 5. 执行扩缩容 更新 Deployment / StatefulSet 关键参数速查表 • --horizontal-pod-autoscaler-sync-period:默认 15s,控制 HPA 循环频率 • --horizontal-pod-autoscaler-tolerance:默认 0.1(10%),实际值与目标值偏差在 10% 内不触发扩缩 • stabilizationWindowSeconds:扩容默认 0s,缩容默认 300s • selectPolicy:当配置多个策略时,可选 Max(取宽松)、Min(取严格)、Disabled(禁用该方向) • behavior.scaleUp 与 scaleDown:可分别配置扩容和缩容的稳定窗口、策略、周期,实现非对称行为

4.6 实战建议:如何校准 HPA 行为参数

  • 缩容稳定窗口:对于有流量突降风险的业务(如电商大促后的回落),建议将缩容窗口从 300s 缩短至 120-180s,避免长时间占用资源;对于稳定型业务,可保持默认或延长至 600s。
  • 扩容策略:对于突发流量场景,建议使用 Percent 策略并设置较大值(如 100%),配合 periodSeconds: 15,实现快速扩容。
  • 多指标 HPA:当配置多个指标时,HPA 会分别计算每个指标的期望副本数,最终取 最大值 作为目标副本数。确保各指标的目标值口径一致,避免相互矛盾。
  • 监控与告警:建议对 HPA 的 scale_up 和 scale_down 事件设置告警,结合 kubectl describe hpa 查看决策日志,验证算法行为是否符合预期。