书籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》
一边学习一边整理老师的课程内容及实验笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:CKA备考实验 | 汇总_热爱编程的通信人的博客-CSDN博客
对于deployment来说,是管理员告诉它要创建几个pod,它才会创建几个pod。如果现在pod负载比较大,需要更多pod来分摊负载,就需要管理员手动去调整pod副本数。那么是否可以设置,让k8s根据pod负载情况,自动去调整deployment里pod的副本数呢?这里就可以通过HPA来实现。水平自动更新(Horizontal Pod Autoscalers,HPA),通过检测pod的CPU负载通知deployment,让其更新pod数目以减轻pod的负载,如图8-5所示。
假设一开始deployment管理1个pod,用户通过访问service(简称为svc,会把用户请求转发到后端的pod,后面有专门章节讲解),从而访问到pod。假设访问量突增,1个pod承担10000个并发量的话,这个pod的CPU负载剧增。此时HPA检测到之后,会通知deployment增加pod数来应对高并发量。假设增加到5个pod,此时就由5个pod来分担这10000个并发量,而非原来的1个pod。当访问量降下来之后,每个pod的负载降低了,HPA检测到每个pod的负载很低,然后会通知deployment修改pod的副本数。
配置HPA
可以直接使用命令行的方式来创建HPA,HPA设置语法如下。
kubectl autoscale deployment 名字 --min=M --max=N --cpu-percent=X
意思是此deployment最少运行M个Pod,确保每个pod的CPU的使用率最大不超过X%,否则就扩展pod的副本数,最大扩展到N。这里如果不写--cpu-percent的话,默认是80。
步骤1:查看当前是否有HPA配置。
##########实操验证##########
[root@vms10 deploy]# kubectl get hpa
No resources found in nsdeploy namespace.
[root@vms10 deploy]#
步骤2:创建hpa,设置web1最多运行5个,最少运行2个pod。
##########实操验证##########
[root@vms10 deploy]# kubectl autoscale deployment web1 --min=2 --max=5
horizontalpodautoscaler.autoscaling/web1 autoscaled
[root@vms10 deploy]#
步骤3:查看HPA。
##########实操验证##########
[root@vms10 deploy]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web1 Deployment/web1 <unknown>/80% 2 5 5 18s
[root@vms10 deploy]#
步骤4:把副本数设置为1,最后还是运行2个pod。
##########实操验证##########
[root@vms10 deploy]# kubectl scale deployment web1 --replicas=1
deployment.apps/web1 scaled
[root@vms10 deploy]#
步骤5:查看pod运行情况。
[root@vms10 deploy]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web1-57cb6d465f-zzbjj 1/1 Running 0 6m
[root@vms10 deploy]#
稍等一会,才能看到第2个pod。
##########实操验证##########
[root@vms10 deploy]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web1-6fbb48567f-96xnm 1/1 Running 0 15s
web1-6fbb48567f-m82jd 1/1 Running 0 25h
[root@vms10 deploy]#
因为HPA会通知deployment把副本数改为2。
步骤6:把副本数设置为0,最后还是运行2个pod。
##########实操验证##########
[root@vms10 deploy]# kubectl scale deployment web1 --replicas=0
deployment.apps/web1 scaled
[root@vms10 deploy]#
[root@vms10 deploy]# kubectl get pods
No resources found in nsdeploy namespace.
[root@vms10 deploy]#
步骤7:删除此HPA。
##########实操验证##########
[root@vms10 deploy]# kubectl delete hpa web1
horizontalpodautoscaler.autoscaling "web1" deleted
[root@vms10 deploy]#
创建HPA,要求CPU的使用率不超过80%。
不过此时如果要让--cpu-percent生效,必须要启用此deployment的资源请求。
步骤8:修改deployment的配置,设置每个容器的资源限制。
##########实操验证##########
[root@vms10 deploy]# kubectl edit deployment web1
...
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
resources:
requests:
cpu: 400m
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
...
把resources: {} 换成上面这样。
步骤9:把deployment的副本数改为1。
##########实操验证##########
[root@vms10 deploy]# kubectl scale deployment web1 --replicas=1
deployment.apps/web1 scaled
[root@vms10 deploy]#
步骤10:创建新的HPA,使得每个pod的CPU最大使用率不超过80%。
##########实操验证##########
[root@vms10 deploy]# kubectl autoscale deployment web1 --min=1 --max=5 --cpu-percent=80
horizontalpodautoscaler.autoscaling/web1 autoscaled
[root@vms10 deploy]#
步骤11:查看HPA。
##########实操验证##########
[root@vms10 deploy]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web1 Deployment/web1 <unknown>/80% 1 5 1 17s
[root@vms10 deploy]#
这里需要等一会,unknown才会变成具体值。
##########实操验证##########
#需要确认metrics-server是否工作正常
[root@vms10 1.8+]# kubectl get pods -n kube-system | grep metric
#如果未正常启动,则执行以下命令
[root@vms10 ~]# cd kubernetes-sigs-metrics-server-d1f4f6f/
[root@vms10 kubernetes-sigs-metrics-server-d1f4f6f]# cd deploy/1.8+/
[root@vms10 1.8+]# kubetl apply -f .
[root@vms10 1.8+]# kubectl get pods -n kube-system | grep metric
metrics-server-bcfb98c76-qmpg8
[root@vms10 1.8+]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web1 Deployment/web1 0%/80% 1 5 1 12m
[root@vms10 1.8+]#
测试HPA
本节实验是给pod创建负载,然后检测HPA是否把pod副本数增加了。
步骤1:确认现在环境里只有一个pod。
##########实操验证##########
[root@vms10 deploy]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web1-79cf6577f6-ft6gk 1/1 Running 0 5m14s
[root@vms10 deploy]#
步骤2:为此deploy创建一个服务,类型为NodePort。
##########实操验证##########
[root@vms10 deploy]# kubectl expose deployment web1 --port=80 --target-port=80 --type=NodePort
service/web1 exposed
[root@vms10 deploy]#
[root@vms10 deploy]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web1 NodePort 10.96.151.57 <none> 80:31699/TCP 5s
[root@vms10 deploy]#
这样直接访问192.168.26.10:32000的时候,就能访问到web1这个service了,然后这个service会把请求转发给后端的pod(web1创建出来的pod)。
所以这个service接收的访问量越大,后端pod接收的请求也就越大。
步骤3:在任意客户端上安装ab测试通过,这里在vms10上安装。
##########实操验证##########
[root@vms10 deploy]# yum install httpd-tools -y
步骤4:对192.168.26.10:32000进行压力测试。
##########实操验证##########
[root@vms10 1.8+]# ab -t 600 -n 1000000 -c 1000 http://192.168.1.110:31699/index.html
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.1.110 (be patient)
Completed 100000 requests
Completed 200000 requests
...
步骤5:在ssh客户端另外一个标签里执行如下命令。
##########实操验证##########
[root@vms10 ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web1 Deployment/web1 239%/80% 1 5 3 15m
[root@vms10 ~]#
可以看到当前pod里CPU负载为158%,已经扩展为2个pod了,下面看pod数。
##########实操验证##########
[root@vms10 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web1-79cf6577f6-ft6gk 1/1 Running 0 16m
web1-79cf6577f6-h4kch 1/1 Running 0 10s
web1-79cf6577f6-scz9h 1/1 Running 0 10s
[root@vms10 ~]#
步骤6:继续等待,查看pod数及每个pod的负载。
##########实操验证##########
[root@vms10 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web1-79cf6577f6-ft6gk 1/1 Running 0 17m
web1-79cf6577f6-h429n 1/1 Running 0 40s
web1-79cf6577f6-h4kch 1/1 Running 0 101s
web1-79cf6577f6-kr7xv 1/1 Running 0 40s
web1-79cf6577f6-scz9h 1/1 Running 0 101s
[root@vms10 ~]#
[root@vms10 ~]# kubectl top pods
W0601 19:34:59.177565 112751 top_pod.go:140] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag
NAME CPU(cores) MEMORY(bytes)
web1-79cf6577f6-ft6gk 399m 6Mi
web1-79cf6577f6-h429n 0m 2Mi
web1-79cf6577f6-h4kch 405m 7Mi
web1-79cf6577f6-kr7xv 0m 3Mi
web1-79cf6577f6-scz9h 511m 5Mi
[root@vms10 ~]#
步骤7:终止ab压力测试之后,再次检测pod数。
##########实操验证##########
[root@vms10 1.8+]# kubectl get pods
NAME READY STATUS RESTARTS AGE
web1-79cf6577f6-scz9h 1/1 Running 0 11m
[root@vms10 1.8+]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web1 Deployment/web1 0%/80% 1 5 1 26m
[root@vms10 1.8+]#
可以看到pod数又恢复到了1个。
注意:并不是pod负载降低之后,pod数就立即减少,要等一段时间,默认时间是5分钟,目的是防止pod数的抖动。
步骤8:自行删除此HPA,然后把副本数修改为5。