Kubernetes的Pod自動化擴縮容及HPA原理

在實際的業務場景中,咱們常常會遇到某個服務須要擴容的場景(例如:測試壓測、電商秒殺、大促、或因爲資源緊張、工做負載下降等等都須要對服務實例數進行擴縮容操做)。在Kubernetes中,能夠對Deployment/RC的Scale機制來方便的進行自動化擴縮容操做。html

Kubernetes擴縮容node

Kubernetes對Pod的擴縮容分爲:手動和自動兩種nginx

1.手動模式apache

手動模式經過kubectl scale命令對一個Deployment/RC進行Pod副本數量的設置。便可一鍵完成。api

示例:app

cat scale.yamlide

---工具

apiVersion: apps/v1性能

kind: Deployment測試

metadata:

 name: ops-nginx

 namespace: ops

spec:

 selector:

   matchLabels:

     app: ops-nginx

 replicas: 1

 template:

   metadata:

     labels:

       app: ops-nginx

   spec:

     imagePullSecrets:

     - name: cd-registry

     containers:

     - image: harbor.ttsingops.com/nginx/nginx:1.16.0

       name: ops-nginx

kubectl apply -f scale.yaml

kubectl get po -n ops

1.png

#進行擴容

kubectl scale deployment ops-nginx -n ops --replicas 5

2.png

#縮容操做

kubectl scale deployment ops-nginx -n ops --replicas 2

kubectl get po -n ops

3.png

2.自動模式

須要經過用戶根據某個性能指標或者基於Prometheus自定義指標來進行擴縮容,系統會自動在這個範圍內根據性能指標進行變化調整。

HAP簡介

 HPA(Horizontal Pod Autoscaler,Pod水平自動伸縮) 是從Kubernetes V1.1版本引入。用於實現基於CPU使用率進行自動Pod擴縮容的功能。 HPA控制器基於Master的kube-controller-manager服務啓動參數 --horizontal-pod-autoscaler-sync-period定義的時長,週期性的檢測目標Pod的CPU使用率,並在知足條件時對RC或Deployment中的Pod副本數量進行調整,以符合用戶定義的平均Pod CPU使用率。

HPA的版本演進:

目前HPA已經支持三大版本:autoscaling/v一、autoscaling/v2beta1和autuscaling/v2beta2 三個大版本。

哪這個三個版本有何區別呢?

autoscaling/v1版本,只支持CPU一個指標的Pod水平伸縮。

而autoscaling/v2beta1增長了支持自定義指標,除了cadvisor暴露的指標外,還支持自定義指標,好比像第三方提供的QPS,或者基於其餘的一些資源進行擴容,就是支持一些第三方的一些組件了。

autoscaling/v2beta2又額外增長了外部指標支持

HPA自動擴縮容原理?

 Kubernetes中的Metrics Server持續採集全部Pod副本的指標數據。HPA控制器經過Metrics Server的API(Heapster的API或聚合API,已經慢慢廢棄了,使用metrice Server)獲取這些數據,基於用於定義的擴縮容規則進行計算,獲得目標Pod副本數量。當目標Pod副本數量與當前副本數量不一樣時,HPA控制器向Pod的副本控制器(RC/Deployment)發起scale操做,調整Pod的副本數量,完成擴縮容操做。

4.png

思考:

若某個Pod的CPU使用率在在必定時間內,忽然升高其後立馬下降,這樣Pod豈不是頻繁的擴縮容。也便是副本的數量不斷的調整。這裏就會有冷卻週期。每次在擴縮容後,冷卻時間是多少。

在HPA中,默認的擴容冷卻週期是3min,縮容冷卻週期是5min。

能夠經過調整kube-controller-manager組件啓動參數設置冷卻時間:

--horizontal-pod-autoscaler-downscale-delay  擴容冷卻

--horizontal-pod-autoscaler-upscale-delay 縮容冷卻

示例:

下面經過一個示例,而後對pod進行施壓,進行自動擴縮容。

cat auto_scale.yaml

---

apiVersion: apps/v1

kind: Deployment

metadata:

 name: auto-nginx

 namespace: ops

spec:

 selector:

   matchLabels:

     app: auto-nginx

 replicas: 1

 template:

   metadata:

     labels:

       app: auto-nginx

   spec:

     imagePullSecrets:

     - name: cd-registry

     containers:

     - image: harbor.ttsingops.com/nginx/nginx:1.16.0

       name: auto-nginx

       resources:

         requests:

           cpu: 200m

       ports:

       - containerPort: 80

---

#Service

apiVersion: v1

kind: Service

metadata:

 name: auto-nginx

 namespace: ops

spec:

 type: NodePort

 ports:

 - port: 8088

   protocol: TCP

   targetPort: 80

   nodePort: 38088

 selector:

   app: auto-nginx

kubectl apply -f auto_scale.yaml

kubectl get svc,pod -n ops -o wide

5.png

cat auto_nginx_hpa.yaml

apiVersion: autoscaling/v1

kind: HorizontalPodAutoscaler

metadata:

 name: auto-nginx-hpa

 namespace: ops

spec:

 scaleTargetRef:

   apiVersion: apps/v1

   kind: Deployment

   name: auto-nginx

 minReplicas: 1

 maxReplicas: 8

 targetCPUUtilizationPercentage: 50

kubectl apply -f auto_nginx_hpa.yaml

kubectl get  hpa -n ops

6.png

使用apache的ab壓測工具進行施壓

能夠在node任意節點安裝ab工具

yum install -y httpd-tools

ab -n 10000000  -c 10000 http://192.168.1.211:38088/index.html

#由於我把Service映射到NodePort

#查看hpa狀況

kubectl get hpa -n ops

7.png

#查看Pod狀況

kubectl get pods -n ops

8.png

#查看events信息

kubectl get events -n ops

9.png

#等待幾分鐘後,再次查看Pod縮容狀況

kubectl get po -n ops

10.png

思考:

Kubernetes是如何對Pod的副本數量進行擴縮容的呢?

官網已經有詳細解釋:就是根據當前CPU指標和所需CPU指標進行相除。

例如:當前CPU指標爲200m,所需指標值爲100m,則副本數量將增長一倍,由於200.0/100.0=2。

若是當前值爲50m,會將副本數量減半,因50.0/100.0 = 0.5。

11.png

具體可參見官網解釋:

https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/

問題:

1.在進行HPA自動伸縮Pod,沒法進行自動伸縮

須要安裝metrics-server組件

可參見<<Ansbile部署Kubernetes 1.16.10 集羣>>中的5.安裝metrics-server

配置步驟

【參考資料】

https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/

相關文章
相關標籤/搜索