1. HPA 基础概念
1.1 什么是 HPA
HPA(Horizontal Pod Autoscaler) 是 Kubernetes 内置的水平 Pod 自动扩缩容控制器。它根据观察到的 CPU、内存或自定义指标,自动调整工作负载(Deployment、StatefulSet 等)的副本数,使应用始终运行在用户定义的期望负载范围内。
核心定义:HPA 是一个 Kubernetes API 资源(
autoscaling/v2),通过周期性采集指标、计算期望副本数、更新目标资源的 replicas 字段,实现无中断的弹性伸缩。
HPA 的工作流程可以概括为三个步骤:
- 指标采集——从 Metrics Server、Prometheus Adapter 或自定义 API 获取当前 Pod 的负载数据。
- 副本计算——根据公式
期望副本数 = ceil(当前副本数 × (当前指标值 / 目标指标值))计算所需 Pod 数量。 - 滚动更新——通过修改 Deployment/StatefulSet 的
replicas字段,触发控制器创建或销毁 Pod。
1.2 为什么需要 HPA
在生产环境中,应用负载具有明显的波动性和不可预测性。固定副本数部署会导致两个极端问题:
| 场景 | 固定副本数过少 | 固定副本数过多 |
|---|---|---|
| 用户体验 | 请求超时、响应缓慢、服务不可用 | 资源浪费,但无性能问题 |
| 资源成本 | 低(但不可用) | 高(持续支付闲置资源) |
| 运维负担 | 需要人工介入扩容 | 需要人工介入缩容 |
| 典型场景 | 突发流量、促销活动、定时任务高峰 | 夜间低峰、周末闲置、测试环境 |
实际案例:某电商平台在双十一期间流量峰值是平时的 50 倍。使用 HPA 后,系统在流量上升时自动扩容至 200 个 Pod,流量回落后自动缩容至 10 个 Pod,全年节省约 60% 的计算成本。
HPA 解决了以下核心痛点:
- 消除人工干预——无需运维人员 7×24 小时监控并手动调整副本数。
- 资源利用率最大化——按需分配 Pod 数量,避免长期闲置浪费。
- 应对突发流量——秒级响应指标变化,快速扩容保障 SLA。
- 精细化成本控制——结合 Cluster Autoscaler 实现节点级弹性,降低云支出。
1.3 HPA 与手动扩缩容的对比
手动扩缩容(kubectl scale)是运维人员通过命令直接修改副本数。HPA 则是基于指标的自动化决策。两者在多个维度存在显著差异:
| 对比维度 | 手动扩缩容 | HPA 自动扩缩容 |
|---|---|---|
| 操作方式 | 人工执行 kubectl scale 或修改 YAML |
控制器自动计算并更新 replicas |
| 响应速度 | 依赖人员响应时间(分钟~小时级) | 秒级~分钟级(取决于指标采集周期) |
| 决策依据 | 运维经验、监控告警、主观判断 | 客观指标数据、预设阈值、计算公式 |
| 适用场景 | 计划性扩容、故障应急、一次性调整 | 持续波动负载、微服务、生产环境 |
| 运维成本 | 高(需要专人值守) | 低(配置一次,长期生效) |
| 可预测性 | 完全可控(但滞后) | 依赖指标质量,存在震荡风险 |
注意:HPA 并非万能方案。在指标采集延迟高、指标抖动剧烈或目标副本数过小时,HPA 可能出现震荡(频繁扩缩)。建议配合
--horizontal-pod-autoscaler-downscale-stabilization 冷却窗口和 behavior 策略来抑制震荡。
1.4 何时选择 HPA
根据实际场景选择扩缩容方式:
- 优先使用 HPA:生产环境核心服务、微服务架构、负载波动频繁的应用、需要 SLA 保障的业务。
- 保留手动扩缩容:一次性迁移、故障恢复、测试环境临时调整、HPA 尚未配置的紧急场景。
- 混合使用:HPA 设置最大/最小副本数兜底,手动扩缩容用于计划性大促前的预热扩容。