1. HPA 介绍
Kubernetes Horizontal Pod Autoscaler (HPA) 通过监控 Pod 的资源使用情况(如 CPU、内存、自定义指标等),自动调整 Pod 的副本数量,以保持应用的高可用性和资源利用率。
2. HPA 扩缩容机制
2.1 扩容机制(Scaling Up)
-
检查间隔:默认每 15 秒 采样一次(可配置
--horizontal-pod-autoscaler-sync-period
)。 - 触发条件:当负载指标 超过 设定的目标值,HPA 立即 扩容。
-
计算逻辑:
- HPA 计算 每个 Pod 需要的资源,并决定需要多少个 Pod 来满足目标值。
- Pod 副本数取向上取整的计算值。
- 计算时,取 过去若干采样周期内的最大值 以确保负载高峰能够被正确处理。
🔹 示例:
当前 Pod 数量:3
CPU 目标值:50%
当前 CPU 使用率(取最近几次采样的最大值):75%
计算公式:
新Pod数 = 当前Pod数 * (当前CPU使用率 / 目标CPU使用率) = 3 * (75 / 50) = 4.5
,向上取整为 5最终决定:扩容到 5 个 Pod
-
时间消耗:
- 采样时间:15 秒
- 触发扩容:立即
- Pod 启动时间:30s - 1min(取决于镜像大小、调度速度等)
- 最终扩容完成时间 ≈ 30s - 1min
-
扩容稳定性窗口(可选):
- 默认 无稳定性窗口(
--horizontal-pod-autoscaler-upscale-stabilization=0
)。 - 可配置一个时间窗口,在该窗口内取 最小 Pod 需求值,防止瞬时流量峰值导致过度扩容。
- 默认 无稳定性窗口(
2.2 缩容机制(Scaling Down)
- 检查间隔:默认每 15 秒 采样一次。
- 触发条件:当负载指标 低于 设定目标值,HPA 需要观察 稳定性窗口(默认 5 分钟) 后才会缩容。
-
计算逻辑:
- HPA 在 过去 5 分钟窗口内 计算 最大 Pod 需求值,以决定是否缩容。
- 避免负载短时间下降导致不必要的缩容。
- 计算时,取 过去若干采样周期内的最小值,确保缩容不会导致应用不可用。
🔹 示例:
当前 Pod 数量:5
CPU 目标值:50%
当前 CPU 使用率(取最近几次采样的最小值):25%
计算公式:
新Pod数 = 当前Pod数 * (当前CPU使用率 / 目标CPU使用率) = 5 * (25 / 50) = 2.5
,向下取整为 3最终决定:缩容到 3 个 Pod
-
时间消耗:
- 采样时间:15 秒
- 观察窗口:默认 5 分钟(可配置
--horizontal-pod-autoscaler-downscale-stabilization=300
) - 优雅终止 Pod(默认
terminationGracePeriodSeconds=30
秒) - 最终缩容完成时间 ≈ 5min 30s
3. HPA 配置参数
参数 | 作用 | 默认值 |
---|---|---|
--horizontal-pod-autoscaler-sync-period |
HPA 采样间隔 | 15s |
--horizontal-pod-autoscaler-downscale-stabilization |
缩容稳定性窗口,过去 N 秒内取最大 Pod 需求值 | 300s(5 分钟) |
--horizontal-pod-autoscaler-upscale-stabilization |
扩容稳定性窗口,过去 N 秒内取最小 Pod 需求值 | 0s(立即扩容) |
4. 结论
操作 | 触发条件 | 触发所需时间 | 额外等待 | 总时间 |
---|---|---|---|---|
扩容 | 指标 高于 目标值 | 15 秒内 | Pod 启动时间(30s-1min) | 30s - 1min |
缩容 | 指标 低于 目标值 持续 5 分钟 | 5 分钟 | Pod 终止时间(30s) | 5min 30s |
5. 调优建议
-
减少扩容抖动:可设置
--horizontal-pod-autoscaler-upscale-stabilization
避免瞬时峰值导致过度扩容。 -
优化缩容响应速度:适当降低
--horizontal-pod-autoscaler-downscale-stabilization
,减少缩容等待时间。 - Pod 启动优化:确保应用启动时间较短,避免扩容时影响可用性。
通过合理配置 HPA,可实现自动化扩缩容,保障应用的稳定性和资源利用率。