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


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

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

閱讀本頁面之前,請先熟悉 GKE 服務的以用量為準的負載平衡,以及以用量為準的負載平衡運作方式

定價

以使用率為基礎的負載平衡是 GKE Gateway 的功能,可免費使用。您仍須支付 Cloud Load BalancingGKE 的費用。

配額

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

事前準備

開始之前,請確認您已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。

GKE Gateway 控制器需求

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

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

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

限制

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

  • 目前只支援 CPU 資源使用率指標。
  • 系統不支援直通式或 Proxy 網路負載平衡器。
  • 僅支援 Gateway API,不支援 Service 和 Ingress API。
  • 如果流量波動劇烈,以使用率為基礎的負載平衡效果不佳。當 Pod 達到使用率上限時,流量重新平衡最多需要 30 秒。使用率訊號預期會隨著連入流量增加而上升,但這項延遲表示以使用率為準的負載平衡需要時間調整。為獲得最佳效能,以用量為準的負載平衡最適合流量平穩且可預測的環境。
  • 系統不支援雙重堆疊叢集 (具有一個 IPv4 位址和一個 IPv6 位址的叢集)。
  • 設定變更 (例如修改或移除 GCPBackendPolicy 中的 dryRun 欄位) 後,系統最多可能需要 30 秒,才會更新並調整流量分配。這是已知的全系統行為。因此,這項功能最適合流量模式相對穩定的應用程式,且可容許這類更新延遲。

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

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

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

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

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

啟用 Gateway API 和 Performance HPA 設定檔

Autopilot

Autopilot 叢集預設會提供 Gateway API 和 Performance HPA 設定檔。

標準

如要建立啟用 Gateway API 的新 Standard 叢集,並使用 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 叢集中啟用 Performance 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:在多叢集設定中,指定另一個叢集的服務。
    • balancingMode: CUSTOM_METRICS:啟用以自訂指標為基礎的負載平衡。
    • name: gke.cpu:指定 CPU 使用率做為流量分配的指標。

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

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

    kubectl apply -f my-backend-policy.yaml
    

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

dryRunbalancingMode 的重要注意事項

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

  • balancingMode: CUSTOM_METRICS

    • 如要根據自訂指標分配流量,customMetrics 清單中至少要有一個自訂指標的 dryRun 設為 false。 這項設定會指示負載平衡器主動使用該指標,做出重新平衡的決策。
    • 您可以將其他自訂指標與非模擬測試指標一併納入 dryRun: true。這樣一來,您就能測試或監控 GPU 使用率等新指標,而不影響流量,同時讓 CPU 使用率等其他指標dryRun: false控制負載平衡。
    • 如果 balancingModeCUSTOM_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.負載平衡器需要有效的指標才能做出決策。
  • balancingModeRATE 或其他非自訂指標模式

    • 如果負載平衡是根據自訂指標以外的條件 (例如每秒要求數) 進行,您可以為所有自訂指標設定 dryRun: trueRATE這樣您就能監控自訂指標,而不影響主要平衡機制。這項功能有助於在將 balancingMode 切換為 CUSTOM_METRICS 前,測試新的自訂指標。
  • 監控自訂指標

    • 設定 GCPBackendPolicy 並開始將流量傳送至應用程式後,Metrics Explorer 需要一段時間才會顯示自訂指標,例如 gke.cpu
    • 如要讓自訂指標在指標探索工具中顯示並啟用,後端必須有實際流量流經政策監控的後端。如果沒有流量,指標可能只會顯示在 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 使用率指標,改用預設的負載平衡行為。

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

查看指標後,請從 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 中移除 balancingModecustomMetrics 欄位。
  2. 如果不再需要 GCPBackendPolicy,可以刪除。
  3. 如果您使用 Compute Engine API,請從後端服務改回 --balancing-mode--custom-metrics 旗標。

後續步驟