このページでは、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-rilb-mc
(リージョン内部マルチクラスタ ゲートウェイ用)gke-l7-gxlb-mc
(従来のグローバル外部マルチクラスタ ゲートウェイ用)
さまざまな GKE の GatewayClass の機能について詳細を確認してください。
料金
Gateway コントローラを介してデプロイされたすべての Compute Engine リソースは、GKE クラスタが存在するプロジェクトに対して課金されます。リージョン Gateway コントローラは、GKE Standard と Autopilot の一部として追加料金なしで提供されます。マルチクラスタ Gateway の料金については、マルチクラスタ Ingress と Gateway の料金ページをご覧ください。
始める前に
作業を始める前に、次のことを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components update
を実行して最新のバージョンを取得する。
GKE Gateway コントローラの要件
- Standard の場合、GKE バージョン 1.24 以降を使用します。
- Autopilot の場合、GKE バージョン 1.26 以降。
- Google Cloud CLI バージョン 407.0.0 以降。
- 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 の要件がすべて適用されます。
割り当て
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 \ --zone=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 \ --zone=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 \ --zone=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 --zone=us-west1-a --project=PROJECT_ID gcloud container clusters get-credentials gke-west-2 --zone=us-west1-a --project=PROJECT_ID gcloud container clusters get-credentials gke-east-1 --zone=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 \
--region=COMPUTE_REGION
以下を置き換えます。
CLUSTER_NAME
: クラスタの名前。COMPUTE_REGION
: クラスタの Compute Engine のリージョン。ゾーンクラスタの場合は、--zone=COMPUTE_ZONE
を使用します。
既知の問題
- マルチクラスタ Gateway コントローラで起動に失敗する既知の問題があります。この問題を回避するには、Fleet Ingress 機能が有効になる前に、構成クラスタで Gateway API を有効にして CRD を含めます。
- マルチクラスタ Gateway は、次のシナリオでロードバランサのリソースをリークする可能性があります。
- Fleet Ingress 機能が新しい構成クラスタで更新されます。新しい構成クラスタには、現在の構成クラスタに存在するすべての
Gateway
リソースがありません。 - マルチクラスタ
GatewayClass
を参照するGateway
リソースが構成クラスタに存在する間、Fleet Ingress 機能は無効になります。
- Fleet Ingress 機能が新しい構成クラスタで更新されます。新しい構成クラスタには、現在の構成クラスタに存在するすべての
- マルチクラスタ Gateway はグローバル サービスとして実行されます。マルチクラスタ Gateway コントローラでリージョンの Fleet コントロール プレーン障害が発生した場合は、静的障害として、リージョンがサービスに復帰するまでそれ以上ロードバランサの変更を行わないことで対応します。
次のステップ
- マルチクラスタ負荷分散をデプロイするには、マルチクラスタ ゲートウェイのデプロイをご覧ください。
- ゲートウェイ コントローラの詳細については、ゲートウェイをご覧ください。