為 GKE 服務設定以使用率為準的負載平衡

本頁面說明如何為 GKE Service 設定依使用率調整的負載平衡。本頁面適用於基礎架構和應用程式團隊,以及負責設定及管理 GKE 服務流量分配的 GKE 管理員。

您可以根據 GKE Pod 的即時資源用量,智慧地分配流量,藉此使用以用量為準的負載平衡器,盡可能提升應用程式效能和可用性。

閱讀本頁內容前,請務必先熟悉 GKE 服務的用量型負載平衡,以及用量型負載平衡的運作方式。

定價

以使用率為準的負載平衡是 GKE Gateway 的功能, 不需額外付費即可使用。 仍須支付 Cloud Load Balancing 和 GKE 費用。

配額

以用量為準的負載平衡機制不會導入任何新配額,但仍適用 Cloud Load Balancing 和其他相依服務的所有配額。

事前準備

開始之前,請確認您已執行下列工作:

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

GKE Gateway 控制器需求

如要為 GKE 服務啟用以使用率為準的負載平衡功能,必須符合下列條件:

  • Google Cloud CLI 516.0.0 以上版本。
  • 搶鮮版管道的 GKE 1.33.1-gke.1918000 以上版本。
  • 叢集必須啟用 Gateway API。
  • 叢集必須啟用效能 HPA 設定檔。
  • 必須在 Google Cloud 專案中啟用 Autoscaling API。
  • 節點服務帳戶必須能夠寫入 Autoscaling API。

GKE 服務的用量負載平衡支援下列項目:

  • 單一和多叢集 GKE 服務,可做為 Google Cloud代管負載平衡器的後端。
  • 所有 GKE 版本 (Standard、Autopilot 和 Enterprise)。
  • 所有 Google Cloud 應用程式負載平衡器,傳統版應用程式負載平衡器除外。

限制

GKE 服務的用量負載平衡功能有下列限制。

  • 支援的資源使用率指標如下:
  • 不支援直通式或 Proxy 網路負載平衡器。
  • 僅支援 Gateway API,不支援 Service 和 Ingress API。
  • 如果流量波動劇烈,以使用率為準的負載平衡功能就無法正常運作。當 Pod 達到使用率上限時,流量重新平衡最多需要 30 秒。使用率信號預期會隨著連入流量增加而上升,但這項延遲表示以使用率為準的負載平衡需要時間調整。為達到最佳效能,依使用率平衡負載的做法最適合流量平穩、可預測的環境。
  • 設定變更 (例如修改或移除 GCPBackendPolicy 中的 dryRun 欄位) 後,系統最多可能需要 30 秒才會更新並調整流量分配。這是已知的全系統行為。因此,這項功能最適合流量模式相對穩定的應用程式,且可容忍這類更新延遲。

根據預設,系統會為 GKE 服務停用以用量為準的負載平衡。您必須明確啟用這項功能。如未設定使用率上限門檻,系統預設每個端點的使用率為 80%。

設定以使用率為準的負載平衡時,目標是盡量提高流量分配效率,讓後端 Pod 能有效管理工作負載,進而提升應用程式效能和資源使用率。

啟用以使用率為基礎的負載平衡和效能 HPA 設定檔

設定以使用率為準的負載平衡前,請先確認 GKE 叢集支援必要功能。以使用率為準的負載平衡會使用 CPU 等自訂指標,做出更明智的轉送決策。這些決定取決於下列因素:

  • Gateway API,可透過 GCPBackendPolicy 啟用服務層級政策。
  • 效能 HPA 設定檔:使用 CPU 信號,讓工作負載更快速、更積極地擴充。

啟用 Gateway API 和效能 HPA 設定檔

Autopilot

Autopilot 叢集預設提供 Gateway API 和效能 HPA 設定檔。

標準

如要建立啟用 Gateway API 的新標準叢集,並使用 Performance HPA 設定檔,請執行下列指令:

gcloud container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --cluster-version=CLUSTER_VERSION \
    --gateway-api=standard \
    --hpa-profile=performance \
    --release-channel=rapid

