k8s-HPA
一、認識HPA
參考: https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/
-
HPA全稱是Horizontal Pod Autoscaler,中文意思是POD水平自動伸縮.
-
可以基于 CPU 利用率自動擴縮 ReplicationController、Deployment、ReplicaSet 和 StatefulSet 中的 Pod 數(shù)量。
-
除了 CPU 利用率,內(nèi)存占用外,也可以基于其他應程序提供的自定義度量指標來執(zhí)行自動擴縮。
自定義度量參考: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/instrumentation/custom-metrics-api.md
-
Pod 自動擴縮不適用于無法擴縮的對象,比如 DaemonSet。
-
Pod 水平自動擴縮特性由 Kubernetes API 資源和控制器實現(xiàn)。資源決定了控制器的行為。
-
控制器會周期性的調(diào)整副本控制器或 Deployment 中的副本數(shù)量,以使得 Pod 的平均 CPU 利用率與用戶所設定的目標值匹配。
二、HPA工作機制
Pod 水平自動擴縮器的實現(xiàn)是一個控制回路,由控制器管理器的 --horizontal-pod-autoscaler-sync-period 參數(shù)指定周期(默認值為 15 秒)。
每個周期內(nèi),控制器管理器根據(jù)每個 HorizontalPodAutoscaler 定義中指定的指標查詢資源利用率。 控制器管理器可以從資源度量指標 API(按 Pod 統(tǒng)計的資源用量)和自定義度量指標 API(其他指標)獲取度量值。
-
對于按 Pod 統(tǒng)計的資源指標(如 CPU), 控制器從資源指標 API 中獲取每一個 HorizontalPodAutoscaler 指定的 Pod 的度量值,如果設置了目標使用率, 控制器獲取每個 Pod 中的容器資源使用情況,并計算資源使用率。 如果設置了 target 值,將直接使用原始數(shù)據(jù)(不再計算百分比)。 接下來,控制器根據(jù)平均的資源使用率或原始值計算出擴縮的比例,進而計算出目標副本數(shù)。
需要注意的是,如果 Pod 某些容器不支持資源采集,那么控制器將不會使用該 Pod 的 CPU 使用率。
-
如果 Pod 使用自定義指示,控制器機制與資源指標類似,區(qū)別在于自定義指標只使用 原始值,而不是使用率。
-
如果 Pod 使用對象指標和外部指標(每個指標描述一個對象信息)。 這個指標將直接根據(jù)目標設定值相比較,并生成一個上面提到的擴縮比例。 在 autoscaling/v2beta2 版本 API 中,這個指標也可以根據(jù) Pod 數(shù)量平分后再計算。
通常情況下,控制器將從一系列的聚合 API(metrics.k8s.io、custom.metrics.k8s.io 和 external.metrics.k8s.io)中獲取度量值。 metrics.k8s.io API 通常由 Metrics 服務器(需要額外啟動)提供。
確認安裝metrics-server
[root@master1 ~]# kubectl get pods -n kube-system |grep metrics-server metrics-server-869ffc99cd-lz68h 1/1 Running 5 23h [root@master1 ~]# kubectl top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% 192.168.122.11 357m 4% 895Mi 17% 192.168.122.12 426m 5% 910Mi 28% 192.168.122.13 353m 4% 664Mi 20% 192.168.122.14 251m 3% 408Mi 12%三、HPA API對象
HPA的API有三個版本
[root@master1 ~]# kubectl api-versions | grep autoscal autoscaling/v1 autoscaling/v2beta1 autoscaling/v2beta2| autoscaling/v1 | 只支持基于CPU指標的縮放 |
| autoscaling/v2beta1 | 支持Resource Metrics(資源指標,如pod的CPU)和Custom Metrics(自定義指標)的縮放; |
| autoscaling/v2beta2 | 支持Resource Metrics(資源指標,如pod的CPU)和Custom Metrics(自定義指標)和ExternalMetrics(額外指標)的縮放。 |
四、kubectl對HPA的支持
與其他 API 資源類似,kubectl 以標準方式支持 HPA。
-
通過 kubectl create 命令創(chuàng)建一個 HPA 對象
-
通過 kubectl get hpa 命令來獲取所有 HPA 對象
-
通過 kubectl describe hpa 命令來查看 HPA 對象的詳細信息
-
通過 kubectl delete hpa 命令刪除對象。
此外,還有個簡便的命令 kubectl autoscale 來創(chuàng)建 HPA 對象。
例如,命令 kubectl autoscale rs foo --min=2 --max=5 --cpu-percent=80 將會為名 為 foo 的 ReplicationSet 創(chuàng)建一個 HPA 對象, 目標 CPU 使用率為 80%,副本數(shù)量配置為 2 到 5 之間。
五、HPA演示案例
參考: https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
基于CPU的HPA
1, 構(gòu)建測試鏡像
[root@master1 ~]# vim index.php <?php$x = 0.0001;for ($i = 0; $i <= 1000000; $i++) {$x += sqrt($x);}echo "OK!"; ?> [root@master1 ~]# vim Dockerfile FROM php:5-apache COPY index.php /var/www/html/index.php RUN chmod a+rx index.php [root@master1 ~]# docker build -f Dockerfile -t 192.168.122.18/library/hpa-example:v1 .2, 上傳到harbor
[root@master1 ~]# docker login 192.168.122.18 Username: admin Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded [root@master1 ~]# docker push 192.168.122.18/library/hpa-example:v13, 部署測試deployment
[root@master1 ~]# vim php-apache.yaml apiVersion: apps/v1 kind: Deployment metadata:name: php-apache spec:selector:matchLabels:app: php-apachereplicas: 1template:metadata:labels:app: php-apachespec:containers:- name: php-apacheimage: 192.168.122.18/library/hpa-example:v1ports:- containerPort: 80resources:limits:cpu: 500mrequests:cpu: 200m [root@master1 ~]# kubectl apply -f php-apache.yaml deployment.apps/php-apache created4, 驗證得到pod-IP
[root@master1 ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READIN ESS GATES php-apache-665fc66c67-cfj6f 1/1 Running 0 25m 10.3.104.15 192.168.122.14 <none> <none>得到pod-IP為10.3.104.15,此IP下面測試需要用到
5, 創(chuàng)建HPA
[root@master1 ~]# kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10 horizontalpodautoscaler.autoscaling/php-apache autoscaled說明:
- –cpu-percent=50表示所有Pod的平均CPU使用率維持在50%,超過就要擴容
- –min=1 --max=10表示pod數(shù)量的范圍
6, 創(chuàng)建測試pod對其訪問
用另一個終端(我這里是master2)使用busybox鏡像產(chǎn)生一個測試pod,對10.3.104.15進行壓測
[root@master2 ~]# kubectl run busybox -it --image=busybox /bin/sh/ # while true; do wget -q -O- http://10.3.104.15; done 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!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!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!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!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!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!......不斷查詢hpa狀態(tài),大概一分鐘后才會看到效果
[root@master1 ~]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 250%/50% 1 10 1 19m cpu用到250%了 [root@master1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE busybox 1/1 Running 0 3m27s php-apache-665fc66c67-8z6wj 1/1 Running 0 59s php-apache-665fc66c67-cfj6f 1/1 Running 0 26m php-apache-665fc66c67-fn4wg 1/1 Running 0 59s php-apache-665fc66c67-t9wpr 1/1 Running 0 44s php-apache-665fc66c67-zw662 1/1 Running 0 60s 也可以看到pod擴容到了5個 [root@master2 ~]# kubectl run busybox -it --image=busybox /bin/sh/ # while true; do wget -q -O- http://10.3.104.15; done 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!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!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!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!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!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!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!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!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!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!OK!OK!OK!^ ctrl+c取消壓力測試要等幾分鐘甚至更久后,就看到cpu與pod數(shù)量都回去了
[root@master1 ~]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 0%/50% 1 10 5 22m[root@master1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE busybox 1/1 Running 0 28m php-apache-665fc66c67-t9wpr 1/1 Running 0 25m7, 測試完后刪除
[root@master1 ~]# kubectl delete deployments.apps php-apache deployment.apps "php-apache" deleted[root@master1 ~]# kubectl delete pod busybox pod "busybox" deleted[root@master1 ~]# kubectl delete hpa php-apache horizontalpodautoscaler.autoscaling "php-apache" deleted基于內(nèi)存的HPA
1, 創(chuàng)建測試deployment
[root@master1 ~]# vim nginx-hpa.yaml apiVersion: apps/v1 kind: Deployment metadata:name: nginx-hpa spec:selector:matchLabels:app: nginx-hpareplicas: 1template:metadata:labels:app: nginx-hpaspec:containers:- name: nginximage: nginx:1.15-alpineports:- containerPort: 80name: httpprotocol: TCPresources:requests:cpu: 0.01memory: 25Milimits:cpu: 0.05memory: 60Mi [root@master1 ~]# kubectl apply -f nginx-hpa.yaml deployment.apps/nginx-hpa created2, 創(chuàng)建HPA
[root@master1 ~]# vim mem-hpa.yaml apiVersion: autoscaling/v2beta1 # v2beta1版本 kind: HorizontalPodAutoscaler metadata:name: nginx-hpa spec:maxReplicas: 10minReplicas: 1 # 1-10個pod范圍內(nèi)擴容與裁剪scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: nginx-hpametrics:- type: Resource resource:name: memorytargetAverageUtilization: 50 # 50%內(nèi)存利用 [root@master1 ~]# kubectl apply -f mem-hpa.yaml horizontalpodautoscaler.autoscaling/nginx-hpa created [root@master1 ~]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx-hpa Deployment/nginx-hpa 12%/50% 1 10 1 60s3, 對pod進行測試
換一個終端(master2),進入pod后進行dd命令測試
[root@master2 ~]# kubectl exec -it nginx-hpa-74ccf95f7d-454z5 -- /bin/sh / # dd if=/dev/zero of=/tmp/file14, 驗證
不斷查詢hpa狀態(tài),大概一分鐘后才會看到效果
[root@master1 ~]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx-hpa Deployment/nginx-hpa 204%/50% 1 10 5 3m10s[root@master1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-hpa-74ccf95f7d-454z5 1/1 Running 0 6m20s nginx-hpa-74ccf95f7d-8gznw 1/1 Running 0 30s nginx-hpa-74ccf95f7d-bv4hm 1/1 Running 0 30s nginx-hpa-74ccf95f7d-g9276 1/1 Running 0 15s nginx-hpa-74ccf95f7d-xmzqs 1/1 Running 0 30s5, 裁剪測試
ctrl+c取消后,刪除dd的文件
[root@master2 ~]# kubectl exec -it nginx-hpa-74ccf95f7d-454z5 -- /bin/sh/ # rm /tmp/file1 -rf等幾分鐘甚至更久后,就看到cpu與pod數(shù)量都回去了
[root@master1 ~]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx-hpa Deployment/nginx-hpa 12%/50% 1 10 1 28m[root@master1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-hpa-74ccf95f7d-xmzqs 1/1 Running 0 25m6, 測試完后刪除
[root@master1 ~]# kubectl delete deploy nginx-hpa deployment.apps "nginx-hpa" deleted[root@master1 ~]# kubectl delete hpa nginx-hpa horizontalpodautoscaler.autoscaling "nginx-hpa" deleted寫在最后,更多功能可以自己去探索。雖然目前HPA功能還在beta版,但以后肯定會越來越成熟。
總結(jié)
- 上一篇: c语言循环移位寄存器,[转载]关于移位寄
- 下一篇: 计算机网络近年的发展趋势,【网络技术论文