啟用多叢集閘道


本頁說明如何啟用多叢集 GKE Gateway 控制器,這個 Google 代管的控制器會為 GKE 叢集佈建外部和內部負載平衡器。如要瞭解如何使用閘道資源進行容器負載平衡,請參閱「部署閘道」或「部署多叢集閘道」。

多叢集 GKE 閘道控制器會在叢集中安裝下列多叢集 GatewayClass:

  • gke-l7-global-external-managed-mc,適用於全球外部多叢集閘道
  • gke-l7-regional-external-managed-mc,適用於區域外部多叢集閘道
  • gke-l7-rilb-mc,適用於地區內部多叢集閘道
  • gke-l7-gxlb-mc,適用於全域外部傳統多叢集閘道

進一步瞭解 GKE 中各種 GatewayClass 的功能

定價

透過 Gateway 控制器部署的所有 Compute Engine 資源,都會向 GKE 叢集所在的專案收費。單一叢集 Gateway 控制器是 GKE Standard 和 Autopilot 定價的一部分,無須額外付費。如要瞭解多叢集閘道的定價,請參閱多叢集 Ingress 和閘道定價頁面

事前準備

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

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

GKE Gateway 控制器需求

  • 如果是標準叢集,則須使用 GKE 1.24 以上版本。
  • 如果是 Autopilot,則須為 GKE 1.26 以上版本。
  • Google Cloud CLI 407.0.0 以上版本。
  • 閘道 API 僅支援虛擬私有雲原生叢集。
  • 如果您使用內部 GatewayClass,則必須啟用僅限 Proxy 的子網路
  • 叢集必須啟用 HttpLoadBalancing 外掛程式。
  • 如果您使用 Istio,請務必將 Istio 升級至下列其中一個版本:
    • 1.15.2 以上版本
    • 1.14.5 以上版本
    • 1.13.9 以上版本。
  • 如果您使用共用虛擬私有雲,則需要在主機專案中,將 Compute Network User 角色指派給服務專案的 GKE 服務帳戶。

多叢集閘道需求

除了 GKE Gateway 控制器需求外,如要部署多叢集 Gateway,請務必完成下列工作:

  • 在設定叢集上啟用 Gateway API
  • 在叢集上啟用 Workload Identity Federation for GKE
  • 完成機群一般必要條件,註冊叢集。
  • 在專案中啟用下列多叢集閘道所需的 API:

    • Cloud Service Mesh API
    • Multi-cluster Services API
    • 多叢集 Ingress API

    如果尚未啟用必要的 API,請執行下列指令:

    gcloud services enable \
      trafficdirector.googleapis.com \
      multiclusterservicediscovery.googleapis.com \
      multiclusteringress.googleapis.com \
      --project=PROJECT_ID
    

    PROJECT_ID 替換為執行 GKE 叢集的專案 ID。

規定與限制

單一叢集 Gateway 的限制與已知問題也適用於多叢集 Gateway。

除了單一叢集閘道的限制外,多叢集閘道也適用下列限制:

  • 區域內部 GatewayClass gke-l7-rilb-mc 不支援將負載平衡至不同區域的後端。如要進一步瞭解各 GatewayClass 支援的不同功能,請參閱「GatewayClass 功能」。

  • 多叢集 Gateway 不支援將 Service 做為 backendRefs。 多叢集閘道僅支援 ServiceImport 做為有效 backendRefs

  • 機群中的所有叢集都必須位於機群主機專案中。

  • 系統不支援跨專案負載平衡。附加至相同多叢集閘道的所有叢集 (設定叢集和目標叢集),都必須部署在相同的共用虛擬私有雲主專案或服務專案中。如要進一步瞭解多叢集閘道支援的共用虛擬私有雲拓撲,請參閱「使用多叢集閘道和共用虛擬私有雲」。

  • 系統不支援跨虛擬私有雲負載平衡。附加至相同多叢集閘道的所有叢集 (設定叢集和目標叢集) 都必須部署在同一個 VPC 中。

  • 多叢集閘道依賴 MCS 處理跨叢集服務探索。因此,多叢集閘道公開的服務須符合多叢集服務的所有規定。

  • 在下列情況下,多叢集閘道可能會洩漏負載平衡器資源:

    • 機群 Ingress 功能已更新為新的設定叢集,但該叢集沒有目前設定叢集上的所有 Gateway 資源。
    • 如果設定叢集上存在參照多叢集 GatewayClassGateway 資源,系統會停用機群 Ingress 功能。
  • 多叢集閘道會以全域服務的形式執行。如果多叢集 Gateway 控制器遇到區域性 Fleet (Hub) 控制層故障,系統會靜態失敗並做出回應,且不會再進行負載平衡器變更,直到該區域恢復服務為止。