更改下列內容:

  • CLUSTER_NAME,並將其替換為新叢集的名稱。
  • LOCATION,並將其替換為叢集的 Compute Engine 區域或可用區。
  • PROJECT_ID 為您的專案 ID。
  • CLUSTER_VERSION:GKE 版本,必須是 1.33.1-gke.1918000 以上版本。

如要在現有的 GKE Standard 叢集中啟用效能 HPA 設定檔和 Gateway API,請使用下列指令:

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID \
    --gateway-api=standard \
    --hpa-profile=performance \
    --release-channel=rapid

更改下列內容:

如要進一步瞭解 Performance HPA 設定檔,請參閱「設定 Performance HPA 設定檔」。

設定依使用率平衡負載

叢集準備就緒後,請定義政策,根據後端使用率決定流量的轉送方式。您必須透過 GCPBackendPolicy 使用 Kubernetes Gateway API 進行設定。

必要條件

使用 Gateway API 設定依使用率進行負載平衡之前,請確認 GKE 叢集符合下列需求:

  1. 部署應用程式:請務必使用 Deployment 資源部署 Kubernetes 應用程式。詳情請參閱「將應用程式部署至 GKE 叢集」。

    舉例來說,典型的部署資訊清單可能包含如下的資源區段:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store-v1
    spec:
      # ... other deployment configurations ...
      template:
        # ... other template configurations ...
        spec:
          containers:
            - name: your-container-name
              image: your-image
              ports:
                - containerPort: 8080
              resources:
                limits:
                  cpu: 100m
                  memory: 45Mi
                requests:
                  cpu: 100m
                  memory: 45Mi
    
  2. 使用 Service 公開應用程式:您必須使用 Kubernetes Service 公開應用程式。如要進一步瞭解 Service 的運作方式和設定方式,請參閱「瞭解 Kubernetes Service」。

  3. 使用以 Gateway API 為基礎的應用程式負載平衡器:使用透過 Gateway API 設定的 GKE 代管應用程式負載平衡器,公開 Service。詳情請參閱「部署閘道」。

建立 CPU 型負載平衡的 GCPBackendPolicy

這項設定可讓 GKE 根據每個後端 Pod 的即時 CPU 使用率,動態分配流量。

如要為 GKE 服務啟用以用量為準的負載平衡,請使用 Kubernetes Gateway API 的 GCPBackendPolicy 自訂資源。

GCPBackendPolicy 自訂資源可讓您以宣告方式,定義 Kubernetes 叢集內的負載平衡行為。指定 CPU 使用率指標後,您就能根據後端目前的資源用量,控管流量在後端之間的分配方式。這種做法有助於維持應用程式效能、防止個別 Pod 超載,並提升應用程式的可靠性和使用者體驗。

  1. 將下列範例資訊清單儲存為 my-backend-policy.yaml:

    kind: GCPBackendPolicy
    apiVersion: networking.gke.io/v1
    metadata:
      name: my-backend-policy
      namespace: team-awesome
    spec:
      targetRef:
        group: ""
        kind: Service
        name: super-service
      default:
        balancingMode: CUSTOM_METRICS
        customMetrics:
        - name: gke.cpu
          dryRun: false
    

    注意事項:

    • spec.targetRef.kind: Service:在同一叢集中,以標準 Kubernetes 服務為目標。
    • spec.targetRef.kind: ServiceImport:在多叢集設定中,指定另一個叢集的服務。如果是多叢集服務,group 欄位的值必須設為 net.gke.io。
    • balancingMode: CUSTOM_METRICS:啟用以自訂指標為準的負載平衡。
    • name: gke.cpu:指定 CPU 使用率做為流量分配的指標。

    如未指定 maxUtilizationPercent 欄位,預設使用率門檻為 80%。當後端的 CPU 使用率超過 80% 時,系統會重新平衡流量。

  2. 將範例資訊清單套用至叢集:

    kubectl apply -f my-backend-policy.yaml
    

根據即時 CPU 使用率分配流量,即可自動最佳化效能。這項動作有助於避免個別 Pod 負載過重。

dryRun和balancingMode的重要注意事項

