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 分钟)。这是生产环境中最常见的误缩容来源——建议根据业务容忍度适当调整缩容窗口。
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 展示了从指标采集到最终执行扩缩容的完整链路,包含稳定窗口和策略周期的交互位置。
4.6 实战建议:如何校准 HPA 行为参数
- 缩容稳定窗口:对于有流量突降风险的业务(如电商大促后的回落),建议将缩容窗口从 300s 缩短至 120-180s,避免长时间占用资源;对于稳定型业务,可保持默认或延长至 600s。
- 扩容策略:对于突发流量场景,建议使用
Percent策略并设置较大值(如 100%),配合periodSeconds: 15,实现快速扩容。 - 多指标 HPA:当配置多个指标时,HPA 会分别计算每个指标的期望副本数,最终取 最大值 作为目标副本数。确保各指标的目标值口径一致,避免相互矛盾。
- 监控与告警:建议对 HPA 的
scale_up和scale_down事件设置告警,结合kubectl describe hpa查看决策日志,验证算法行为是否符合预期。