配額

GKE Gateway 會使用 Cloud Load Balancing 配額,限制 Gateway 控制器可建立的資源數量,藉此管理路由至 GKE 叢集的輸入流量。

設定多叢集閘道環境

您需要多個 GKE 叢集,才能完成「部署多叢集閘道」中的範例。所有叢集都註冊至同一個機群,因此多叢集閘道和服務可以在這些叢集中運作。

下列步驟會在專案中,於兩個不同區域部署三個 GKE 叢集:

  • us-west1-a/gke-west-1
  • us-west1-a/gke-west-2
  • us-east1-b/gke-east-1

這會建立下列叢集拓撲:

叢集拓撲,顯示區域、機群和專案之間的關係。

這些 GKE 叢集用於示範多區域負載平衡,以及使用外部和內部閘道的藍綠多叢集流量分割

部署叢集

在這些步驟中,您將在 us-east1us-west1 區域中部署三個 GKE 叢集。

叢集會註冊至專案的機群。 將 GKE 叢集歸入機群後,多叢集閘道就能以這些叢集為目標。

  1. us-west1 中建立名為 gke-west-1 的 GKE 叢集:

    gcloud container clusters create gke-west-1 \
        --gateway-api=standard \
        --location=us-west1-a \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --cluster-version=VERSION \
        --enable-fleet \
        --project=PROJECT_ID
    

    更改下列內容:

    • PROJECT_ID:執行 GKE 叢集的專案 ID。
    • VERSION:GKE 版本,1.24 以上。
  2. us-west1 中 (或與上一個叢集相同的區域) 建立另一個名為 gke-west-2 的 GKE 叢集:

    gcloud container clusters create gke-west-2 \
        --gateway-api=standard \
        --location=us-west1-a \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --cluster-version=VERSION \
        --enable-fleet \
        --project=PROJECT_ID
    
  3. us-east1 中建立名為 gke-east-1 的 GKE 叢集 (或與先前不同的區域)

    gcloud container clusters create gke-east-1 \
        --gateway-api=standard \
        --location=us-east1-b \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --cluster-version=VERSION \
        --enable-fleet \
        --project=PROJECT_ID
    
  4. 確認叢集已成功註冊至機群:

    gcloud container fleet memberships list --project=PROJECT_ID
    

    畫面中會顯示如下的輸出結果:

    NAME        EXTERNAL_ID                           LOCATION
    gke-east-1  45a80b37-4b00-49aa-a68b-b430fce1e3f0  us-east1
    gke-west-2  ac7087a5-f5ee-401e-b430-57f3af141239  us-west1
    gke-west-1  549efe3a-b18e-4eb9-8796-e50b7967cde2  us-west1
    

設定叢集憑證

