準備多叢集閘道環境

本文說明如何準備 Google Kubernetes Engine (GKE) 環境,以啟用多叢集 GKE Gateway 控制器。這個控制器是由 Google 代管,可為 GKE 叢集佈建外部和內部負載平衡器。如要瞭解如何使用閘道資源進行容器負載平衡,請參閱「部署閘道」或「部署多叢集閘道」。

多叢集 GKE Gateway Controller 會在叢集中安裝下列多叢集 GatewayClass:

  • gke-l7-global-external-managed-mc,適用於全球外部多叢集閘道
  • gke-l7-regional-external-managed-mc 代表區域外部多叢集
  • gke-l7-cross-regional-internal-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 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。

GKE Gateway 控制器需求

  • 閘道 API 僅支援 VPC 原生叢集。
  • 如果您使用區域或跨區域 GatewayClass,則必須啟用僅限 Proxy 的子網路
  • 叢集必須啟用 HttpLoadBalancing 外掛程式。
  • 如果您使用 Istio,請務必將 Istio 升級至下列其中一個版本:
    • 1.15.2 以上版本
    • 1.14.5 以上版本
    • 1.13.9 以上版本。
  • 如果您使用 Shared VPC,則須在主專案中,將 Compute Network User 角色指派給服務專案的 GKE 服務帳戶。

多叢集閘道需求

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

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

    • Cloud Service Mesh API
    • 多叢集 Ingress API
    • Cloud DNS API
    • GKE Hub (機群) API
    • Resource Manager API
    • 多叢集服務探索 API

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

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

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

規定與限制

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

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

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

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

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

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

  • 系統不支援跨虛擬私有雲的負載平衡。附加至相同多叢集閘道的所有叢集 (設定叢集和目標叢集) 都必須部署在同一個 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-west1gke-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. 在機群主專案中建立 IAM 繫結,將 MCS 服務代理人角色指派給專案的 MCS 服務帳戶:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:service-PROJECT_ID@gcp-sa-mcsd.iam.gserviceaccount.com" \
        --role roles/multiclusterservicediscovery.serviceAgent \
        --project=PROJECT_ID
    
  4. 確認已為已註冊的叢集啟用 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. 授予多叢集 Gateway 控制器所需的 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. 如果叢集網路的專案與機群專案不同 (例如使用共用虛擬私有雲),您必須允許機群專案中的多叢集閘道控制器服務帳戶存取網路專案。

    在車隊專案中,授予多叢集 Gateway 控制器服務帳戶存取網路專案的權限:

    gcloud projects add-iam-policy-binding NETWORK_PROJECT_ID \
        --member "serviceAccount:service-PROJECT_NUMBER@gcp-sa-multiclusteringress.iam.gserviceaccount.com" \
        --role "roles/compute.networkUser" \
        --project=NETWORK_PROJECT_ID
    
  4. 確認機群已啟用 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'
    
  5. 確認設定叢集中存在 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。

  6. 將 kubectl 環境切換至設定叢集:

    kubectl config use-context gke-west-1
    

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

搭配 Shared VPC 使用多叢集閘道

多叢集閘道也可以部署在 Shared VPC 環境中,並視用途採用不同拓撲。

下表說明 Shared VPC 環境中支援的多叢集閘道拓撲:

情境 機群主專案 設定叢集 工作負載叢集
1 Shared VPC 主機專案 Shared VPC 主機專案 Shared VPC 主機專案
2 Shared VPC 服務專案 Shared VPC 服務專案
(與機群服務專案相同)
Shared VPC 服務專案
(與機群服務專案相同)

如要在 Shared VPC 環境中建立多叢集閘道,請根據所選情境執行下列步驟:

情境 1

在這個情境中,機群主專案、設定叢集和工作負載叢集,都是在 Shared VPC 主專案中建立及設定。如要在這個設定中建立多叢集閘道,請按照本文中的操作說明設定多叢集閘道環境,並使用 Shared VPC 主專案 ID 做為 PROJECT_ID

