HAP,全稱 Horizontal Pod Autoscaler, 能夠基於 CPU 利用率自動擴縮 ReplicationController、Deployment 和 ReplicaSet 中的 Pod 數量。 除了 CPU 利用率,也能夠基於其餘應程序提供的自定義度量指標來執行自動擴縮。 Pod 自動擴縮不適用於沒法擴縮的對象,好比 DaemonSet。
Pod 水平自動擴縮特性由 Kubernetes API 資源和控制器實現。資源決定了控制器的行爲。 控制器會週期性的調整副本控制器或 Deployment 中的副本數量,以使得 Pod 的平均 CPU 利用率與用戶所設定的目標值匹配。node
<span class="colour" style="color:rgb(51, 51, 51)">Pod HAP工做機制示意圖</span>nginx
實際生產中,普遍使用這四類指標:
一、Resource metrics - CPU核內存利用率指標
二、Pod metrics - 例如網絡利用率和流量
三、Object metrics - 特定對象的指標,好比Ingress, 能夠按每秒使用請求數來擴展容器
四、Custom metrics - 自定義監控,好比經過定義服務響應時間,當響應時間達到必定指標時自動擴容算法
<span class="colour" style="color:rgb(51, 51, 51)">好了,概念就說這些,想了解更多,請參看官網,如今開始實戰。</span>apache
<span class="colour" style="color:rgb(51, 51, 51)">一、首先咱們部署一個nginx,副本數爲2,請求cpu資源爲200m。同時爲了便宜測試,使用NodePort暴露服務。命名空間:hpa</span>api
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx namespace: hpa spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx resources: requests: cpu: 200m memory: 100Mi --- apiVersion: v1 kind: Service metadata: name: nginx namespace: hpa spec: type: NodePort ports: - port: 80 targetPort: 80 selector: app: nginx
<span class="colour" style="color:rgb(51, 51, 51)">二、查看部署結果</span>網絡
[root@k8s-node001 HPA]# kubectl get po -n hpa NAME READY STATUS RESTARTS AGE nginx-5c87768685-48b4v 1/1 Running 0 8m38s nginx-5c87768685-kfpkq 1/1 Running 0 8m38s
三、建立HPA
簡單說下:這裏建立一個HPA,用於控制咱們上一步驟中建立的 Deployment,使 Pod 的副本數量維持在 1 到 10 之間。
HPA 將經過增長或者減小 Pod 副本的數量(經過 Deployment)以保持全部 Pod 的平均 CPU 利用率在 50% 之內。
算法參見app
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: nginx namespace: hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50
<span class="colour" style="color:rgb(51, 51, 51)">四、查看部署結果</span>測試
[root@k8s-node001 HPA]# kubectl get hpa -n hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx Deployment/nginx 0%/50% 1 10 2 50s
五、壓測,觀察Pod數和HPA變化
執行壓測命令spa
[root@k8s-node001 ~]# ab -c 1000 -n 100000000 http://192.168.100.185:30792/ This is ApacheBench, Version 2.3 <$Revision: 1843412 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 192.168.100.185 (be patient)
<span class="colour" style="color:rgb(51, 51, 51)">觀察變化</span>.net
[root@k8s-node001 HPA]# kubectl get hpa -n hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx Deployment/nginx 303%/50% 1 10 7 12m [root@k8s-node001 HPA]# kubectl get po -n hpa NAME READY STATUS RESTARTS AGE pod/nginx-5c87768685-6b4sl 1/1 Running 0 85s pod/nginx-5c87768685-99mjb 1/1 Running 0 69s pod/nginx-5c87768685-cls7r 1/1 Running 0 85s pod/nginx-5c87768685-hhdr7 1/1 Running 0 69s pod/nginx-5c87768685-jj744 1/1 Running 0 85s pod/nginx-5c87768685-kfpkq 1/1 Running 0 27m pod/nginx-5c87768685-xb94x 1/1 Running 0 69s
從以上輸出能夠看出,hpa TARGETS達到了303%,須要擴容。pod數自動擴展到了7個。
繼續等待壓測結束或者直接打斷壓測
[root@k8s-node001 ~]# kubectl get hpa -n hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx Deployment/nginx 20%/50% 1 10 7 16m 。。。N分鐘後。。。 [root@k8s-node001 ~]# kubectl get hpa -n hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx Deployment/nginx 0%/50% 1 10 7 18m 。。。再過N分鐘後。。。 [root@k8s-node001 ~]# kubectl get po -n hpa NAME READY STATUS RESTARTS AGE nginx-5c87768685-jj744 1/1 Running 0 11m
這時,CPU 利用率已經降到 0,因此 HPA 將自動縮減副本數量至 1。
這裏須要注意下:爲何會將副本數降爲1,而不是咱們部署時指定的replicas: 2呢?
由於在建立HPA時,指定了副本數範圍,這裏是minReplicas: 1,maxReplicas: 10。因此HPA在縮減副本數時減到了1。
Tips: 自動擴縮完成副本數量的改變可能須要幾分鐘的時間。
<span class="colour" style="color:rgb(51, 51, 51)"></span>