這個步驟會設定叢集憑證,並使用容易記住的名稱。在多個叢集部署資源時,這樣做可讓您更輕鬆地切換叢集。

  1. 擷取叢集 gke-west-1gke-west-2gke-east-1 的憑證:

    gcloud container clusters get-credentials gke-west-1 --location=us-west1-a --project=PROJECT_ID
    gcloud container clusters get-credentials gke-west-2 --location=us-west1-a --project=PROJECT_ID
    gcloud container clusters get-credentials gke-east-1 --location=us-east1-b --project=PROJECT_ID
    

    這會在本地儲存憑證,方便您使用 kubectl 用戶端存取叢集 API 伺服器。系統預設會為憑證自動產生名稱。

  2. 重新命名叢集內容,方便日後參照:

    kubectl config rename-context gke_PROJECT_ID_us-west1-a_gke-west-1 gke-west-1
    kubectl config rename-context gke_PROJECT_ID_us-west1-a_gke-west-2 gke-west-2
    kubectl config rename-context gke_PROJECT_ID_us-east1-b_gke-east-1 gke-east-1
    

    PROJECT_ID 替換為叢集部署所在的專案 ID。

在機群中啟用多叢集服務

  1. 為已註冊的叢集啟用機群中的多叢集服務。這樣一來,註冊至機群的三個叢集就會啟用 MCS 控制器,開始監聽及匯出服務。

    gcloud container fleet multi-cluster-services enable \
        --project PROJECT_ID
    
  2. 授予 MCS 控制器所需的 Identity and Access Management (IAM) 權限:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-mcs/gke-mcs-importer]" \
        --role "roles/compute.networkViewer" \
        --project=PROJECT_ID
    

    PROJECT_ID 替換為叢集部署所在的專案 ID。

  3. 確認已為已註冊的叢集啟用 MCS。您會看到三個已註冊叢集的成員資格。所有叢集可能需要幾分鐘才會顯示。

    gcloud container fleet multi-cluster-services describe --project=PROJECT_ID
    

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

    createTime: '2023-10-12T06:14:33.466903587Z'
    membershipStates:
      projects/441323991697/locations/us-east1/memberships/gke-east-1:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2023-10-12T06:15:28.395318091Z'
      projects/441323991697/locations/us-west1/memberships/gke-west-1:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2023-10-12T06:15:30.534594027Z'
      projects/441323991697/locations/us-west1/memberships/gke-west-2:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2023-10-12T06:15:29.110582109Z'
    name: projects/pierre-louis-playground/locations/global/features/multiclusterservicediscovery
    resourceState:
      state: ACTIVE
    spec: {}
    updateTime: '2023-10-12T06:15:31.027276757Z'
    

在機群中啟用多叢集閘道

多叢集 GKE 閘道控制器會控管多叢集閘道的部署作業。

