服务器K8s VPA配置实战:从安装到验证的完整教程
在Kubernetes集群中,手动调整Pod的CPU和内存请求往往滞后且容易出错。
VPA(Vertical Pod Autoscaler)能根据历史负载自动推荐或更新Pod的资源请求,让资源分配更贴近实际用量。
这篇教程会带你从零完成服务器K8s VPA配置,每一步都给出可执行的命令和验证方法。
部署前需要确认的环境条件
VPA依赖Metrics Server提供Pod资源指标,所以第一件事是确认Metrics Server已经正常运行。
用下面的命令检查:
kubectl top nodes
kubectl top pods -A
如果提示 error: Metrics API not available,说明Metrics Server未安装或未就绪。
先安装Metrics Server再继续。
同时确认你的Kubernetes版本,VPA对1.21及以上版本支持较好,老版本可能需要调整API版本。
另外,确保你有集群管理员权限,因为安装VPA需要创建CRD和RBAC资源。
安装VPA组件与自定义资源
VPA的官方仓库在GitHub上,推荐用git clone获取最新稳定版清单。
git clone https://github.com/kubernetes/autoscaler.git
cd autoscaler/vertical-pod-autoscaler
进入目录后,执行安装脚本:
./hack/vpa-up.sh
这个脚本会创建CustomResourceDefinition、ServiceAccount、RBAC以及三个核心组件:vpa-admission-controller、vpa-recommender、vpa-updater。
安装完成后,用以下命令验证Pod是否全部Running:
kubectl get pods -n kube-system | grep vpa
如果看到三个Pod处于Running状态,说明组件安装成功。
为工作负载创建VPA对象
VPA通过自定义资源VerticalPodAutoscaler来定义目标负载和更新策略。
下面是一个针对Deployment的示例,保存为vpa-demo.yaml:
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"
updateMode支持四种模式:Off只推荐不更新、Initial只在Pod创建时设置、Auto自动更新运行中的Pod、Recreate重建Pod以应用新资源。
生产环境建议先用Off观察推荐值,确认无误后再切换。
应用配置:
kubectl apply -f vpa-demo.yaml
验证VPA推荐值与更新效果
创建VPA后,等待几分钟让推荐器收集数据,然后查看推荐结果:
kubectl describe vpa my-app-vpa
关注Status部分的Recommendation,它会给出Target、Lower Bound和Upper Bound三个资源建议值。
如果updateMode是Auto,VPA会逐步驱逐Pod并重建,使新Pod使用推荐值。
你可以用以下命令观察Pod资源变化:
kubectl get pods -l app=my-app -o jsonpath='{.items[*].spec.containers[*].resources}'
如果VPA没有产生推荐值,检查vpa-recommender的日志:
kubectl logs -n kube-system -l app=vpa-recommender
常见原因是Metrics Server未返回数据或目标负载没有历史指标。
避坑与常见报错处理
VPA与HPA不要同时作用于CPU:如果水平扩缩容(HPA)也基于CPU指标,VPA的调整可能引发冲突。
建议VPA主要管理内存,HPA管理CPU,或明确划分职责。
更新模式选择要谨慎:Auto模式会主动驱逐Pod,对可用性敏感的服务应配合PodDisruptionBudget使用,避免同时驱逐过多副本。
资源请求不能为零:VPA需要初始的资源请求作为计算基础,如果Deployment中未设置resources.requests,推荐器可能无法给出有效建议。
CRD版本兼容性:不同Kubernetes版本对应的VPA API版本不同,v1是较新的稳定版,若集群较老,可能需要改用autoscaling.k8s.io/v1beta2。
卸载VPA:如果不再需要,用./hack/vpa-down.sh清理组件,但已创建的VPA对象和CRD需要手动删除,否则残留资源可能影响后续操作。
检查配置是否真正生效
最后做一次完整验证:确认Metrics Server数据正常、VPA组件健康、目标负载的VPA状态中有推荐值。
如果使用Auto模式,观察一到两个更新周期后,Pod的资源请求是否已调整为推荐值。
你可以通过kubectl top pods对比实际用量与请求值,判断VPA是否在按预期工作。
服务器K8s VPA配置的关键在于先让指标管道畅通,再根据业务容忍度选择更新模式。
初次部署建议从Off模式开始,积累几天推荐数据后再决定是否开启自动更新。
这样既能获得资源优化,又不会因为突然的Pod重建影响服务稳定性。
常见疑问
VPA会立即调整资源吗? 不会。
推荐器需要收集一段时间的指标才会产生建议,通常需要数分钟到数小时,取决于负载波动情况。
VPA和HPA可以一起用吗? 可以,但建议VPA管理内存,HPA管理CPU,避免两者对同一指标做出矛盾决策。
为什么VPA推荐值一直是空? 检查Metrics Server是否正常,以及目标负载是否设置了初始资源请求。
没有历史指标时推荐器无法计算。
VPA更新Pod时会中断服务吗? Auto模式下VPA会驱逐Pod,如果副本数大于1且配置了PodDisruptionBudget,可以控制中断范围。
单副本服务需谨慎使用。