設定水平自動調度 Pod 資源

本頁面說明如何在 Google Kubernetes Engine (GKE) 中,使用資源分配、負載平衡器流量、自訂指標或多個指標等指標,自動調整資源,進而調度 Deployment 資源。本頁面也提供逐步操作說明,引導您設定 HorizontalPodAutoscaler (HPA) 設定檔,包括如何查看、刪除、清除及排解 HPA 物件問題。Deployment 是 Kubernetes API 物件,可讓您執行多個 Pod 副本,並將這些副本分散到叢集中的節點。

本頁適用於管理 GKE 應用程式資源調度的 operator 和開發人員,說明如何透過水平自動調度 Pod 資源功能,動態調整效能並維持成本效益。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。 Google Cloud

事前準備

開始之前,請務必先完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。

適用於 HorizontalPodAutoscaler 物件的 API 版本

當您使用 Google Cloud 控制台時,系統會使用 autoscaling/v2 API 建立 HPA 物件。

當您使用 kubectl 建立或查看 HPA 物件相關資訊時,可以指定 autoscaling/v1 API 或 autoscaling/v2 API。

  • 預設使用 apiVersion: autoscaling/v1,可讓您僅依據 CPU 使用率進行自動調度資源。如要依據其他指標自動調度資源,建議您使用 apiVersion: autoscaling/v2建立 Deployment 範例中的範例使用的是 apiVersion: autoscaling/v1

  • 建議使用 apiVersion: autoscaling/v2 來建立新的 HPA 物件。這個 API 可讓您依據多項指標 (包括自訂或外部指標) 進行自動調度資源。本頁面中的其他範例都是使用 apiVersion: autoscaling/v2

如要檢查有支援哪些 API 版本,請使用 kubectl api-versions 指令。

您可以指定在查看使用 apiVersion: autoscaling/v2 的 HPA 詳細資料時要使用的 API。

建立 Deployment 範例

必須先建立 HPA 物件要監控的工作負載,才能建立該 HPA 物件。本頁面的範例會針對下列 nginx Deployment 套用不同的 HPA 設定。不同的範例會依據資源使用率自訂或外部指標,以及多項指標來顯示 HPA。

將以下內容儲存為名為 nginx.yaml 的檔案:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        resources:
          # You must specify requests for CPU to autoscale
          # based on CPU utilization
          requests:
            cpu: "250m"

此資訊清單指定了 CPU 要求數的值。如要依據資源的使用率百分比自動調度資源,您必須指定該資源的要求數。如果您沒有指定要求數,則系統僅會依據資源使用率的絕對值 (CPU 使用率的 milliCPU) 進行自動調度資源。

如要建立 Deployment,請套用 nginx.yaml 資訊清單:

kubectl apply -f nginx.yaml

Deployment 已將 spec.replicas 設為 3,表示會部署三個 Pod。 您可以使用 kubectl get deployment nginx 指令進行驗證。

本頁面的每個範例都會將不同的 HPA 物件套用到 nginx Deployment 範例。

依據資源使用率自動調度資源

這個範例所建立的 HPA 物件,用於 CPU 使用率超過 50% 時自動調度 nginx Deployment,並確保有最少 1 個至最多 10 個備用資源。

您可以使用 Google Cloud 控制台、kubectl apply 指令或僅適用平均 CPU 的 kubectl autoscale 指令,建立以 CPU 為目標的 HPA。

控制台

  1. 前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。

    前往「Workloads」(工作負載)

  2. 按一下 nginx Deployment 的名稱。

  3. 依序點選「動作」>「編輯自動調度資源」

  4. 在「水平自動調度 Pod 資源」部分下方,按一下「選取並設定」

  5. 指定下列值:

    • 副本數量下限:1
    • 副本數量上限:10
    • 自動調度資源指標:CPU
    • 目標:50
    • 單位:CPU
  6. 按一下「提交」

kubectl apply

請將以下 YAML 資訊清單內容儲存為 nginx-hpa.yaml 檔案:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  # Set the minimum and maximum number of replicas the Deployment can scale to.
  minReplicas: 1
  maxReplicas: 10
  # The target average CPU utilization percentage across all Pods.
  targetCPUUtilizationPercentage: 50

