4. 自动扩缩容(Autoscaling)基础:水平扩缩(HPA)与垂直扩缩(VPA)的区别,以及触发条件

在基于 Error Budget 的 SLO 作业模板中,自动扩缩容是保障服务可靠性、动态调整资源以应对负载变化的核心手段。Kubernetes 提供了两种主要的扩缩容机制:水平 Pod 自动扩缩(HPA)和垂直 Pod 自动扩缩(VPA)。理解两者的区别、适用场景及触发条件,是构建弹性作业模板的前提。

4.1 核心概念对比

HPA 与 VPA 从不同维度调整 Pod 的资源供给。HPA 通过增减 Pod 副本数来应对负载变化,而 VPA 通过调整单个 Pod 的 CPU/内存请求(Requests)和限制(Limits)来适配负载。

对比维度 水平扩缩(HPA) 垂直扩缩(VPA)
调整对象 Pod 副本数量(Replicas) Pod 的资源请求与限制(Requests & Limits)
扩缩方向 横向:增加或减少 Pod 实例数 纵向:增加或减少单个 Pod 的资源配额
适用场景 无状态服务、突发流量、可水平扩展的工作负载 有状态服务、单体应用、资源需求波动但难以水平拆分的负载
响应速度 相对较快(秒级到分钟级,取决于指标采集周期) 相对较慢(分钟级,涉及 Pod 重建以应用新资源规格)
Pod 生命周期影响 创建或删除 Pod,不影响现有 Pod 运行 通常需要重建 Pod(Eviction)以应用新的资源规格
与 SLO 关联 直接基于 Error Budget 消耗速率或请求延迟等 SLI 触发 间接优化资源利用率,减少因资源不足导致的性能衰退
SRE 实践提示:在基于 Error Budget 的作业模板中,HPA 是应对负载变化、防止 SLO 违例的第一道防线。VPA 更适合作为资源优化的辅助手段,用于自动调整 Pod 的资源基线,减少资源浪费。

4.2 触发条件与工作原理

4.2.1 HPA 触发条件

HPA 控制器周期性地(默认 15 秒)检查配置的指标目标值,并根据当前实际值与目标值的比率计算期望的副本数。核心公式为:

期望副本数 = ceil[ 当前副本数 × ( 当前指标值 / 目标指标值 ) ]

常见的触发指标包括:

  • CPU 使用率:最基础的指标,适用于 CPU 密集型服务。
  • 内存使用率:适用于内存密集型服务,但需注意内存使用通常不会随负载下降而立即释放。
  • 自定义指标(Custom Metrics):如每秒请求数(QPS)、请求延迟 P99、队列深度等,与 SLO 直接相关。
  • 外部指标(External Metrics):来自集群外部的指标,如消息队列积压量。
关键配置参数:
  • --horizontal-pod-autoscaler-sync-period:HPA 控制器同步周期(默认 15s)。
  • --horizontal-pod-autoscaler-downscale-stabilization-window:缩容稳定窗口(默认 5 分钟),防止频繁缩容导致抖动。
  • behavior.scaleDown.stabilizationWindowSeconds:可在 HPA YAML 中自定义缩容冷却时间。

4.2.2 VPA 触发条件

VPA 通过分析 Pod 的历史资源使用数据(由 Metrics Server 或 Prometheus 提供),推荐或自动调整 Pod 的 Requests 和 Limits。VPA 有三种运行模式:

  • Off:仅提供推荐值,不自动应用。
  • Auto:自动更新 Pod 的资源规格,并在需要时驱逐 Pod 以应用新配置。
  • Initial:仅在 Pod 创建时应用推荐值,之后不再更改。

VPA 的触发条件主要基于资源使用率的统计分位数(如 P50、P90、P95),当实际使用率持续偏离推荐值时,VPA 会更新推荐值并触发 Pod 更新。

注意:VPA 与 HPA 在 CPU/内存指标上存在冲突。当两者同时配置时,HPA 应基于自定义指标(如 QPS)而非 CPU/内存,以避免 VPA 调整资源规格后导致 HPA 误判。在 SLO 作业模板中,推荐使用 HPA + 自定义指标 + VPA(Off 模式仅做推荐)的组合。

4.3 架构对比图

下图展示了 HPA 与 VPA 在 Kubernetes 集群中的工作流程与触发路径差异。

HPA 与 VPA 架构对比与触发路径 水平扩缩(HPA) 指标源(Metrics Server / Prometheus) HPA 控制器(计算期望副本数) 调整 Deployment / StatefulSet 副本数 创建/删除 Pod 实例 垂直扩缩(VPA) 指标源(Metrics Server / Prometheus) VPA Recommender(分析历史数据,生成推荐值) VPA Updater(驱逐 Pod,应用新资源规格) Pod 重建,更新 Requests / Limits HPA 通过增减 Pod 数量应对负载变化;VPA 通过调整 Pod 资源规格优化利用率,通常需要 Pod 重建。

4.4 在 SLO 作业模板中的选择策略

在基于 Error Budget 的作业模板中,扩缩容策略的选择直接影响 SLO 的达成效率。以下决策流程可帮助确定使用 HPA 还是 VPA:

  1. 服务是否无状态且可水平扩展?
    • 是 → 优先使用 HPA,基于自定义指标(如 QPS 或请求延迟)触发。
    • 否 → 考虑 VPA 或结合使用(HPA 基于非资源指标)。
  2. 负载模式是否突发且不可预测?
    • 是 → HPA 更适合快速扩容应对流量尖峰。
    • 否 → VPA 可平稳调整资源,减少 Pod 重建频率。
  3. 是否已定义明确的 SLI 与 Error Budget?
    • 是 → 将 SLI(如延迟、错误率)作为 HPA 的触发指标,直接关联 SLO。
    • 否 → 先定义 SLI,再配置扩缩容策略。
推荐实践:在 SLO 作业模板中,默认启用 HPA 并配置基于 Error Budget 消耗速率的自定义指标触发。VPA 以 Off 模式运行,仅提供资源推荐值,供运维人员参考调整基础资源规格,避免自动重建影响服务稳定性。

4.5 触发条件对比总结

特性 HPA 触发条件 VPA 触发条件
指标类型 CPU、内存、自定义指标、外部指标 CPU、内存(历史使用数据)
触发计算方式 当前值 / 目标值 × 当前副本数 基于统计分位数(P50/P90/P95)的推荐算法
冷却/稳定机制 缩容稳定窗口、扩容/缩容行为策略 Pod 更新间隔、推荐值更新频率限制
对 Pod 的影响 无影响(创建/删除 Pod) 需要 Pod 重建(Eviction)
与 SLO 的关联度 高(可直接基于 Error Budget 消耗触发) 中(间接优化资源,减少性能衰退风险)