啟用多叢集閘道控制器時,您必須選取設定叢集。設定叢集是部署 Gateway 資源 (GatewayRoutesPolicies) 的 GKE 叢集。這是控制叢集間路由的中央位置。 請參閱設定叢集設計,協助您決定要選擇哪個叢集做為設定叢集。

  1. 啟用多叢集閘道,並在機群中指定設定叢集。請注意,您隨時可以更新設定叢集。 這個範例會將 gke-west-1 指定為設定叢集,用於代管多叢集閘道的資源。

    gcloud container fleet ingress enable \
        --config-membership=projects/PROJECT_ID/locations/us-west1/memberships/gke-west-1 \
        --project=PROJECT_ID
    
  2. 授予多叢集閘道控制器所需的 Identity and Access Management (IAM) 權限:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:service-PROJECT_NUMBER@gcp-sa-multiclusteringress.iam.gserviceaccount.com" \
        --role "roles/container.admin" \
        --project=PROJECT_ID
    

    PROJECT_IDPROJECT_NUMBER 替換為叢集部署所在的專案 ID 和專案編號。

  3. 確認機群已啟用 GKE Gateway 控制器:

    gcloud container fleet ingress describe --project=PROJECT_ID
    

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

    createTime: '2023-10-12T06:23:06.732858524Z'
    membershipStates:
      projects/441323991697/locations/us-east1/memberships/gke-east-1:
        state:
          code: OK
          updateTime: '2023-10-12T06:30:08.815839024Z'
      projects/441323991697/locations/us-west1/memberships/gke-west-1:
        state:
          code: OK
          updateTime: '2023-10-12T06:30:08.815837031Z'
      projects/441323991697/locations/us-west1/memberships/gke-west-2:
        state:
          code: OK
          updateTime: '2023-10-12T06:30:08.815840985Z'
    name: projects/pierre-louis-playground/locations/global/features/multiclusteringress
    resourceState:
      state: ACTIVE
    spec:
      multiclusteringress:
        configMembership: projects/pierre-louis-playground/locations/us-west1/memberships/gke-west-1
    state:
      state:
        code: OK
        description: Ready to use
        updateTime: '2023-10-12T06:23:51.317464415Z'
    updateTime: '2023-10-12T06:30:09.439319551Z'
    
  4. 確認設定叢集中存在 GatewayClasses:

    kubectl get gatewayclasses --context=gke-west-1
    

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

    NAME                                  CONTROLLER                  ACCEPTED   AGE
    gke-l7-global-external-managed        networking.gke.io/gateway   True       78m
    gke-l7-global-external-managed-mc     networking.gke.io/gateway   True       4m22s
    gke-l7-gxlb                           networking.gke.io/gateway   True       78m
    gke-l7-gxlb-mc                        networking.gke.io/gateway   True       4m23s
    gke-l7-regional-external-managed      networking.gke.io/gateway   True       78m
    gke-l7-regional-external-managed-mc   networking.gke.io/gateway   True       4m22s
    gke-l7-rilb                           networking.gke.io/gateway   True       78m
    gke-l7-rilb-mc                        networking.gke.io/gateway   True       4m22s
    

    這項輸出內容包括適用於外部多叢集閘道的 GatewayClass gke-l7-global-external-managed-mc、gke-l7-regional-external-managed-mc、gke-l7-gxlb-mc,以及適用於內部多叢集閘道的 GatewayClass gke-l7-rilb-mc。

  5. 將 kubectl 內容切換至設定叢集:

    kubectl config use-context gke-west-1
    

您現在可以開始在設定叢集中部署多叢集閘道。

疑難排解

本節說明如何解決啟用多叢集 Gateway 控制器時發生的問題。

設定叢集不支援 GatewayClass

執行 kubectl get gatewayclasses 指令時,可能會發生下列錯誤:

error: the server doesn't have a resource type "gatewayclasses"

如要解決這個問題,請在叢集上安裝 Gateway API:

gcloud container clusters update CLUSTER_NAME \
    --gateway-api=standard \
    --location=CONTROL_PLANE_LOCATION

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。

多叢集閘道控制器未啟動

在設定叢集上啟用 Gateway API,並在啟用 Fleet Ingress 功能加入 CRD 時,多叢集 Gateway 控制器可能無法啟動。

如要避免這個問題,請先啟用 Gateway API,再啟用 Fleet 進入流量。不過,如果您已啟用 Fleet 進入流量,請停用再重新啟用 Fleet 進入流量,解決這個問題:

  1. 停用 Fleet Ingress:

    gcloud container fleet ingress disable
    
  2. 啟用 Fleet Ingress:

    gcloud container fleet ingress enable
        --config-membership=CONFIG_MEMBERSHIP
        --project=PROJECT_ID
    

更改下列內容:

  • CONFIG_MEMBERSHIP:會員 ID 或會員的完整合格 ID。例如:projects/PROJECT_ID/locations/us-west1/memberships/gke-west-1
  • PROJECT_ID:執行 GKE 叢集的專案 ID。

後續步驟

  • 如要部署多叢集負載平衡,請參閱「部署多叢集閘道」。
  • 如要進一步瞭解 Gateway 控制器,請參閱「Gateway」。