在现代云原生应用中,Kubernetes已经成为容器编排的事实标准。然而,如何高效地管理和优化集群中的资源仍然是一个挑战。为了解决这个问题,Kubernetes引入了Vertical Pod Autoscaler (VPA)。VPA可以根据实际负载动态调整Pod的资源请求和限制,从而提高资源利用率和应用程序性能。

谨慎操作,步步为营,确保生产环境稳定与安全
Kubernetes VPA(Vertical Pod Autoscaler)是一种用于自动调整Pod资源需求的工具,它可以基于容器的实际使用情况来自动调整CPU和内存的请求值。VPA的目的是确保每个Pod都能获得适当的资源量,同时优化集群资源的利用率。
该项目由三部分组成:
recommender:它监控当前和过去的资源消耗,并在此基础上为容器的 CPU 和内存请求提供推荐值。
updater:它检查哪些托管 pod 设置了正确的资源,如果没有,则终止它们,以便控制器可以使用更新的请求重新创建它们。
admission Plugin:它在新的 pod(刚刚创建或者由于更新程序的活动而由其控制器重新创建的)上设置正确的资源请求。

VPA架构图
依赖环境:
VPA服务依赖metrics-server服务,请提前部署好。如果不知道怎么部署的话,请参考往期文章。
VPA需要证书,本章节通过Certificate资源方式申请证书,如果不清楚的话,请参考往期文章。
| VPA version | Kubernetes version |
| 1.2.x | 1.27+ |
| 0.12 to 1.1.x | 1.25+ |
| 0.11 | 1.22 - 1.24 |
| 0.10 | 1.22+ |
| 0.9 | 1.16+ |
| 0.8 | 1.13+ |
| 0.4 to 0.7 | 1.11+ |
| 0.3.X and lower | 1.7+ |
1、生成证书
$ cat <<'EOF' | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: vpa
namespace: default
spec:
secretName: vpa-cert
commonName: vpa-webhook.kube-system.svc
privateKey:
algorithm: RSA
size: 2048
usages:
- server auth
- client auth
- digital signature
- key encipherment
duration: 876000h # 36500d
renewBefore: 744h # 31d
dnsNames:
- "vpa-webhook.kube-system.svc"
ipAddresses:
- "127.0.0.1"
issuerRef:
name: ca-cluster-issuer
kind: ClusterIssuer
EOF
2、获取证书
# 服务证书
$ kubectl get secret vpa-cert -ojsonpath='{.data.tls\.crt}' | base64 -d > /tmp/serverCert.pem
$ kubectl get secret vpa-cert -ojsonpath='{.data.tls\.key}' | base64 -d > /tmp/serverKey.pem
# ca证书
$ kubectl -n kube-system get secret ca-clusterissuer-secret -ojsonpath='{.data.tls\.crt}' | base64 -d > /tmp/caCert.pem
$ kubectl -n kube-system get secret ca-clusterissuer-secret -ojsonpath='{.data.tls\.key}' | base64 -d > /tmp/caKey.pem
3、证书存放secret上
$ kubectl create secret --namespace=kube-system generic vpa-tls-certs --from-file=/tmp/caKey.pem --from-file=/tmp/caCert.pem --from-file=/tmp/serverKey.pem --from-file=/tmp/serverCert.pem
secret/vpa-tls-certs created
4、下载vpa相关文件
$ curl -L -O https://github.com/kubernetes/autoscaler/archive/refs/tags/vertical-pod-autoscaler-1.2.1.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
0 0 0 52.1M 0 0 558k 0 --:--:-- 0:01:35 --:--:-- 428k
$ tar xf vertical-pod-autoscaler-1.2.1.tar.gz
5、生成VPA manifests文件
$ ./autoscaler-vertical-pod-autoscaler-1.2.1/vertical-pod-autoscaler/hack/vpa-process-yamls.sh print | sudo tee /etc/kubernetes/addons/vertical-pod-autoscaler.yaml
6、部署VPA服务
# 修改vpa镜像地址
$ sudo sed -ri 's@registry.k8s.io@core.jiaxzeng.com/library@g' /etc/kubernetes/addons/vertical-pod-autoscaler.yaml
# 生效vpa服务
$ kubectl apply -f /etc/kubernetes/addons/vertical-pod-autoscaler.yaml
7、验证VPA运行情况
$ kubectl -n kube-system get pod | grep vpa
vpa-admission-controller-79696b4c6f-f4mfb 1/1 Running 0 10s
vpa-recommender-5b78544858-sbr6x 1/1 Running 0 10s
vpa-updater-6d5f5589b5-tj5tv 1/1 Running 0 10s
本次示例deployment资源配置情况:
CPU资源request: 10m, limit:100m;
Memory资源request: 10Mi, limit: 100Mi
1、创建VPA资源
$ cat <<'EOF' | kubectl apply -f -
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: simple
namespace: default
spec:
updatePolicy:
updateMode: Auto
targetRef:
apiVersion: apps/v1
name: simple
kind: Deployment
resourcePolicy:
containerPolicies:
- containerName: "*"
controlledResources:
- cpu
- memory
maxAllowed:
cpu: 1000m
memory: 1024Mi
EOF
verticalpodautoscaler.autoscaling.k8s.io/simple created
Tip:vpa.spec.resourcePolicy.containerPolicies.controlledResources字段配置CPU和memory的话,得两个资源(CPU和Memory)同时改变才会触发;注意:示例只配置cpu类型。
2、查看VPA资源
$ kubectl get vpa
NAME MODE CPU MEM PROVIDED AGE
simple Auto True 1s
$ kubectl get vpa simple
NAME MODE CPU MEM PROVIDED AGE
simple Auto 25m True 4m7s
Tip:当显示CPU,MEM字段有配置值时,vpa有就会对比当前pod与目标值是否一致。当不一致时,vpa服务会驱逐pod(业务会重启)。resources配置会改成目标值。
1、创建调试容器(含压测工具)
$ cat <<'EOF' | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: tools
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: tools
template:
metadata:
labels:
app: tools
spec:
containers:
- name: tools
image: core.jiaxzeng.com/library/tools:v1.2
EOF
2、压测业务服务
$ kubectl exec -it deploy/tools -- wrk -c 50 -t 5 -d 60s http://simple.default.svc/who/hostname
Running 1m test @ http://simple.default.svc/who/hostname
5 threads and 50 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 9.74ms 18.82ms 201.60ms 87.49%
Req/Sec 7.23k 2.92k 27.15k 74.97%
2158802 requests in 1.00m, 290.29MB read
Socket errors: connect 0, read 25, write 0, timeout 0
Requests/sec: 35923.50
Transfer/sec: 4.83MB
3、查看压测过程
$ kubectl get vpa simple -w
NAME MODE CPU MEM PROVIDED AGE
simple Auto 8s
simple Auto 25m True 55s
simple Auto 78m True 2m55s
simple Auto 296m True 3m55s
simple Auto 296m True 5m55s
simple Auto 296m True 6m55s
simple Auto 296m True 7m55s
$ kubectl get pod -l app=simple -w
NAME READY STATUS RESTARTS AGE
simple-6d77fc469f-dqrl7 1/1 Running 0 7s
simple-6d77fc469f-k7mkt 1/1 Running 0 67s
simple-6d77fc469f-dqrl7 1/1 Terminating 0 4m
simple-6d77fc469f-ncvxb 0/1 Pending 0 0s
simple-6d77fc469f-ncvxb 0/1 ContainerCreating 0 0s
simple-6d77fc469f-dqrl7 0/1 Terminating 0 4m1s
simple-6d77fc469f-ncvxb 1/1 Running 0 2s
simple-6d77fc469f-jpwfb 0/1 Pending 0 0s
simple-6d77fc469f-jpwfb 0/1 ContainerCreating 0 0s
simple-6d77fc469f-k7mkt 1/1 Terminating 0 7m30s
simple-6d77fc469f-k7mkt 0/1 Terminating 0 7m31s
simple-6d77fc469f-jpwfb 1/1 Running 0 2s
4、查看pod最终resources配置情况
$ kubectl get pod -l app=simple -oyaml | grep -A6 resources:
resources:
limits:
cpu: 2960m
memory: 100Mi
requests:
cpu: 296m
memory: 10Mi
--
resources:
limits:
cpu: 2960m
memory: 100Mi
requests:
cpu: 296m
memory: 10Mi
Tip:
deployment resources配置依旧是原来的,但是pod的resources配置已经改变。其实创建pod时,vpa-admission-controller服务拦截,根据 Recommend 来调整 Pod 的资源请求量。
kubectl get vpa 显示的值为request配置,limit的值也是按照原来的limit/request倍数进行增加。
通过本篇教程的学习,你应当已经掌握了如何在Kubernetes集群中部署和使用VPA的基本方法。VPA不仅简化了资源管理流程,还极大地提升了系统的自适应能力。希望你能将这些知识应用于实践中,享受自动化带来的便利。
VPA不足之处:
更新正在运行的 Pod 资源配置是 VPA 的一项试验性功能,会导致 Pod 的重建和重启,而且有可能被调度到其他的节点上。
目前 VPA 不能和监控 CPU 和内存度量的Horizontal Pod Autoscaler (HPA) 同时运行,除非 HPA 只监控其他定制化的或者外部的资源度量。
VPA 会处理出现的绝大多数 OOM 的事件,但不保证所有的场景下都有效。
别忘了,关注我们的公众号,获取更多关于容器技术和云原生领域的深度洞察和技术实战,让我们携手在技术的海洋中乘风破浪!





