上章,講述了在K8S中部署metrics server,為本章的HPA做了一定的鋪墊。下面簡單說說HPA
HPA全稱是Horizontal Pod Autoscaler,翻譯成中文是POD水平自動伸縮,以下都會用HPA代替Horizontal Pod Autoscaler,HPA可以基於CPU利用率對replication controller、deployment和replicaset中的pod數量進行自動擴縮容(除了CPU利用率也可以基於其他應程序提供的度量指標custom metrics進行自動擴縮容)。pod自動縮放不適用於無法縮放的對象,比如DaemonSets。HPA由Kubernetes API資源和控制器實現。
一:HPA工作原理
HPA的實現是一個控制循環,由controller manager的–horizontal-pod-autoscaler-sync-period參數指定周期(默認值為15秒)。每個周期內,controller manager根據每個HorizontalPodAutoscaler定義中指定的指標查詢資源利用率。controller manager可以從resource metrics API(pod 資源指標)和custom metrics API(自定義指標)獲取指標。
官網參考文檔:
https://v1-17.docs.kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
二:HPA API對象
HPA的API有三個版本,通過kubectl api-versions | grep autoscal可看到: autoscaling/v1 autoscaling/v2beta1 autoscaling/v2beta2 注釋: autoscaling/v1只支持基於CPU指標的縮放; autoscaling/v2beta1支持Resource Metrics(資源指標,如pod的CPU)和Custom Metrics(自定義指標)的縮放; autoscaling/v2beta2支持Resource Metrics(資源指標,如pod的CPU)和Custom Metrics(自定義指標)和ExternalMetrics(額外指標)的縮放
三:基於CPU自動擴容,進行講述:
1:以tomcat為例,創建資源配置清單
-6-96 tomcat-hpa]# vi dp.yaml kind: Deployment metadata: name: tomcat-hpa namespace: app spec: selector: matchLabels: app: tomcat-hpa template: metadata: labels: app: tomcat-hpa spec: containers: - name: tomcat-hpa image: harbor.auth.com/base/tomcat:v1.0 imagePullPolicy: IfNotPresent ports: - containerPort: 8080 resources: limits: cpu: 200m requests: cpu: 80m -6-96 tomcat-hpa]# cat svc.yaml apiVersion: v1 kind: Service metadata: name: tomcat-hpa-svc namespace: app spec: ports: - port: 8080 protocol: TCP selector: app: tomcat-hpa type: ClusterIP
2:應用資源配置清單
k8s-6-94 ~]# kubectl apply -f http://k8s-yaml.auth.com/tomcat-hpa/dp.yaml k8s-6-94 ~]# kubectl apply -f http://k8s-yaml.auth.com/tomcat-hpa/svc.yaml
3:創建HPA
tomcat-hpa服務正在運行,使用kubectl autoscale創建自動縮放器,實現對tomcat-hpa這個deployment創建的pod自動擴縮容,下面的命令將會創建一個HPA,HPA將會根據CPU,內存等資源指標增加或減少副本數,創建一個可以實現如下目的的hpa:
1)讓副本數維持在1-10個之間(這里副本數指的是通過deployment部署的pod的副本數)
2)將所有Pod的平均CPU使用率維持在50%(通過kubectlrun運行的每個pod如果是80毫核,這意味着平均CPU利用率為40毫核
給上面tomcat-hpa這個deployment創建HPA
k8s-6-94 ~]# kubectl autoscale deployment tomcat-hpa -n app --cpu-percent=50 --min=1 --max=10
注釋:
kubectl autoscale deployment tomcat-hpa (tomcat-hpa表示deployment的名字) --cpu-percent=50(表示cpu使用率不超過50%) --min=1(最少一個pod) --max=10(最多10個pod)
4:驗證HPA
-6-95 ~]# kubectl get hpa -n app NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE tomcat-hpa Deployment/tomcat-hpa 2%/50% 1 10 1 4m3s
5:進行壓測查看pod的數量變化
1:查看svc地址為:10.100.114.140 2:進行壓力測試: while true; do wget -q -O- http://10.100.114.140:8080/test/index.html; done 3:查看hpa負載 -6-95 ~]# kubectl get hpa -n app NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE tomcat-hpa Deployment/tomcat-hpa 210%/50% 1 10 1 4m8s 4:查看pod數量變化 -6-95 ~]# kubectl get pods -n app -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES tomcat-hpa-664cc9d9f9-24r8s 1/1 Running 0 6s 172.6.95.8 k8s-6-95.host.com <none> <none> tomcat-hpa-664cc9d9f9-4xpsb 1/1 Running 0 6s 172.6.95.7 k8s-6-95.host.com <none> <none> tomcat-hpa-664cc9d9f9-8w7tk 1/1 Running 0 7m52s 172.6.94.5 k8s-6-94.host.com <none> <none> tomcat-hpa-664cc9d9f9-gk9k6 1/1 Running 0 6s 172.6.94.6 k8s-6-94.host.com <none> <none> 5:測試停止后,pod數量減少為1 -6-95 ~]# kubectl get pods -n app -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES tomcat-hpa-664cc9d9f9-4xpsb 1/1 Running 0 8m36s 172.6.95.7 k8s-6-95.host.com <none> <none>
注釋:如果要刪除存在的HPA:kubectl delete hpa tomcat-hpa -n app
四:基於內存自動擴容
1:修改資源配置清單
-6-96 tomcat-hpa]# cat dp.yaml apiVersion: apps/v1 kind: Deployment metadata: name: tomcat-hpa namespace: app spec: selector: matchLabels: app: tomcat-hpa template: metadata: labels: app: tomcat-hpa spec: containers: - name: tomcat-hpa image: harbor.auth.com/base/tomcat:v1.0 imagePullPolicy: IfNotPresent ports: - containerPort: 8080 resources: limits: memory: 500Mi requests: memory: 300Mi -6-96 tomcat-hpa]# cat tomcat-memory-hpa.yaml apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: tomcat-hpa namespace: app spec: maxReplicas: 10 minReplicas: 1 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: tomcat-hpa metrics: - type: Resource resource: name: memory targetAverageUtilization: 20
注釋:添加hpa資源配置清單。targetAverageUtilization: 20 表示使用內存的20%(也就是300Mi的20%)
2:應用資源配置清單
-6-94 ~]# kubectl apply -f http://k8s-yaml.auth.com/tomcat-hpa/dp.yaml -6-94 ~]# kubectl apply -f http://k8s-yaml.auth.com/tomcat-hpa/tomcat-memory-hpa.yaml
3:驗證HPA,進行測試,觀察pod數量變化
-6-94 ~]# kubectl get hpa -n app NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE tomcat-hpa Deployment/tomcat-hpa 27%/20% 1 10 1 18s -6-94 ~]# kubectl get pods -n app -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES tomcat-hpa-59764c648b-2mqq4 1/1 Running 0 17s 172.6.95.7 k8s-6-95.host.com <none> <none> tomcat-hpa-59764c648b-d4rxt 1/1 Running 0 17m 172.6.94.5 k8s-6-94.host.com <none> <none>
