Kubernetes Pod水平自動伸縮(HPA)
阿新 • • 發佈:2020-09-30
### 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