如果您建立資訊清單來配合自己專案中的特定詳細資料,請確保水平 Pod 自動調度器欄位不含機密資料。

如要建立 HPA,請使用下列指令套用資訊清單:

kubectl apply -f nginx-hpa.yaml

kubectl autoscale

如要建立僅以平均 CPU 使用率為目標的 HPA 物件,您可以使用 kubectl autoscale 指令:

kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10

如要取得叢集中的 HPA 清單,請使用下列指令:

kubectl get hpa

輸出結果會與下列內容相似:

NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   0%/50%    1         10        3          61s

如要取得 HPA 的詳細資料,您可以使用 Google Cloud 控制台或 kubectl 指令。

控制台

  1. 前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。

    前往「Workloads」(工作負載)

  2. 按一下 nginx Deployment 的名稱。

  3. 按一下「Scaling」(縮放) 分頁標籤。

kubectl get

如要取得 HPA 的詳細資料,您可以使用 kubectl get hpa 搭配 -o yaml 旗標。status 欄位中包含目前備用資源數和所有最新的自動調度資源事件等相關資訊。

kubectl get hpa nginx -o yaml

輸出結果會與下列內容相似:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  annotations:
    autoscaling.alpha.kubernetes.io/conditions: '[{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ScaleDownStabilized","message":"recent
      recommendations were higher than current one, applying the highest recent recommendation"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ValidMetricFound","message":"the
      HPA was able to successfully calculate a replica count from cpu resource utilization
      (percentage of request)"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"DesiredWithinRange","message":"the
      desired count is within the acceptable range"}]'
    autoscaling.alpha.kubernetes.io/current-metrics: '[{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":0,"currentAverageValue":"0"}}]'
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"autoscaling/v1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"maxReplicas":10,"minReplicas":1,"scaleTargetRef":{"apiVersion":"apps/v1","kind":"Deployment","name":"nginx"},"targetCPUUtilizationPercentage":50}}
  creationTimestamp: "2019-10-30T19:42:43Z"
  name: nginx
  namespace: default
  resourceVersion: "220050"
  selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginx
  uid: 70d1067d-fb4d-11e9-8b2a-42010a8e013f
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  targetCPUUtilizationPercentage: 50
status:
  currentCPUUtilizationPercentage: 0
  currentReplicas: 3
  desiredReplicas: 3

如果您建立資訊清單來配合自己專案中的特定詳細資料,請確保水平 Pod 自動調度器欄位不含機密資料。

請先刪除此 HPA,再按照本頁中的其他範例操作:

kubectl delete hpa nginx

刪除 HPA 物件時,Deployment 的備用資源數會保持不變。Deployment 不會自動還原到套用 HPA 之前的狀態。

您可以進一步瞭解刪除 HPA 的相關資訊。

根據負載平衡器流量自動調度資源

GKE 的流量自動調度資源功能會整合負載平衡器的流量使用率信號,自動調度 Pod 的資源。

使用流量做為自動調度資源信號可能很有幫助,因為這是負載的領先指標,可補足 CPU 和記憶體指標的不足。內建的 GKE 整合功能可確保設定程序簡單明瞭,並讓自動調度機制迅速因應流量尖峰,滿足需求。

流量型自動調度功能是由閘道控制器及其全域流量管理功能啟用。詳情請參閱「根據流量自動調度資源」。

根據負載平衡器流量自動調度資源的功能,僅適用於 Gateway 工作負載

需求條件

以流量為準的自動調度資源功能須符合下列條件:

  • 適用於 GKE 1.31 以上版本。
  • 專案中已啟用 Gateway API。
  • 支援透過 Gateway API 部署的負載平衡器,以及 gke-l7-global-external-managedgke-l7-regional-external-managedgke-l7-rilbgke-l7-gxlb GatewayClass 傳輸的流量。

限制

