天天看点

闲聊Kubernetes Pod垂直自动伸缩(VPA)

scofield 菜鸟运维杂谈

VPA全称Vertical Pod Autoscaler,即垂直 Pod 自动扩缩容,它根据容器资源使用率自动设置 CPU 和 内存 的requests,从而允许在节点上进行适当的调度,以便为每个 Pod 提供适当的资源。

它既可以缩小过度请求资源的容器,也可以根据其使用情况随时提升资源不足的容量。

PS: VPA不会改变Pod的资源limits值。

废话不多说,直接上图,看VPA工作流程

闲聊Kubernetes Pod垂直自动伸缩(VPA)

接下来开始实战

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

注:文中图片来源于网络,如有侵权,请联系我及时删除。