Skip to content

Kubernetes Vertical Pod Autoscaler

Vertical Pod Autoscaler(VPA)根据历史和当前资源使用,为容器计算 CPU/内存 requests 建议,并可按配置把建议应用到 Pod。VPA 不是 kube-controller-manager 内置控制器,需要安装对应 CRD 和组件;能力与更新行为应以所用发行版为准。

组件和边界

常见实现包含:

  • Recommender:计算目标、下限和上限建议。
  • Admission Controller:在新 Pod 创建时写入建议资源。
  • Updater:判断是否需要通过驱逐/重建让已有 Pod 使用新值。

VPA 主要管理 requests,不是节点扩容器。requests 增大后如果节点无空间,Pod 可能 Pending,需要节点扩缩或容量预留配合。

先使用建议模式

yaml
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: order-api
  namespace: orders
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: order-api
  updatePolicy:
    updateMode: "Off"
  resourcePolicy:
    containerPolicies:
      - containerName: api
        controlledResources: ["cpu", "memory"]
        minAllowed: { cpu: 100m, memory: 128Mi }
        maxAllowed: { cpu: "2", memory: 2Gi }

Off 模式只生成 recommendation,适合先观察多个负载周期。Initial 仅在 Pod 创建时应用;其他自动更新模式可能通过驱逐/重建 Pod 生效,具体名称和 in-place 能力随 VPA 版本与集群能力变化,启用前必须核对并演练。

阅读 Recommendation

bash
kubectl get vpa order-api -n orders -o yaml

每个容器通常包含:

字段含义
target当前模型建议的 requests
lowerBound低于此值更容易资源不足
upperBound高于此值可能浪费资源
uncappedTarget不考虑 policy 上限时的原始目标

建议依赖观测历史。新服务、周期任务、突发流量和内存泄漏可能产生误导,不能直接把 target 当成永久容量值。

与 HPA 配合

HPA 使用 CPU utilization 时,分母是 CPU requests;VPA 同时修改 CPU requests 会改变 HPA 看到的比例,两个控制器可能互相影响。

常见策略:

  • VPA 只输出建议,人工或流水线评审后调整。
  • HPA 使用请求量、队列或其他不依赖 requests 的指标。
  • VPA 只管理内存,HPA 使用 CPU 或业务指标。
  • 在正式自动化前用真实负载验证组合行为。

更新中断

如果应用建议需要驱逐 Pod,应同时检查 Deployment surge、PDB、拓扑、PVC 和剩余容量。PDB 可能阻止 VPA 更新;强行绕过会扩大业务中断。

对单副本、有状态、长任务或启动缓慢的工作负载,优先建议模式或维护窗口,不默认开启自动驱逐。

排障

bash
kubectl get vpa -A
kubectl describe vpa order-api -n orders
kubectl get pod -n orders -l app=order-api -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].resources.requests}{"\n"}{end}'
kubectl get events -n orders --sort-by=.metadata.creationTimestamp
现象优先检查
没有 recommendationVPA 组件、metrics 来源、历史窗口、targetRef
新 Pod 未使用建议Admission Controller、update mode、resource policy
自动更新长期不发生PDB、Updater、最小副本、驱逐限制
更新后 Pod Pendingrequests 增长、节点容量、拓扑和配额
HPA 行为突然变化CPU requests 是否被 VPA 修改

VPA 的目标是让 requests 更接近实际需求,不是替代性能分析。内存持续增长、CPU 异常和下游瓶颈仍要回到应用与系统证据定位。

别急,先让缓存热一下。