使用自訂指標設定 GCPBackendPolicy 時,請考量 customMetrics 定義中 balancingMode 與 dryRun 欄位之間的互動。這項互動會決定負載平衡器如何使用自訂指標。如要進一步瞭解自訂指標和相關限制 (包括與平衡模式相關的限制),請參閱「Cloud Load Balancing 自訂指標」。

  • balancingMode: CUSTOM_METRICS

    • 如要根據自訂指標分配流量,customMetrics 清單中至少須有一個自訂指標的 dryRun 設為 false。 這項設定會指示負載平衡器主動使用該指標,做出重新平衡決策。
    • 您可以將其他自訂指標與 dryRun: true 以及非模擬測試指標一併納入。這樣一來,您就能測試或監控 GPU 使用率等新指標,不會影響流量,同時透過 CPU 使用率等其他指標 (搭配 dryRun: false) 控制負載平衡。
    • 如果 balancingMode 為 CUSTOM_METRICS,且所有自訂指標的 dryRun 都設為 true,系統會傳回錯誤。例如:gceSync: generic::invalid_argument: Update: Invalid value for field 'resource.backends[0]': '...'. CUSTOM_METRICS BalancingMode requires at least one non-dry-run custom metric.負載平衡器需要有效的指標才能做出決策。
  • balancingMode 為 RATE 或其他非自訂指標模式

    • 如果負載平衡是根據自訂指標以外的條件 (例如每秒要求數) 進行,您可以為所有自訂指標設定 dryRun: true。RATE這樣一來,您就能監控自訂指標,而不會影響主要平衡機制。這項功能很實用,可讓您先測試新的自訂指標,再將 balancingMode 切換為 CUSTOM_METRICS。
  • 監控自訂指標

    • 設定 GCPBackendPolicy 並開始將流量傳送至應用程式後,Metrics Explorer 需要一段時間才會顯示自訂指標,例如 gke.cpu。
    • 如要在 Metrics Explorer 中顯示及啟用自訂指標,後端必須有實際流量流經政策監控的後端。如果沒有流量,指標可能只會顯示在 Metrics Explorer 的「Inactive Resources」(閒置資源) 下。

設定自訂 CPU 使用率門檻

根據預設,GKE 會將流量從 CPU 使用率超過 80% 的後端移開。不過,某些工作負載可能在需要重新分配流量前,容許較高或較低的 CPU 使用率。您可以使用 GCPBackendPolicy 資源中的 maxUtilizationPercent 欄位自訂這個門檻。

  1. 如要設定 GKE 服務,允許後端在觸發重新平衡前使用高達 70% 的 CPU,請將下列範例資訊清單儲存為 my-backend-policy.yaml:

    kind: GCPBackendPolicy
    apiVersion: networking.gke.io/v1
    metadata:
      name: my-backend-policy
      namespace: team-awesome
    spec:
      targetRef:
        group: ""
        kind: Service
        name: super-service
      default:
        balancingMode: CUSTOM_METRICS
        customMetrics:
        - name: gke.cpu
          maxUtilizationPercent: 70
    

    注意事項:

    • maxUtilizationPercent 欄位接受的值介於 0 到 100 之間。值為 100 表示後端可使用完整 CPU 容量,然後再重新平衡流量。
    • 對於需要提早卸載的延遲時間敏感型工作負載,請使用較低的門檻。
    • 如果工作負載的設計是接近滿載運作,請使用較高的門檻。
    • 如果是多叢集服務,spec.targetRef.kind 必須為 ServiceImport,且 group 欄位的值必須設為 net.gke.io。
  2. 將範例資訊清單套用至叢集:

    kubectl apply -f my-backend-policy.yaml
    

啟用自訂 CPU 使用率門檻後,您就能根據後端的 CPU 使用率控管流量分配。

(選用) 啟用模擬測試模式

