學習K8S之路.14---K8S HPA自動進行擴容,縮容


上章,講述了在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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM