4. VPA 安装与配置:使用 Helm 部署 VPA、VPA CRD 介绍、VPA 更新模式
Vertical Pod Autoscaler(VPA)是 Kubernetes 生态中实现容器级垂直扩缩容的核心组件。在生产环境中,VPA 的安装通常通过 Helm Chart 完成,其底层依赖一组自定义资源定义(CRD)来声明自动扩缩容策略。本章将系统讲解 VPA 的 Helm 部署流程、核心 CRD 对象的结构与语义,以及三种更新模式(Auto / Off / Initial)的适用场景与行为差异。
4.1 使用 Helm 部署 VPA
VPA 官方 Helm Chart 托管于 Kubernetes Autoscaler 仓库。推荐使用 Helm 3 进行部署,并提前配置好 metrics-server 以提供 Pod 资源使用数据。
4.1.1 添加 Helm 仓库与版本确认
# 添加 VPA 官方 Helm 仓库
helm repo add vpa https://kubernetes.github.io/autoscaler/charts/vpa
# 更新仓库索引
helm repo update
# 查询可用版本(建议选择最新稳定版)
helm search repo vpa/vpa --versions
4.1.2 部署 VPA 组件
VPA 包含三个核心组件:Recommender(推荐器)、Updater(更新器)和 Admission Controller(准入控制器)。以下命令将同时部署这三个组件及对应的 CRD。
# 创建命名空间
kubectl create namespace vpa
# 使用 Helm 安装 VPA(推荐开启准入控制器)
helm install vpa vpa/vpa \
--namespace vpa \
--set admissionController.enabled=true \
--set recommender.extraArgs.v=4 \
--set updater.extraArgs.v=4
kubectl get pods -n vpakubectl get crd | grep verticalpodautoscaler
4.1.3 组件功能对照表
| 组件 | 功能职责 | 关键参数 |
|---|---|---|
| Recommender | 基于历史与实时指标计算资源推荐值 | --recommendation-margin-fraction |
| Updater | 根据推荐值驱逐 Pod 触发重建(Auto 模式) | --updater-interval |
| Admission Controller | 拦截 Pod 创建请求,注入推荐资源值 | --webhook-timeout-seconds |
4.2 VPA CRD 介绍
VPA 通过两个核心 CRD 实现声明式配置:VerticalPodAutoscaler(VPA 资源)和 VerticalPodAutoscalerCheckpoint(检查点,用于 Recommender 状态持久化)。
4.2.1 VerticalPodAutoscaler CRD 结构
一个典型的 VPA 资源定义包含 targetRef(目标工作负载)、updatePolicy(更新模式)和 resourcePolicy(容器级策略)。
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: my-app-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: my-app
updatePolicy:
updateMode: "Auto"
resourcePolicy:
containerPolicies:
- containerName: "*"
minAllowed:
cpu: 100m
memory: 128Mi
maxAllowed:
cpu: 2
memory: 4Gi
controlledResources: ["cpu", "memory"]
4.2.2 CRD 字段语义表
| 字段路径 | 类型 | 说明 |
|---|---|---|
spec.targetRef |
CrossVersionObjectReference | 指定 VPA 关联的工作负载(Deployment / StatefulSet / DaemonSet) |
spec.updatePolicy.updateMode |
string | Auto / Off / Initial 三种模式之一 |
spec.resourcePolicy.containerPolicies[].minAllowed |
ResourceList | 容器资源下限,VPA 不会推荐低于此值 |
spec.resourcePolicy.containerPolicies[].maxAllowed |
ResourceList | 容器资源上限,VPA 不会推荐高于此值 |
spec.resourcePolicy.containerPolicies[].controlledResources |
[]string | 指定 VPA 控制的资源类型(cpu / memory) |
minAllowed 和 maxAllowed 边界,防止 VPA 在极端负载下推荐不合理值导致 Pod OOM 或资源浪费。
4.3 VPA 更新模式详解
VPA 的 updateMode 决定了推荐值如何作用于运行中的 Pod。三种模式的行为差异直接影响集群稳定性与运维策略。
4.3.1 模式对比表
| 模式 | Pod 重建 | 推荐值生效时机 | 典型场景 |
|---|---|---|---|
| Auto | 是(Updater 驱逐) | Pod 重建时注入新资源值 | 生产环境自动优化 |
| Off | 否 | 仅生成推荐值,不自动应用 | 审计、基线分析、手动决策 |
| Initial | 仅新建 Pod 时生效 | Pod 首次创建时注入推荐值 | 新部署、滚动更新初始资源设置 |
4.3.2 Auto 模式:全自动资源调优
Auto 模式下,VPA Recommender 持续计算推荐值,Updater 根据推荐值与当前值的偏差决定是否驱逐 Pod。被驱逐的 Pod 由控制器(如 Deployment)重建,Admission Controller 在重建时注入新的资源请求与限制。
4.3.3 Off 模式:只推荐不执行
Off 模式下,VPA 仅将推荐值写入 status.recommendation 字段,不触发任何 Pod 变更。运维人员可通过 kubectl describe vpa 查看推荐值,手动调整 Deployment 资源规格。
# 查看 VPA 推荐值(Off 模式)
kubectl describe vpa my-app-vpa
# 输出示例(status 部分)
# Status:
# Recommendation:
# Container Recommendations:
# Container Name: my-app
# Lower Bound:
# Cpu: 250m
# Memory: 256Mi
# Target:
# Cpu: 500m
# Memory: 512Mi
# Upper Bound:
# Cpu: 1
# Memory: 1Gi
4.3.4 Initial 模式:新 Pod 生效
Initial 模式仅在 Pod 首次创建时生效。对于已运行的 Pod,VPA 不会驱逐或修改其资源值。此模式适合在滚动更新或新版本发布时,让新 Pod 使用优化后的资源规格,同时保持旧 Pod 稳定运行。
4.4 VPA 更新模式决策流程
4.5 配置验证与常见问题
4.5.1 验证 VPA 是否正常工作
# 1. 检查 VPA 组件日志
kubectl logs -n vpa deployment/vpa-recommender --tail=50
# 2. 查看 VPA 资源状态
kubectl get vpa -n <namespace> -o wide
# 3. 确认推荐值已生成
kubectl get vpa my-app-vpa -n <namespace> -o json | jq '.status.recommendation'
4.5.2 常见问题排查表
| 现象 | 可能原因 | 解决措施 |
|---|---|---|
| VPA 未生成推荐值 | metrics-server 未部署或指标延迟 | 检查 kubectl top pod 是否正常返回 |
| Auto 模式 Pod 不重建 | Updater 未检测到偏差或 PDB 阻止 | 检查 vpa-updater 日志与 PDB 配置 |
| Admission Controller 未生效 | Webhook 配置错误或证书问题 | 检查 ValidatingWebhookConfiguration 与 TLS 证书 |
| 推荐值超出预期范围 | 未设置 minAllowed / maxAllowed |
在 resourcePolicy 中显式设置边界 |