scofield 菜鸟运维杂谈
VPA全称Vertical Pod Autoscaler,即垂直 Pod 自动扩缩容,它根据容器资源使用率自动设置 CPU 和 内存 的requests,从而允许在节点上进行适当的调度,以便为每个 Pod 提供适当的资源。
它既可以缩小过度请求资源的容器,也可以根据其使用情况随时提升资源不足的容量。
PS: VPA不会改变Pod的资源limits值。
废话不多说,直接上图,看VPA工作流程
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yNmhTYiRjMzkDO2YjN1ETYxMDM2IjM2YWNjBDZ5UjMy8CXyEzLcNDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.png)
接下来开始实战
1、下载部署清单文件
2、修改components.yaml文件
修改了镜像地址,gcr.io为我自己的仓库
修改了metrics-server启动参数args,要不然会报错unable to fully scrape metrics from source kubelet_summary…
3、执行部署
4、验证
1、克隆autoscaler项目
2、修改部署文件,将gcr仓库改为我自己的仓库
3、部署
4、查看结果,可以看到metrics-server和vpa都已经正常运行了
1、首先我们部署一个nginx服务,部署到namespace: vpa中
看下结果,正常运行了2个pod
2、为了便宜压测,我们创建一个NodePort类型的service
3、创建VPA
这里先使用updateMode: "Off"模式,这种模式仅获取资源推荐不更新Pod
4、查看部署结果
5、使用describe查看vpa详情,主要关注Container Recommendations
其中
6、现在我们对nginx进行压测
执行压测命令
7、几分钟后再观察VPA Recommendation变化
从输出信息可以看出,VPA对Pod给出了推荐值:Cpu: 476m,因为我们这里设置了updateMode: "Off",所以不会更新Pod
1、现在我把updateMode: "Auto",看看VPA会有什么动作
这里我把resources改为:memory: 50Mi,cpu: 100m
2、再次部署vpa,这里VPA部署文件nginx-vpa-demo.yaml只改了u
pdateMode: "Auto"和name: nginx-vpa-2
3、再次压测
4、几分钟后,使用describe查看vpa详情,同样只关注Container Recommendations
Target变成了Cpu: 587m ,Memory: 262144k
5、来看下event事件
从输出信息可以了解到,vpa执行了EvictedByVPA,自动停掉了nginx,然后使用 VPA推荐的资源启动了新的nginx
,我们查看下nginx的pod可以得到确认
看重点Requests:cpu: 476m,memory: 262144k
再回头看看部署文件
现在可以知道VPA做了哪些事了吧。当然,随着服务的负载的变化,VPA的推荐之后也会不断变化。当目前运行的pod的资源达不到VPA的推荐值,就会执行pod驱逐,重新部署新的足够资源的服务。
不能与HPA(Horizontal Pod Autoscaler )一起使用
Pod比如使用副本控制器,例如属于Deployment或者StatefulSet
Pod 资源用其所需,所以集群节点使用效率高。
Pod 会被安排到具有适当可用资源的节点上。
不必运行基准测试任务来确定 CPU 和内存请求的合适值。
VPA 可以随时调整 CPU 和内存请求,无需人为操作,因此可以减少维护时间。
最后滴最后,VPA是Kubernetes比较新的功能,还没有在生产环境大规模实践过,不建议在线上环境使用自动更新模式,但是使用推荐模式你可以更好了解服务的资源使用情况。
更多信息请前往官网查看
PS:后续文章会同步到dev.kubeops.net
注:文中图片来源于网络,如有侵权,请联系我及时删除。