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 的三个组件可以独立部署。在大型集群中,建议将 Recommender 与 Updater 分离部署,避免单点故障影响整个弹性决策链路。
2.2 资源推荐算法:百分位与安全边界
VPA Recommender 的核心算法基于历史指标百分位分析,而非简单的均值或峰值。算法分为四个阶段:
- 数据采集窗口:默认取最近 8 天的历史指标,按 1 分钟粒度采样。
- 异常过滤:剔除 OOMKill、启动预热期、低负载时段等异常样本。
- 百分位计算:对 CPU 和内存分别计算 P50、P90、P95、P99 等分位值。
- 安全余量叠加:在推荐值上增加 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 | 低(仅生效一次) |
三种模式的决策流程差异如下图所示:
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 管理网络吞吐量或连接数等自定义指标,两者互不干扰。