以流量為準的自動調度資源功能有以下限制:

  • 多叢集 GatewayClass 不支援這些值 (gke-l7-global-external-managed-mcgke-l7-regional-external-managed-mcgke-l7-rilb-mcgke-l7-gxlb-mc)。
  • 不支援使用 LoadBalancer 類型服務的流量。
  • 參與流量自動調度功能的元件之間,必須有明確且獨立的關係。一個 HPA 物件必須專用於調整單一 Service 公開的單一 Deployment (或任何可調整規模的資源)。
  • 使用 maxRatePerEndpoint 欄位設定服務容量後,請等待足夠時間 (通常為一分鐘,但大型叢集可能需要最多 15 分鐘),讓負載平衡器更新這項變更,再使用以流量為準的指標設定 HPA。這種做法可確保服務不會暫時發生叢集嘗試根據負載平衡器發出的指標自動調度資源的情況,因為負載平衡器仍在設定中。
  • 如果多個負載平衡器 (例如 Ingress 和 Gateway,或兩個 Gateway) 為某項服務提供服務,且該服務使用以流量為準的自動調度功能,則 HPA 可能會根據個別負載平衡器的最高流量值做出調度決策,而不是所有負載平衡器的流量值總和。

部署以流量為準的自動調度資源功能

在下列練習中,您會使用 HPA,根據 store-autoscale Deployment 收到的流量自動調度資源。閘道會接受來自網際網路的 Pod 傳入流量。自動調度器會比較來自 Gateway 的流量信號,以及在 store-autoscale 服務資源上設定的每個 Pod 的流量容量。產生 Gateway 的流量,即可影響部署的 Pod 數量。

下圖說明以流量為準的自動調度機制運作方式:

HorizontalPodAutoscaler 會根據流量調整部署的資源配置。

如要部署以流量為準的自動調度資源功能,請執行下列步驟:

  1. 如果是標準叢集,請確認叢集已安裝 GatewayClasses。如為 Autopilot 叢集,系統預設會安裝 GatewayClass。

    kubectl get gatewayclass
    

    輸出內容會確認 GKE GatewayClass 資源已可在叢集中使用:

    NAME                               CONTROLLER                  ACCEPTED   AGE
    gke-l7-global-external-managed     networking.gke.io/gateway   True       16h
    gke-l7-regional-external-managed   networking.gke.io/gateway   True       16h
    gke-l7-gxlb                        networking.gke.io/gateway   True       16h
    gke-l7-rilb                        networking.gke.io/gateway   True       16h
    

    如果沒有看到這項輸出內容,請在 GKE 叢集中啟用 Gateway API

  2. 將範例應用程式和 Gateway 負載平衡器部署至叢集:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/master/gateway/docs/store-autoscale.yaml
    

    範例應用程式會建立:

    • 含有 2 個副本的 Deployment。
    • 服務的相關 GCPBackendPolicy 設定 maxRatePerEndpoint 已設為 10。如要進一步瞭解 Gateway 功能,請參閱「GatewayClass 功能」。
    • 外部閘道,用於透過網際網路存取應用程式。 如要進一步瞭解如何使用閘道負載平衡器,請參閱「部署閘道」。
    • HTTPRoute 會比對所有流量,並將流量傳送至 store-autoscale 服務。

    使用以流量為準的自動調度資源功能時,「服務容量」是重要元素,因為這項設定會決定觸發自動調度資源事件的每個 Pod 流量。這項設定是透過與 Service 相關聯的 GCPBackendPolicy 上的 maxRatePerEndpoint 欄位進行設定,可定義每個 Pod 的每秒要求數上限,也就是 Service 應接收的流量上限。服務容量是應用程式專屬的。

    詳情請參閱「判斷服務容量」。

  3. 將下列資訊清單儲存為 hpa.yaml

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: store-autoscale
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: store-autoscale
      # Set the minimum and maximum number of replicas the Deployment can scale to.
      minReplicas: 1
      maxReplicas: 10
      # This section defines that scaling should be based on the fullness of load balancer
      # capacity, using the following configuration.
      metrics:
      - type: Object
        object:
          describedObject:
            kind: Service
            name: store-autoscale
          metric:
            # The name of the custom metric which measures how "full" a backend is
            # relative to its configured capacity.
            name: "autoscaling.googleapis.com|gclb-capacity-fullness"
          target:
            # The target average value for the metric. The autoscaler adjusts the number
            # of replicas to maintain an average capacity fullness of 70% across all Pods.
            averageValue: 70
            type: AverageValue
    

    這份資訊清單說明具有下列屬性的 HPA 物件:

    • minReplicasmaxReplicas:設定這個部署作業的副本數量下限和上限。在這個設定中,Pod 數量可從 1 個擴充至 10 個副本。
    • describedObject.name: store-autoscale:定義流量容量的 store-autoscale 服務參考資料。
    • scaleTargetRef.name: store-autoscale:參照 store-autoscale Deployment,定義 HPA 擴縮的資源。
    • averageValue: 70:目標平均值為 70% 的容量使用率。這可為 HPA 提供成長空間,讓執行中的 Pod 處理多餘流量,同時建立新的 Pod。

    如果您建立資訊清單來配合自己專案中的特定詳細資料,請確保水平 Pod 自動調度器欄位不含機密資料。

