このページでは、Google にホストされ、外部ロードバランサと内部ロードバランサをプロビジョニングするコントローラであるマルチクラスタ GKE Gateway Controller を GKE クラスタに対して有効にする方法について説明します。コンテナのロード バランシングに Gateway リソースを使用する方法については、Gateways のデプロイまたはマルチクラスタ Gateways のデプロイをご覧ください。
マルチクラスタ 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 の一部として追加料金なしで提供されます。マルチクラスタ Gateway の料金については、マルチクラスタ Gateway とマルチクラスタ Ingress の料金ページをご覧ください。
始める前に
作業を始める前に、次のタスクが完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components updateコマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
GKE Gateway コントローラの要件
- Gateway API は、VPC ネイティブ クラスタでのみサポートされます。
- リージョンまたはクロスリージョンの GatewayClass を使用している場合は、プロキシ専用サブネットを有効にする必要があります。
- クラスタで HttpLoadBalancingアドオンが有効になっている必要があります。
- Istio を使用している場合は、Istio を次のいずれかのバージョンにアップグレードする必要があります。
- 1.15.2 以降
- 1.14.5 以降
- 1.13.9 以降
 
- 共有 VPC を使用している場合は、ホスト プロジェクトで、サービス プロジェクトの GKE サービス アカウントに Compute Network Userロールを割り当てる必要があります。
マルチクラスタ Gateway の要件
マルチクラスタ Gateway のデプロイでは、GKE Gateway Controller の要件に加えて、次のタスクが完了していることを確認してください。
- 構成クラスタで Gateway API を有効にする。
- クラスタで GKE 用 Workload Identity 連携を有効にする。
- クラスタ登録のフリートの一般的な前提条件を満たしている。
- プロジェクトで、次のマルチクラスタ Gateway に必要な API を有効にする。 - Cloud Service Mesh API
- マルチクラスタ 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 にも適用されます。
単一クラスタ Gateway の制限に加えて、マルチクラスタ Gateway には次の制限が適用されます。
- リージョン内部 GatewayClass - gke-l7-rilb-mcでは、異なるリージョンのバックエンドへのロード バランシングはサポートされていません。GatewayClass でサポートされている機能の詳細については、GatewayClass の機能をご覧ください。
- Serviceは、マルチクラスタ Gateway の- backendRefsとしてサポートされていません。マルチクラスタ Gateway は、有効な- backendRefsとして- ServiceImportのみをサポートします。
- フリート内のすべてのクラスタは、フリート ホスト プロジェクトに存在する必要があります。 
- プロジェクト間のロード バランシングはサポートされていません。同じマルチクラスタ Gateway に接続されているすべてのクラスタ(構成クラスタとターゲット クラスタ)は、同じ共有 VPC ホスト プロジェクトまたはサービス プロジェクトにデプロイする必要があります。マルチクラスタ Gateway でサポートされている共有 VPC トポロジの詳細については、共有 VPC でマルチクラスタ Gateway を使用するをご覧ください。 
- VPC 間のロード バランシングはサポートされていません。同じマルチクラスタ Gateway に接続されているすべてのクラスタ(構成クラスタとターゲット クラスタ)は、同じ VPC にデプロイする必要があります。 
- マルチクラスタ Gateway は、クラスタ間のサービス ディスカバリの処理を MCS に依存しています。そのため、マルチクラスタ Gateway が公開するサービスには、マルチクラスタ Service の要件がすべて適用されます。 
- マルチクラスタ Gateway は、次のシナリオでロードバランサのリソースをリークする可能性があります。 - Fleet Ingress 機能が新しい構成クラスタで更新されます。新しい構成クラスタには、現在の構成クラスタに存在するすべての Gatewayリソースがありません。
- マルチクラスタ GatewayClassを参照するGatewayリソースが構成クラスタに存在する間、Fleet Ingress 機能は無効になります。
 
