2. VPA 基础原理:工作机制、资源推荐算法与更新策略

Vertical Pod Autoscaler(VPA)是 Kubernetes 内置的垂直弹性组件,通过持续观测 Pod 的实际资源消耗,动态调整 CPU 和内存的 Request/Limit,消除人工逐容器调参的运维负担。在生产环境中,VPA 常与 HPA(水平扩缩)互补使用:HPA 调整副本数,VPA 调整单副本规格。本章深入剖析 VPA 的三层核心机制:工作流程、推荐算法与更新策略。

2.1 VPA 工作机制:三组件协作模型

VPA 由三个独立组件构成,通过 CRD(Custom Resource Definition)和 API Server 协同工作。下图展示了 VPA 从指标采集到 Pod 更新的完整数据流。

VPA 三组件协作流程 VPA 三组件协作流程 Recommender 指标聚合 + 推荐计算 Updater Pod 驱逐 / 原地更新 Admission Controller Pod 创建时注入推荐值 Metrics Server / 历史指标 VPA CRD 对象 目标 Pod 关键流程说明: ① Recommender 从 Metrics Server 拉取历史指标,结合 VPA CRD 配置计算推荐值并写回 CRD 的 status 字段。 ② Updater 监听 VPA CRD 状态变化,根据 updateMode 决定是否驱逐 Pod 或原地更新资源。 ③ Admission Controller 在 Pod 创建时拦截请求,将推荐值注入容器资源字段。
生产建议:VPA 的三个组件可以独立部署。在大型集群中,建议将 Recommender 与 Updater 分离部署,避免单点故障影响整个弹性决策链路。

2.2 资源推荐算法:百分位与安全边界

VPA Recommender 的核心算法基于历史指标百分位分析,而非简单的均值或峰值。算法分为四个阶段:

  1. 数据采集窗口:默认取最近 8 天的历史指标,按 1 分钟粒度采样。
  2. 异常过滤:剔除 OOMKill、启动预热期、低负载时段等异常样本。
  3. 百分位计算:对 CPU 和内存分别计算 P50、P90、P95、P99 等分位值。
  4. 安全余量叠加:在推荐值上增加 15% 的缓冲余量(Safety Margin),防止瞬时毛刺导致 OOM。
资源类型 推荐基准 安全余量 推荐公式
CPU P90 百分位 +15% Request = P90 × 1.15
内存 P95 百分位 +15% Request = P95 × 1.15
内存(OOM 历史) P99 百分位 + OOM 峰值 +25% Request = max(P99, OOM_Peak) × 1.25
注意:VPA 不会自动调整 Limit。如果 Pod 设置了 Limit,VPA 会按比例同步调整 Request 和 Limit,保持 Request/Limit 比例不变。建议在 VPA 使用场景中统一不设 Limit,或使用 LimitRange 兜底。

2.3 更新策略:Auto / Off / Initial 三种模式

VPA 的更新行为由 CRD 中的 updateMode 字段控制,三种模式对应不同的运维场景:

模式 行为描述 适用场景 风险等级
Auto Updater 自动驱逐 Pod,Admission Controller 在新 Pod 创建时注入推荐值 生产环境全自动弹性 中(需配合 PDB 和优雅终止)
Off 仅计算推荐值并写入 VPA CRD 的 status 字段,不执行任何 Pod 变更 观测评估、变更门禁预检 低(只读模式)
Initial 仅在 Pod 首次创建时注入推荐值,后续不更新 有状态服务、StatefulSet 低(仅生效一次)

三种模式的决策流程差异如下图所示:

VPA 更新策略决策树 VPA 更新策略决策树 VPA 推荐值就绪 Auto 驱逐 → 重建 → 注入 Off 仅写 status,不操作 Pod Initial 仅首次创建时注入 变更门禁场景推荐: 在 VPA 联动 eBPF 网络观测的校准流程中,建议先使用 Off 模式收集推荐值,经门禁审批后再切换为 Auto 模式执行变更。

2.4 VPA CRD 关键字段速查

以下是一个典型的 VPA 配置示例,标注了核心字段的作用:

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-app-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: my-app
  updatePolicy:
    updateMode: "Off"          # 可选 Auto / Off / Initial
  resourcePolicy:
    containerPolicies:
      - containerName: "*"     # 匹配所有容器
        minAllowed:
          cpu: "100m"          # 下限保护
          memory: "128Mi"
        maxAllowed:
          cpu: "4"             # 上限保护
          memory: "8Gi"
        controlledResources: ["cpu", "memory"]
        controlledValues: RequestsAndLimits  # 同时控制 Request 和 Limit
关键参数说明:
  • minAllowed / maxAllowed:硬边界,防止 VPA 推荐值超出合理范围。
  • controlledValues:可选 RequestsOnly(仅调整 Request)或 RequestsAndLimits(同步调整)。
  • containerName: "*":通配所有容器,也可为特定容器单独配置策略。

2.5 VPA 与 HPA 的共存约束

VPA 和 HPA 不能同时作用于同一组 Pod 的同一资源维度。下表总结了兼容性规则:

HPA 维度 VPA 维度 是否兼容 说明
CPU / 内存 CPU / 内存 ❌ 不兼容 两者都会修改 Pod 资源规格,导致冲突
自定义指标 CPU / 内存 ✅ 兼容 HPA 基于业务指标,VPA 基于资源指标
CPU / 内存 仅内存 ⚠️ 有条件 需确保 HPA 不依赖 CPU 指标
最佳实践:在 eBPF 网络观测场景中,建议 VPA 管理 CPU/内存资源,HPA 管理网络吞吐量或连接数等自定义指标,两者互不干扰。