1. HPA 基础概念

1.1 什么是 HPA

HPA(Horizontal Pod Autoscaler) 是 Kubernetes 内置的水平 Pod 自动扩缩容控制器。它根据观察到的 CPU、内存或自定义指标,自动调整工作负载(Deployment、StatefulSet 等)的副本数,使应用始终运行在用户定义的期望负载范围内。

核心定义:HPA 是一个 Kubernetes API 资源(autoscaling/v2),通过周期性采集指标、计算期望副本数、更新目标资源的 replicas 字段,实现无中断的弹性伸缩。

HPA 的工作流程可以概括为三个步骤:

  1. 指标采集——从 Metrics Server、Prometheus Adapter 或自定义 API 获取当前 Pod 的负载数据。
  2. 副本计算——根据公式 期望副本数 = ceil(当前副本数 × (当前指标值 / 目标指标值)) 计算所需 Pod 数量。
  3. 滚动更新——通过修改 Deployment/StatefulSet 的 replicas 字段,触发控制器创建或销毁 Pod。
HPA 核心工作流程 指标源 Metrics Server / Prometheus HPA 控制器 期望副本数计算 目标工作负载 Deployment / StatefulSet 指标数据 更新 replicas 关键计算逻辑 期望副本数 = ceil( 当前副本数 × ( 当前指标值 / 目标指标值 ) ) • 当指标值 > 目标值 → 扩容(增加副本) • 当指标值 < 目标值 → 缩容(减少副本) • 支持冷却窗口、最大/最小副本数限制

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
响应速度 依赖人员响应时间(分钟~小时级) 秒级~分钟级(取决于指标采集周期)
决策依据 运维经验、监控告警、主观判断 客观指标数据、预设阈值、计算公式
适用场景 计划性扩容、故障应急、一次性调整 持续波动负载、微服务、生产环境
运维成本 高(需要专人值守) 低(配置一次,长期生效)
可预测性 完全可控(但滞后) 依赖指标质量,存在震荡风险
手动扩缩容 vs HPA 自动扩缩容 手动扩缩容 运维人员 监控告警 人工决策:判断是否扩容/缩容 执行 kubectl scale 命令 HPA 自动扩缩容 指标采集器 HPA 控制器 自动计算期望副本数 自动更新 Deployment replicas 手动:依赖人 → 响应慢 → 易出错 | HPA:依赖指标 → 秒级响应 → 稳定可靠
注意:HPA 并非万能方案。在指标采集延迟高、指标抖动剧烈或目标副本数过小时,HPA 可能出现震荡(频繁扩缩)。建议配合 --horizontal-pod-autoscaler-downscale-stabilization 冷却窗口和 behavior 策略来抑制震荡。

1.4 何时选择 HPA

根据实际场景选择扩缩容方式:

  • 优先使用 HPA:生产环境核心服务、微服务架构、负载波动频繁的应用、需要 SLA 保障的业务。
  • 保留手动扩缩容:一次性迁移、故障恢复、测试环境临时调整、HPA 尚未配置的紧急场景。
  • 混合使用:HPA 设置最大/最小副本数兜底,手动扩缩容用于计划性大促前的预热扩容。