如果有在經營網站都知道,每天有不同的流量。當有很多用戶訪問時,你需要增加Pod的數量,以處理更多的請求,並保證網站的性能和可靠性。當流量下降時,也需要減少Pod的數量,以節省資源和成本。如果手動管理Pod的數量或是固定replicas的值,前者會非常繁瑣且容易出錯後者則是無形中浪費很多資源成本。在K8s中就提供了自動橫向擴展(Horizontal Pod Autoscaling,簡稱 HPA)功能用於自動調整應用程式水平擴展的機制,它可以自動監測應用程式的指標,並根據情況自動調整Pod的數量,以保證應用程式的性能和可靠性哦!



新增HPA資源

首先我們繼續沿用上一篇Deployment的定義檔【點我參考】,並將「spec.replicas」原始副本數量改成1」
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wadweb-deployment
  labels:
    app: wadweb-deployment
spec:
  selector:
    matchLabels:
      app: wadweb
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      name: wadweb
      labels:
        app: wadweb
    spec:
      containers:
      - name: wadwebapp
        image: "你的registryURL/wad-web:v2.0.0"
				imagePullPolicy: Always
        resources:
          limits:
            cpu: 200m
            memory: 500Mi
          requests:
            cpu: 100m
            memory: 200Mi
        ports:
          - containerPort: 80
            name: http
      - name: wadwebapi
        image: "你的registryURL/wad-web-api:v2.0.0"
				imagePullPolicy: Always
        resources:
          limits:
            cpu: 2000m
            memory: 2Gi
          requests:
            cpu: 1000m
            memory: 1Gi
        env:
          - name: DOTNET_RUNNING_IN_CONATINER
            value: "true"
          - name: ASPNETCORE_ENVIRONMENT
            value: "Development"
          - name: ASPNETCORE_URLS
            value: "http://+:8080"
          - name: ConnectionStrings__DefaultConnection
            value: "Server=你的SQLServer Connection;Initial Catalog=WADREQM;Persist Security Info=False;User ID=你的SQLServer帳號;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=true;Connection Timeout=30;"
          - name: Connection__Key
            value: "我是密碼"
          - name: HostUrl__RemoteHost
            value: "http://192.168.1.34:8080"
          - name: TZ
            value: "Asia/Taipei"
        volumeMounts:
          - name: fileupload
            mountPath: /app/upload
        ports:
          - containerPort: 8080
            name: http        
      volumes:
        - name: fileupload
          hostPath:
            path: /run/desktop/mnt/host/d/Kubernetes/fileupload
            type: DirectoryOrCreate
      restartPolicy: Always
由於HPA本身是一種資源物件因此他也有自己的定義檔要設定,我們直接把HPA的資源往Deployment的下面加入(也可以另外寫一個定義檔管理)

v1版本

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: wadweb-autoscaling
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: wadweb-deployment
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 30

v2版本

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: wadweb-autoscaling
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: wadweb-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 30
  • spec.scaleTargetRef:指定要自動擴展的資源,這裡我們選擇上方範例設定的Deployment
    💡 kind可以是Deployment或ReplicaSet。正常情況下都不會單獨寫ReplicaSet,所以基本上記得是Deployment最簡單XD
  • spec.minReplicas:最小副本數量
  • spec.maxReplicas:最大副本數量
  • spec.targetCPUUtilizationPercentage:當資源使用量達到這個數值時就會進行自動橫向擴展
    💡 這裡的數值是百分比的意思,以Web API的Pod為範例:我們設定spec.container.resource.requests.cpu=1000m,因此當我們使用率達到300m(1000m * 30%)時就會自動啟動橫向擴展
    💡 v2版本沒有這個屬性,取而代之的是metrics;它可以做更細部的設定!

撰寫完定義檔後就可以部署上去K8s


部署完成後就可以使用指令查看HPA當前的狀態
kubectl get hpa
  • TARGETS:欄位這裡顯示的是當前資源使用率 / 自動擴展臨界值」
    💡 如果TARGETS欄位左手邊是「UNKNOWN」表示沒有安裝Metrics Server【點我前往安裝
  • MINPODS:最小Pod數量(對應spec.minReplicas)
  • MAXPODS:最大Pod數量(對應spec.maxReplicas)
  • REPLICAS:當前的Pod數量




壓力測試

成功部署HPA後我們來使用壓力測試工具」來觀察Pod的數量變化,因為還沒學習Service的用法所以我們還是直接使用port-forward」導出服務並確認Web API是否可以連線(Swagger畫面有無出現)
kubectl port-forward Pod的名稱 8080:8080


這裡會用到Jmeter」這套壓力測試工具來打其中一個API做測試(這裡使用10個執行序,連續打3分鐘)


壓力測試開始後就可以使用指令來監控HPA的變化
kubectl get hpa wadweb-autoscaling --watch


監控後可以看到在服務達到尖峰的時候會逐漸開啟HPA的功能,最忙的時候還開到6個Pod去處理,是不是很厲害呢!另外從Docker Desktop來看也可以發現原本只有一個Pod,到後面逐漸增加的過程哦!

原本只有一個Pod

逐漸增加的Pod



3分鐘時間到停止打API後也可以看到資源使用率也慢慢的下降此時可以看到Pod數量依然是6個,接著我們再等個數分鐘可以發現神奇的事情發生了!由於已經不是尖峰時段,Pod的數量就自動減少,最終保持在1個Pod的數量


最後附上整個HPA的運作過程.gif