本頁說明如何啟用多叢集 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
資源。 - 如果設定叢集上存在參照多叢集
GatewayClass
的Gateway
資源,系統會停用機群 Ingress 功能。
- 機群 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-east1
和 us-west1
區域中部署三個 GKE 叢集。
叢集會註冊至專案的機群。 將 GKE 叢集歸入機群後,多叢集閘道就能以這些叢集為目標。
在
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 以上。
在
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
在
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
確認叢集已成功註冊至機群:
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
設定叢集憑證
這個步驟會設定叢集憑證,並使用容易記住的名稱。在多個叢集部署資源時,這樣做可讓您更輕鬆地切換叢集。
擷取叢集
gke-west-1
、gke-west-2
和gke-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 伺服器。系統預設會為憑證自動產生名稱。
重新命名叢集內容,方便日後參照:
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。
在機群中啟用多叢集服務
為已註冊的叢集啟用機群中的多叢集服務。這樣一來,註冊至機群的三個叢集就會啟用 MCS 控制器,開始監聽及匯出服務。
gcloud container fleet multi-cluster-services enable \ --project PROJECT_ID
授予 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。確認已為已註冊的叢集啟用 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 資源 (Gateway、Routes、Policies) 的 GKE 叢集。這是控制叢集間路由的中央位置。 請參閱設定叢集設計,協助您決定要選擇哪個叢集做為設定叢集。
啟用多叢集閘道,並在機群中指定設定叢集。請注意,您隨時可以更新設定叢集。 這個範例會將
gke-west-1
指定為設定叢集,用於代管多叢集閘道的資源。gcloud container fleet ingress enable \ --config-membership=projects/PROJECT_ID/locations/us-west1/memberships/gke-west-1 \ --project=PROJECT_ID
授予多叢集閘道控制器所需的 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_ID
和PROJECT_NUMBER
替換為叢集部署所在的專案 ID 和專案編號。確認機群已啟用 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'
確認設定叢集中存在 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。
將 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 進入流量,解決這個問題:
停用 Fleet Ingress:
gcloud container fleet ingress disable
啟用 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。