模擬測試模式會監控 Pod 資源使用率,不會變更流量分配。啟用試營運模式後,指標會匯出至 Cloud Monitoring,但 Cloud Load Balancing 會忽略這些指標,並使用預設的負載平衡行為。

  1. 如要為 GKE 服務啟用模擬測試模式,請將下列範例資訊清單儲存為 my-backend-policy.yaml:

    kind: GCPBackendPolicy
    apiVersion: networking.gke.io/v1
    metadata:
      name: my-backend-policy
    spec:
      targetRef:
        group: ""
        kind: Service
        name: store-v1
      default:
        balancingMode: RATE
        maxRatePerEndpoint: 10
        customMetrics:
        - name: gke.cpu
          dryRun: true
    
  2. 將範例資訊清單套用至叢集:

    kubectl apply -f my-backend-policy.yaml
    

啟用模擬測試模式後,系統會執行下列操作:

  • Cloud Load Balancing 會忽略 CPU 使用率指標,改用預設的負載平衡行為。

  • 指標會繼續匯出至 network.googleapis.com/loadbalancer/backend/lb_custom_metric 下的 Cloud Monitoring。

檢查指標後,請從 GCPBackendPolicy 中移除 dryRun 欄位,然後重新套用設定。如果停用模擬測試後發生問題,請在政策中加回 dryRun: true,重新啟用模擬測試。

驗證政策

如要確認 GCPBackendPolicy 已套用至 GKE 服務,並確認 GKE 控制器可辨識該政策,請執行下列指令:

kubectl describe gcpbackendpolicy POLICY_NAME -n NAMESPACE

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

Name:         <your policy name>
Namespace:    <your namespace>
Labels:       <none>
Annotations:  <none>
API Version:  networking.gke.io/v1
Kind:         GCPBackendPolicy
Metadata:
  Creation Timestamp:  ...
  Generation:          1
  Resource Version:    …
  UID:                 …
Spec:
  Default:
    Balancing Mode:  CUSTOM_METRICS
    Custom Metrics:
      Dry Run:  false
      Name:     gke.cpu
  Target Ref:
    Group:
    Kind:   Service
    Name:   super-service
Status:
  Conditions:
    Last Transition Time:  …
    Message:
    Reason:                Attached
    Status:                True
    Type:                  Attached
Events:
…

使用 Compute Engine API 設定以使用率為準的負載平衡

建議您使用 Kubernetes Gateway API,為 GKE 服務設定以用量為準的負載平衡。

不過,您可能偏好使用 Compute Engine API 或 Terraform 直接管理負載平衡器。如果選擇這個方法,您必須在 BackendService 層級啟用以用量為準的負載平衡。

  1. 如為現有的 BackendService,請執行下列指令,啟用依使用率進行負載平衡的功能,並附加網路端點群組 (NEG) my-lb-neg:

    gcloud compute backend-services add-backend MY_BACKEND_SERVICE \
      --network-endpoint-group my-lb-neg \
      --network-endpoint-group-zone=asia-southeast1-a \
      --global \
      --balancing-mode=CUSTOM_METRICS \
      --custom-metrics 'name="gke.cpu",maxUtilization=0.8'
    

    請替換下列內容:

    • 將 MY_BACKEND_SERVICE 替換成 BackendService 的名稱。
    • 使用「CUSTOM_METRICS」CUSTOM_METRICS。
  2. 如要更新 BackendService 中現有後端項目的使用率負載平衡設定 (已附加 NEG),請執行下列指令:

    gcloud compute backend-services update-backend MY_BACKEND_SERVICE \
      --network-endpoint-group my-lb-neg \
      --network-endpoint-group-zone=asia-southeast1-a \
      --global \
      --balancing-mode=CUSTOM_METRICS \
      --custom-metrics 'name="gke.cpu",maxUtilization=0.8'
    

    請替換下列內容:

    • 將 MY_BACKEND_SERVICE 替換成 BackendService 的名稱。
    • 使用「CUSTOM_METRICS」CUSTOM_METRICS。

為 GKE 服務停用以使用率為準的負載平衡功能

如要停用 GKE 服務的用量型負載平衡功能,請按照下列步驟操作:

  1. 如要保留其他設定的政策,請從 GCPBackendPolicy 中移除 balancingMode 和 customMetrics 欄位。
  2. 如果不再需要 GCPBackendPolicy,可以將其刪除。
  3. 如果您使用 Compute Engine API,請從後端服務變更回 --balancing-mode 和 --custom-metrics 旗標。

後續步驟