VPA(垂直自动伸缩)
你部署了一个 Java 应用,内存从 512Mi 开始。随着业务增长,内存逐渐不够用。你手动调整了 requests 和 limits,但什么时候调?调多少合适?
VPA(Vertical Pod Autoscaler)可以帮你自动做这件事。
VPA 是什么?
VPA 是 Kubernetes 的垂直 Pod 自动伸缩控制器。它分析 Pod 的实际资源使用情况,自动调整 Pod 的资源 requests 和 limits。
与 HPA 的区别:
VPA 工作模式
VPA 有四种工作模式:
安装 VPA
vpa-install.yaml
创建 VPA
Off 模式(推荐生产使用)
vpa-off.yaml
Auto 模式
vpa-auto.yaml
VPA 组件
VPA 由三个组件组成:
资源边界
最小/最大限制
按容器配置
与 HPA 对比
VPA 和 HPA 可以一起使用:
combined-hpa-vpa.yaml
常见问题
VPA 与 HPA 冲突
如果同时使用 VPA (Auto) 和 HPA,VPA 可能会干扰 HPA:
Warning
生产环境建议 VPA 使用 Off 模式,只作为参考。
Pod 重建
VPA (Auto/Recreate) 会导致 Pod 重建:
不支持所有资源
VPA 有以下限制:
- 不支持 DaemonSet:DaemonSet 需要在每个节点运行
- 不支持 Job/CronJob:短生命周期任务
- 不支持
terminationGracePeriodSeconds = 0:需要优雅终止时间 - 不支持本地存储:emptyDir 等
使用建议
1. 生产环境使用 Off 模式
2. 配合 Prometheus 使用
3. 设置合理的边界
延伸思考
VPA 解决了资源配置的「拍脑袋」问题:
- 数据驱动:基于实际使用情况调整
- 自动化:无需人工干预
- 成本优化:避免资源浪费
但 VPA 也有局限性:
- Pod 重建:应用必须有优雅重启能力
- 冷启动:资源变化后需要重新适应
- 资源碎片:可能导致节点资源利用率下降
对于大多数应用,HPA 已经足够。如果确实遇到资源配额难题,再考虑 VPA。
延伸阅读
- HPA(水平自动伸缩):副本数的水平调整
- 资源管理:Pod 资源配置详解
- Metrics Server:指标收集