
在 Kubernetes 中,Vertical Pod Autoscaler(VPA)用于自动调整 Pod 的 CPU 和内存 requests(不调整 limits),从而提升资源利用率、避免 OOMKilled 或因 request 过低导致调度失败。它不缩容/扩容副本数(那是 HPA 的事),而是“纵向”调优单个 Pod 的资源预留值。
VPA 的核心组件与工作原理
VPA 由三个主要控制器组成,协同完成推荐与应用:
vpa-recommender:持续分析 Pod 历史资源使用(通过 Metrics Server 或 Prometheus),生成 CPU/memory request 推荐值;vpa-updater:在 Auto 模式下,按推荐值主动驱逐旧 Pod 并重建(需配合 RollingUpdate 策略);vpa-admission-controller:拦截新建 Pod 的 admission 请求,注入推荐的 requests(仅对新创建 Pod 生效,不影响已运行 Pod)。
部署 VPA 并启用 Auto 模式(推荐生产用法)
官方提供一键部署脚本,建议从 GitHub 主仓库 获取最新 manifest:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/vertical-pod-autoscaler/deploy/vpa.yaml
部署后,为工作负载启用 VPA,例如对一个 Deployment:
apiVersion: autoscaling.k8s.io/v1kind: VerticalPodAutoscalermetadata: name: my-app-vpaspec: targetRef: apiVersion: "apps/v1" kind: Deployment name: my-app updatePolicy: updateMode: "Auto" # 关键:自动更新 requests 并滚动重启 resourcePolicy: containerPolicies: – containerName: "*" minAllowed: cpu: 100m memory: 256Mi maxAllowed: cpu: 2 memory: 2Gi
注意:updateMode: Auto 会触发 Pod 重建,确保你的应用支持滚动发布且无状态或有优雅终止逻辑。
验证效果与关键观察点
部署 VPA 后,可通过以下方式确认是否生效:
查看 VPA 对象状态:kubectl get vpa my-app-vpa -o wide,关注 Recommendation 字段是否输出合理数值;检查 Pod 事件:kubectl describe pod <pod-name>,若被 VPA 更新,会看到类似 Updated by vertical-pod-autoscaler 的事件;对比新旧 Pod 的 resources.requests:重建后的 Pod spec 中 requests 应已更新;注意 VPA 不修改 limits,如需同步调整 limits,需额外配置或配合其他工具(如 KEDA + custom metrics)。
注意事项与常见避坑
VPA 虽好,但实际落地需谨慎:
不适用于无法滚动重启的场景(如 StatefulSet 中有强顺序依赖、或未实现 SIGTERM 处理);默认只基于历史使用率推荐,若业务存在周期性高峰但采样窗口短,可能低估;可调大 –pod-recommendation-minimum-confidence 参数增强稳定性;VPA 与 HPA 共存时,HPA 仍基于 CPU/Memory usage % 判断(即 usage / requests),因此 VPA 调高 requests 可能导致 HPA 更难触发扩缩容——需协同调优;测试环境建议先用 updateMode: Off 或 Initial 观察推荐值,再切到 Auto。

评论(0)