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
部署验证:安装完成后,检查 Pod 状态与 CRD 是否就绪:
kubectl get pods -n vpa
kubectl 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 在重建时注入新的资源请求与限制。

注意:Auto 模式会导致 Pod 重建,可能引发短暂流量中断。建议结合 PodDisruptionBudget(PDB)和优雅终止(preStop hook)减少影响。

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 稳定运行。

迁移建议:从 Off 模式过渡到 Auto 模式前,可先使用 Initial 模式观察新 Pod 的资源表现,确认无异常后再切换为 Auto。

4.4 VPA 更新模式决策流程

VPA 更新模式决策流程 VPA 推荐值生成 updateMode? Auto: 驱逐并重建 Off: 仅写入 status Initial: 新建 Pod 生效 说明: Auto 模式适合生产自动优化,需配合 PDB 使用;Off 模式用于审计与手动调优;Initial 模式适合新版本发布过渡。

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 中显式设置边界
生产建议:在切换 Auto 模式前,先在 Off 模式下运行至少 24 小时,收集推荐值并与业务峰值对比,确认推荐值合理后再启用自动更新。