- Fleet Ingress 機能が新しい構成クラスタで更新されます。新しい構成クラスタには、現在の構成クラスタに存在するすべての 
- マルチクラスタ Gateway はグローバル サービスとして実行されます。マルチクラスタ Gateway コントローラでリージョンの Fleet コントロール プレーン障害が発生した場合は、静的障害として、リージョンがサービスに復帰するまでそれ以上ロードバランサの変更を行わないことで対応します。 
割り当て
GKE Gateway は、Cloud Load Balancing の割り当てを使用して、GKE クラスタにルーティングされる上り(内向き)トラフィックを管理するために Gateway コントローラが作成できるリソースの数を制限します。
マルチクラスタ Gateway の環境を設定する
マルチクラスタ Gateways のデプロイの例を完成させるには、複数の GKE クラスタが必要です。すべてのクラスタが同じフリートに登録されているため、マルチクラスタ Gateway と Service がクラスタ間で動作できるようになります。
次の手順では、プロジェクト内の 2 つの異なるリージョンに 3 つの GKE クラスタをデプロイします。
- us-west1-a/gke-west-1
- us-west1-a/gke-west-2
- us-east1-b/gke-east-1
これにより、次のクラスタ トポロジが作成されます。
これらの GKE クラスタは、外部ゲートウェイと内部ゲートウェイを使用したマルチリージョン負荷分散と Blue/Green マルチクラスタ トラフィック分割の実証のために使用されます。
クラスタをデプロイする
この手順では、3 つの GKE クラスタを us-east1 と us-west1 のリージョンにデプロイします。
クラスタはプロジェクトのフリートに登録されます。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 に置き換えます。
フリートでマルチクラスタ Service を有効にする
- 登録済みクラスタのフリートでマルチクラスタ Service を有効にします。これにより、フリートに登録されている 3 つのクラスタの MCS コントローラが有効になり、Service のリッスンとエクスポートを開始できます。 - 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 が有効になっていることを確認します。登録された 3 つのクラスタのメンバーシップが表示されます。すべてのクラスタが表示されるまでに数分かかることがあります。 - 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'
フリートでマルチクラスタ Gateway を有効にする
マルチクラスタ GKE Gateway Controller は、マルチクラスタ Gateway のデプロイを管理します。
マルチクラスタ Gateway コントローラを有効にする場合は、構成クラスタを選択する必要があります。構成クラスタは、Gateway リソース(Gateway、Route、Policy)がデプロイされる GKE クラスタです。これは、クラスタ間のルーティングを一元的に制御する場所です。構成クラスタとして選択するクラスタを決定する方法については、構成クラスタの設計をご覧ください。
- マルチクラスタ Gateway を有効にして、フリート内の構成クラスタを指定します。構成クラスタは後からいつでも更新できます。この例では、マルチクラスタ Gateway のリソースをホストする構成クラスタとして - gke-west-1を指定しています。- gcloud container fleet ingress enable \ --config-membership=projects/PROJECT_ID/locations/us-west1/memberships/gke-west-1 \ --project=PROJECT_ID
- マルチクラスタ 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_IDと- PROJECT_NUMBERは、クラスタがデプロイされているプロジェクト ID とプロジェクト番号に置き換えます。
- フリートで GKE Gateway Controller が有効になっていることを確認します。 - 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'
- GatewayClass が構成クラスタに存在することを確認します。 - 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- この出力には、外部マルチクラスタ Gateway 用の GatewayClass gke-l7-global-external-managed-mc、gke-l7-regional-external-managed-mc、gke-l7-gxlb-mc と、内部マルチクラスタ Gateway 用の GatewayClass gke-l7-rilb-mc が含まれます。 
- kubectl のコンテキストを構成クラスタに切り替えます。 - kubectl config use-context gke-west-1
これで、構成クラスタにマルチクラスタ Gateway をデプロイする準備が整いました。
トラブルシューティング
このセクションでは、マルチクラスタ 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 コントローラが起動しません
構成クラスタで Gateway API を有効にして、Fleet Ingress 機能が有効になった後に CRD を含めると、マルチクラスタ Gateway コントローラが起動しない可能性があります。
この問題を回避するには、Fleet Ingress を有効にする前に Gateway API を有効にします。ただし、フリート上り(内向き)をすでに有効にしている場合は、フリート上り(内向き)を無効にしてから再度有効にすることで、この問題を解決します。
- Fleet Ingress を無効にします。 - gcloud container fleet ingress disable
- フリート上り(内向き)を有効にします。 - gcloud container fleet ingress enable \ --config-membership=CONFIG_MEMBERSHIP \ --project=PROJECT_ID
次のように置き換えます。
- CONFIG_MEMBERSHIP: メンバーシップの ID またはメンバーシップの完全修飾識別子。例: projects/PROJECT_ID/locations/us-west1/memberships/gke-west-1
- PROJECT_ID: GKE クラスタが実行されているプロジェクト ID。
次のステップ
- マルチクラスタ ロード バランシングをデプロイするには、マルチクラスタ ゲートウェイのデプロイをご覧ください。
- ゲートウェイ コントローラの詳細については、ゲートウェイをご覧ください。