1. 程式人生 > >Kubernetes Pod水平自動伸縮(HPA)

Kubernetes Pod水平自動伸縮(HPA)

### HPA簡介 HAP,全稱 Horizontal Pod Autoscaler, 可以基於 CPU 利用率自動擴縮 ReplicationController、Deployment 和 ReplicaSet 中的 Pod 數量。 除了 CPU 利用率,也可以基於其他應程式提供的自定義度量指標來執行自動擴縮。 Pod 自動擴縮不適用於無法擴縮的物件,比如 DaemonSet。 Pod 水平自動擴縮特性由 Kubernetes API 資源和控制器實現。資源決定了控制器的行為。 控制器會週期性的調整副本控制器或 Deployment 中的副本數量,以使得 Pod 的平均 CPU 利用率與使用者所設定的目標值匹配。 Pod HAP工作機制示意圖 ![](http://showdoc.ieasou.cn/server/index.php?s=/api/attachment/visitFile/sign/1e1f6f57a83b82c0ebf5a48798c7d70a&showdoc=.jpg) ***實際生產中,廣泛使用這四類指標:*** 1、Resource metrics - CPU核記憶體利用率指標 2、Pod metrics - 例如網路利用率和流量 3、Object metrics - 特定物件的指標,比如Ingress, 可以按每秒使用請求數來擴充套件容器 4、Custom metrics - 自定義監控,比如通過定義服務響應時間,當響應時間達到一定指標時自動擴容 好了,概念就說這些,想了解更多,請參看[官網](https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/ "官網"),現在開始實戰。 ### 示例 1、首先我們部署一個nginx,副本數為2,請求cpu資源為200m。同時為了便宜測試,使用NodePort暴露服務。名稱空間:hpa ```yaml 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 ``` 2、檢視部署結果 ```shell [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 ``` 3、建立HPA 簡單說下:這裡建立一個HPA,用於控制我們上一步驟中建立的 Deployment,使 Pod 的副本數量維持在 1 到 10 之間。 HPA 將通過增加或者減少 Pod 副本的數量(通過 Deployment)以保持所有 Pod 的平均 CPU 利用率在 50% 以內。 演算法[參見](https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/#algorithm-details "參見") ```yaml 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 ``` 4、檢視部署結果 ```shell [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 ``` 5、壓測,觀察Pod數和HPA變化 執行壓測命令 ```shell [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) ``` 觀察變化 ```shell [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個。 繼續等待壓測結束或者直接打斷壓測 ```shell [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**: 自動擴縮完成副本數量的改變可能需要幾分鐘的時間。 ### 總結 ![](http://showdoc.ieasou.cn/server/index.php?s=/api/attachment/visitFile/sign/eb8a71d90638a6d751efcf59a1f81ef8&showdo