在實際的業務場景中,咱們常常會遇到某個服務須要擴容的場景(例如:測試壓測、電商秒殺、大促、或因爲資源緊張、工做負載下降等等都須要對服務實例數進行擴縮容操做)。在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
#進行擴容
kubectl scale deployment ops-nginx -n ops --replicas 5
#縮容操做
kubectl scale deployment ops-nginx -n ops --replicas 2
kubectl get po -n ops
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的副本數量,完成擴縮容操做。
思考:
若某個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
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
使用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
#查看Pod狀況
kubectl get pods -n ops
#查看events信息
kubectl get events -n ops
#等待幾分鐘後,再次查看Pod縮容狀況
kubectl get po -n ops
思考:
Kubernetes是如何對Pod的副本數量進行擴縮容的呢?
官網已經有詳細解釋:就是根據當前CPU指標和所需CPU指標進行相除。
例如:當前CPU指標爲200m,所需指標值爲100m,則副本數量將增長一倍,由於200.0/100.0=2。
若是當前值爲50m,會將副本數量減半,因50.0/100.0 = 0.5。
具體可參見官網解釋:
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/