CKA备考实验 | 水平自动更新HPA

书籍来源:《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。

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/131473771
今日推荐