1、什么是K8s的弹性伸缩?
答:Hpa(全称叫做Horizontal Pod Autoscaler),Horizontal Pod Autoscaler的操作对象是Replication Controller、ReplicaSet或者Deployment对应的Pod(k8s中可以控制Pod的是rc、rs、deployment),根据观察到的CPU使用量与用户的阈值进行比对,做出是否需要增加或者减少实例数量的决策。controller目前使用heapSter来检测CPU使用量,检测周期默认是30秒。
2、K8s的弹性伸缩的工作原理?
答:Horizontal Pod Autoscaler的工作原理,主要是监控一个Pod,监控这个Pod的资源CPU使用率,一旦达到了设置的阈值,就做策略来决定它是否需要增加,做策略的时候还需要一个周期,比如,持续五分钟都发现CPU使用率高,就抓紧增加Pod的数量来减轻它的压力。当然也有一个策略,就是持续五分钟之后,压力一直都很低,那么会减少Pod的数量。这就是k8s的弹性伸缩的工作原理,主要是监控CPU的使用率,然后来决定是否增加或者减少Pod的数量。
3、K8s的弹性伸缩的实践,为了演示效果,这里对rc进行cpu资源的进行限制,方便压力测试效果。
1 [root@k8s-master ~]# cd k8s/ 2 [root@k8s-master k8s]# ls 3 book-master.war dashboard dashboard.zip deploy health heapster namespace pod rc skydns skydns.zip svc tomcat_demo tomcat_demo.zip 4 [root@k8s-master k8s]# mkdir hpa 5 [root@k8s-master k8s]# cd hpa/ 6 [root@k8s-master hpa]# ls 7 [root@k8s-master hpa]# cp ../rc/nginx_rc.yaml . 8 [root@k8s-master hpa]# ls 9 nginx_rc.yaml 10 [root@k8s-master hpa]# vim nginx_rc.yaml
配置内容,如下所示:
1 apiVersion: v1 2 kind: Pod 3 metadata: 4 name: myweb 5 labels: 6 app: web 7 env: myweb 8 spec: 9 containers: 10 - name: myweb 11 image: 192.168.110.133:5000/nginx:1.13 12 ports: 13 - containerPort: 80 14 resources: 15 # 最大可以使用的资源,100m的cpu时间片,50Mi的内存。 16 limits: 17 cpu: 100m 18 memory: 50Mi 19 # requests代表资源Pod需求的资源,100m的cpu时间片,50Mi的内存。 20 requests: 21 cpu: 100m 22 memory: 50Mi
开始创建这个RC,如下所示:
1 [root@k8s-master hpa]# kubectl create -f nginx_rc.yaml 2 replicationcontroller "myweb" created 3 [root@k8s-master hpa]#
查看初始的数量是两个,如下所示:
1 [root@k8s-master hpa]# kubectl get all 2 NAME DESIRED CURRENT READY AGE 3 rc/myweb 2 2 2 31s 4 5 NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE 6 svc/kubernetes 10.254.0.1 <none> 443/TCP 23d 7 8 NAME READY STATUS RESTARTS AGE 9 po/myweb-c0rs7 1/1 Running 0 31s 10 po/myweb-jkqc7 1/1 Running 0 31s 11 [root@k8s-master hpa]# kubectl get all -o wide 12 NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR 13 rc/myweb 2 2 2 35s myweb 192.168.110.133:5000/nginx:1.13 app=myweb 14 15 NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR 16 svc/kubernetes 10.254.0.1 <none> 443/TCP 23d <none> 17 18 NAME READY STATUS RESTARTS AGE IP NODE 19 po/myweb-c0rs7 1/1 Running 0 35s 172.16.16.4 k8s-node3 20 po/myweb-jkqc7 1/1 Running 0 35s 172.16.94.3 k8s-node2 21 [root@k8s-master hpa]#
4、开始创建hpa,可以通过配置文件或者命令进行声明,如下所示:
1 kubectl autoscale 资源类型(rc、deployment) 资源的名称 最大的pod数量 最小的pod数量 pod设定的阈值,cpu达到%多少使用率的时候就会触发hpa。
pod设定的阈值,cpu达到%多少使用率的时候就会触发hpa,这里测试的时候设置的比较低,生产环境可以设置60%、70%这些,较高些。
1 [root@k8s-master hpa]# kubectl autoscale replicationcontroller myweb --max=8 --min=1 --cpu-percent=5 2 replicationcontroller "myweb" autoscaled 3 [root@k8s-master hpa]#
此时,查看启动的资源,如下所示:
1 [root@k8s-master hpa]# kubectl get all 2 NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE 3 hpa/myweb ReplicationController/myweb 5% <waiting> 1 8 53s 4 5 NAME DESIRED CURRENT READY AGE 6 rc/myweb 2 2 2 7m 7 8 NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE 9 svc/kubernetes 10.254.0.1 <none> 443/TCP 23d 10 11 NAME READY STATUS RESTARTS AGE 12 po/myweb-c0rs7 1/1 Running 0 7m 13 po/myweb-jkqc7 1/1 Running 0 7m 14 [root@k8s-master hpa]# kubectl get all -o wide 15 NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE 16 hpa/myweb ReplicationController/myweb 5% <waiting> 1 8 56s 17 18 NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR 19 rc/myweb 2 2 2 7m myweb 192.168.110.133:5000/nginx:1.13 app=myweb 20 21 NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR 22 svc/kubernetes 10.254.0.1 <none> 443/TCP 23d <none> 23 24 NAME READY STATUS RESTARTS AGE IP NODE 25 po/myweb-c0rs7 1/1 Running 0 7m 172.16.16.4 k8s-node3 26 po/myweb-jkqc7 1/1 Running 0 7m 172.16.94.3 k8s-node2 27 [root@k8s-master hpa]#
这里可以看到由hpa控制rc,rc来控制pod的数量,现在开始进行压力测试,这里使用的ab的命令,首先查询到这个pod的ip地址,如下所示:
1 [root@k8s-master hpa]# kubectl get all -o wide 2 NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE 3 hpa/myweb Rep