HPA的全称为Horizontal Pod Autoscaling,它能够根据当前pod资源的使用率(如CPU、磁盘、内存等),进行副本数的动态的扩容与缩容,以便减轻各个pod的压力。当pod负载达到必定的阈值后,会根据扩缩容的策略生成更多新的pod来分担压力,当pod的使用比较空闲时,在稳定空闲一段时间后,还会自动减小pod的副本数量。php
若要实现自动扩缩容的功能,还须要部署heapster服务,用来收集及统计资源的利用率,支持kubectl top命令,heapster服务集成在prometheus(普罗米修斯) MertricServer服务中,因此说,为了方便,我这里基于prometheus服务的环境上进行部署HPA(动态扩缩容)的服务。node
能够参考博文:k8s群集的三种Web-UI界面部署中的第三个部署Prometheus服务,来运行prometheus服务,若是不想部署prometheus,那么能够参考github上来单独部署heapster服务,git
//要想实现pod副本数量的一个扩缩容,就必须保证,能够在master上执行下面的命令github
//查看节点的资源使用状况 [root@docker-k8s01 kube-prometheus]# kubectl top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% docker-k8s01 101m 5% 1315Mi 76% docker-k8s02 59m 2% 1077Mi 62% docker-k8s03 54m 2% 1131Mi 65%
//运行这个hpa-example,请求CPU的资源位200m,暴露一个80端口 [root@docker-k8s01 ~]# kubectl run php-apache --image=mirrorgooglecontainers/hpa-example --requests=cpu=200m --expose --port=80 //当deployment资源对象的CPU使用率高达50%时,就会进行扩容,最多扩容到10个 [root@docker-k8s01 ~]# kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10 //上述的命令做用是生成了一个HPA的控制器,用于控制自动扩缩容 //查看php-apache对应的svc群集IP [root@docker-k8s01 ~]# kubectl get svc | grep php-apache php-apache ClusterIP 10.98.31.183 <none> 80/TCP 82s //肯定当前pod数量 [root@docker-k8s01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE php-apache-867f97c8cb-g8kl9 1/1 Running 0 2m30s
//建立一个应用,用来不停的访问咱们刚刚建立的php-apache的svc资源。也可使用node节点,多开几个终端来进行访问。docker
//在多台节点上输入以下命令模拟多用户对php-apaache形成成吨伤害 [root@docker-k8s01 ~]# kubectl run -i --tty load-generator --image=busybox /bin/sh / # while true; do wget -q -O- 10.98.31.183; done //每一次OK都是对php-apache的确定,访问成功 OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!O
//接下来咱们查看资源使用状况apache
//查看hpa的资源使用,能够看到才第二次就直接飙到了300%多 [root@docker-k8s01 ~]# kubectl get hpa -w NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 0%/50% 1 10 1 6m17s php-apache Deployment/php-apache 331%/50% 1 10 1 10m php-apache Deployment/php-apache 331%/50% 1 10 4 11m php-apache Deployment/php-apache 894%/50% 1 10 7 11m php-apache Deployment/php-apache 894%/50% 1 10 10 11m //能够看到咱们的10个pod都已经就绪了 [root@docker-k8s01 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE load-generator-7d549cd44-8x96c 1/1 Running 0 5m48s php-apache-867f97c8cb-44d2p 1/1 Running 0 3m4s php-apache-867f97c8cb-6qf6b 1/1 Running 0 3m34s php-apache-867f97c8cb-bhjtd 1/1 Running 0 3m4s php-apache-867f97c8cb-fwhvs 1/1 Running 0 3m34s php-apache-867f97c8cb-g8kl9 1/1 Running 0 16m php-apache-867f97c8cb-gjzl7 1/1 Running 0 3m4s php-apache-867f97c8cb-ktgnv 1/1 Running 0 3m34s php-apache-867f97c8cb-mhm75 1/1 Running 0 3m19s php-apache-867f97c8cb-pnwkf 1/1 Running 0 3m19s php-apache-867f97c8cb-zqd62 1/1 Running 0 3m19s [root@docker-k8s01 ~]# kubectl get deployments. NAME READY UP-TO-DATE AVAILABLE AGE load-generator 1/1 1 1 6m42s php-apache 10/10 10 10 17m
//当中止死循环请求后,也并不会当即减小pod数量,会等一段时间后减小pod数量,防止流量再次激增。ide