水平 Pod 自動配置器會導致下列流量行為:

  • Pod 數量會調整為 1 到 10 個副本,以達到每個端點 70% 的最高速率。因此每個 Pod 的 RPS 為 7。maxRatePerEndpoint=10
  • 如果每個 Pod 的 RPS 超過 7,系統會擴大 Pod 規模,直到達到最多 10 個副本,或每個 Pod 的平均流量為 7 RPS 為止。
  • 如果流量減少,Pod 會使用 HPA 演算法,將規模縮減至合理比率。

您也可以部署流量產生器,驗證以流量為準的自動調度資源行為。

在 30 RPS 時,部署作業會擴充至 5 個副本,因此每個副本理想上會收到 6 RPS 的流量,也就是每個 Pod 的使用率為 60%。這低於 70% 的目標使用率,因此 Pod 會適當調整大小。視流量波動情況而定,自動調整資源配置的副本數量也可能會波動。如要進一步瞭解副本數的計算方式,請參閱「自動調度資源行為」。

依據自訂或或外部指標自動調度資源

如要根據自訂指標調度資源,您可以公開自訂指標 (搶先版),並直接從 Pod 或工作負載將指標傳送至自動調度器。

如需外部指標 (例如 Pub/Sub),請參閱 Pub/Sub HPA 範例

依據多個指標自動調度資源

這個範例所建立的 HPA 物件,是依據 CPU 使用率和名為 packets_per_second 的自訂指標自動調度資源。

如果您已按照上述範例指示操作,但 HPA 物件 nginx 仍存在,請先刪除該物件,再按照這個範例操作。

這個範例需要執行 apiVersion: autoscaling/v2。如要進一步瞭解可用的 API,請參閱適用於 HPA 物件的 API 版本

將此 YAML 資訊清單儲存為名為 nginx-multiple.yaml 的檔案:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  metrics: # The metrics to base the autoscaling on.
  - type: Resource
    resource:
      name: cpu # Scale based on CPU utilization.
      target:
        type: Utilization
        averageUtilization: 50
        # The HPA will scale the replicas to try and maintain an average
        # CPU utilization of 50% across all Pods.
  - type: Resource
    resource:
      name: memory # Scale based on memory usage.
      target:
        type: AverageValue
        averageValue: 100Mi
        # The HPA will scale the replicas to try and maintain an average
        # memory usage of 100 Mebibytes (MiB) across all Pods.
  # Uncomment these lines if you create the custom packets_per_second metric and
  # configure your app to export the metric.
  # - type: Pods
  #   pods:
  #     metric:
  #       name: packets_per_second
  #     target:
  #       type: AverageValue
  #       averageValue: 100

如果您建立資訊清單來配合自己專案中的特定詳細資料,請確保水平 Pod 自動調度器欄位不含機密資料。

套用此 YAML 資訊清單:

kubectl apply -f nginx-multiple.yaml

HPA 在建立之後會監視 nginx Deployment 的平均 CPU 使用率、平均記憶體使用率以及自訂 packets_per_second 指標 (取消註解的情況下)。對於會建立較大自動調度資源事件的指標值,此 HPA 會依據該指標來自動調度 Deployment。

設定效能 HPA 設定檔

效能 HPA 設定檔可縮短水平自動調度 Pod 資源的反應時間,有助於提升 HPA 處理大量物件的能力 (在 1.31 至 1.32 次要版本中最多可處理 1,000 個物件,在 1.33 以上版本中最多可處理 5,000 個物件)。

