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