情境 2

在這個情境中,機群主專案、設定叢集和工作負載叢集是在同一個 Shared VPC 服務專案中建立及設定。設定和工作負載叢集必須部署在相同的 VPC 中。

  1. 啟用必要的 API。Google Cloud CLI 的輸出內容會顯示 API 是否已啟用。

    1. 只在 Shared VPC 主專案中啟用 Cloud DNS API:

      gcloud services enable dns.googleapis.com \
        --project=SHARED_VPC_HOST_PROJECT_ID
      

      在這個情境中,機群主專案是連結至 Shared VPC 主專案的服務專案。您必須在共用虛擬私有雲主專案中啟用 Cloud DNS API,因為共用虛擬私有雲網路位於該處。GKE 會在主專案中建立 Cloud DNS 代管私人區域,並授權共用虛擬私有雲網路使用這些區域。

    2. 在 Shared VPC 服務專案 (也就是機群主專案) 中,啟用所有其他 API:

        gcloud services enable \
        trafficdirector.googleapis.com \
        multiclusterservicediscovery.googleapis.com \
        multiclusteringress.googleapis.com \
        gkehub.googleapis.com \
        cloudresourcemanager.googleapis.com \
        --project=FLEET_HOST_PROJECT_ID
      
  2. 在機群中啟用多叢集服務。

    1. 在機群主專案中,為已註冊的叢集啟用多叢集服務。這個步驟會啟用註冊至機群的 MCS 控制器叢集,以便開始監聽及匯出服務。

      gcloud container fleet multi-cluster-services enable \
      --project FLEET_HOST_PROJECT_ID
      

      在 Fleet 主機專案中啟用多叢集服務時,系統會建立或確保下列服務帳戶存在:service-FLEET_HOST_PROJ_NUMBER@gcp-sa-mcsd.iam.gserviceaccount.com

    2. 如要將 MCS 服務代理人角色授予車隊主專案的 MCS 服務帳戶,請在共用 VPC 主專案中建立 IAM 繫結。

      gcloud projects add-iam-policy-binding SHARED_VPC_HOST_PROJECT_ID \
      --member "serviceAccount:service-FLEET_HOST_PROJECT_NUMBER@gcp-sa-mcsd.iam.gserviceaccount.com" \
      --role roles/multiclusterservicediscovery.serviceAgent
      
    3. 如要將網路使用者角色授予車隊主專案的 MCS 服務帳戶,請在車隊主專案中建立 IAM 繫結。

      gcloud projects add-iam-policy-binding FLEET_HOST_PROJECT_ID \
       --member "serviceAccount:FLEET_HOST_PROJECT_ID.svc.id.goog[gke-mcs/gke-mcs-importer]" \
       --role roles/compute.networkViewer
      
  3. 在機群中啟用多叢集閘道。

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

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

      gcloud projects add-iam-policy-binding FLEET_HOST_PROJECT_ID \
         --member "serviceAccount:service-FLEET_HOST_PROJECT_NUMBER@gcp-sa-multiclusteringress.iam.gserviceaccount.com" \
         --role "roles/container.admin" \
         --project=FLEET_HOST_PROJECT_ID
      
  4. 如果您打算使用多叢集內部 Gateway,請建立僅限 Proxy 的子網路

  5. 在 Shared VPC 主專案中建立防火牆規則。

    在共用 VPC 網路中,主專案管理員必須代表 Multi Cluster Ingress 控制器,手動建立負載平衡器流量的防火牆規則:

      gcloud compute firewall-rules create FIREWALL_RULE_NAME \
        --project=HOST_PROJECT \
        --network=SHARED_VPC \
        --direction=INGRESS \
        --allow=tcp:0-65535 \
        --source-ranges=130.211.0.0/22,35.191.0.0/16
    
  6. 建立及匯出服務至設定叢集

完成上述步驟後,即可根據拓撲驗證部署作業。

疑難排解

本節說明如何解決啟用多叢集 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 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。

後續步驟