如果 Autopilot 叢集的控制層執行 GKE 1.32 以上版本,系統會自動啟用這個設定檔。如果是標準叢集,只要控制層執行 GKE 1.33 以上版本,符合資格的叢集就會自動啟用設定檔。

如果符合下列所有條件,標準叢集可免於自動啟用 Performance HPA 設定檔:

  • 叢集正在從舊版升級至 1.33 以上版本。
  • 叢集至少有一個節點集區,且使用下列任一機器類型:e2-microe2-custom-microg1-smallf1-micro
  • 未啟用節點自動佈建功能。

如果現有叢集符合需求,您也可以啟用 Performance HPA 設定檔。

需求條件

如要啟用 Performance HPA 設定檔,請確認 Autopilot 和 Standard 叢集符合下列需求:

啟用效能 HPA 設定檔

如要在叢集中啟用 Performance HPA 設定檔,請使用下列指令:

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --hpa-profile=performance

更改項目:

  • CLUSTER_NAME:叢集名稱。
  • LOCATION:叢集的運算可用區或區域 (例如 us-central1-a 或 us-central1)。
  • PROJECT_ID: Google Cloud 專案 ID。

停用效能 HPA 設定檔

如要在叢集中停用 Performance HPA 設定檔,請使用下列指令:

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --hpa-profile=none

更改項目:

  • CLUSTER_NAME:叢集名稱。
  • LOCATION:叢集的運算可用區或區域 (例如 us-central1-a 或 us-central1)。
  • PROJECT_ID: Google Cloud 專案 ID。

查看 HorizontalPodAutoscaler 的詳細資料

如要查看 HPA 的設定和統計資料,請使用下列指令:

kubectl describe hpa HPA_NAME

HPA_NAME 替換為 HPA 物件的名稱。

如果 HPA 使用的是 apiVersion: autoscaling/v2 且是依據多個指標,則 kubectl describe hpa 指令只會顯示 CPU 指標。如要查看所有指標,請改用下列指令:

kubectl describe hpa.v2.autoscaling HPA_NAME

HPA_NAME 替換為 HPA 物件的名稱。

每個 HPA 物件的目前狀態顯示在 Conditions 欄位中,而自動調度資源事件則顯示在 Events 欄位中。

輸出結果會與下列內容相似:

Name:                                                  nginx
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           kubectl.kubernetes.io/last-applied-configuration:
                                                         {"apiVersion":"autoscaling/v2","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"s...
CreationTimestamp:                                     Tue, 05 May 2020 20:07:11 +0000
Reference:                                             Deployment/nginx
Metrics:                                               ( current / target )
  resource memory on pods:                             2220032 / 100Mi
  resource cpu on pods  (as a percentage of request):  0% (0) / 50%
Min replicas:                                          1
Max replicas:                                          10
Deployment pods:                                       1 current / 1 desired
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    recommended size matches current size
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from memory resource
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:                                                <none>

刪除 HorizontalPodAutoscaler

您可以使用 Google Cloud 控制台或 kubectl delete 指令刪除 HPA 物件。

控制台

如要刪除 nginx HPA 物件:

  1. 前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。

    前往「Workloads」(工作負載)

  2. 按一下 nginx Deployment 的名稱。

  3. 依序點選 「動作」>「自動調度資源」

  4. 點選「刪除」。

kubectl delete

如要刪除 nginx HPA 物件,請使用下列指令:

kubectl delete hpa nginx

刪除 HPA 物件後,Deployment (或其他 Deployment 物件) 會維持現有規模,不會還原為 Deployment 原始資訊清單中的備用資源數。如要手動將 Deployment 調整回三個 Pod,則可以使用 kubectl scale 指令:

kubectl scale deployment nginx --replicas=3

正在清除所用資源

  1. 若尚未刪除 HPA 物件,請進行刪除:

    kubectl delete hpa nginx
    
  2. 刪除 nginx Deployment:

    kubectl delete deployment nginx
    
  3. 也可以選擇刪除叢集

疑難排解

如需疑難排解建議,請參閱「排解水平自動調度 Pod 資源問題」。

後續步驟