マルチクラスタ Gateway の環境を準備する

このドキュメントでは、マルチクラスタ GKE Gateway コントローラを有効にするために Google Kubernetes Engine(GKE)環境を準備する方法について説明します。このコントローラは、GKE クラスタの外部ロードバランサと内部ロードバランサをプロビジョニングする Google ホストのコントローラです。コンテナのロード バランシングに Gateway リソースを使用する方法については、Gateway のデプロイまたはマルチクラスタ Gateway のデプロイをご覧ください。

マルチクラスタ 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 Controller の要件

  • 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 機能は無効になります。
  • マルチクラスタ 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-east1us-west1 のリージョンにデプロイします。

クラスタはプロジェクトのフリートに登録されます。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 に置き換えます。

フリートでマルチクラスタ Service を有効にする

  1. 登録済みクラスタのフリートでマルチクラスタ Service を有効にします。これにより、フリートに登録されている 3 つのクラスタの MCS コントローラが有効になり、Service のリッスンとエクスポートを開始できます。

    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 が有効になっていることを確認します。登録された 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 リソース(GatewayRoutePolicy)がデプロイされる GKE クラスタです。これは、クラスタ間のルーティングを一元的に制御する場所です。構成クラスタとして選択するクラスタを決定する方法については、構成クラスタの設計をご覧ください。

  1. マルチクラスタ 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
    
  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. フリートで 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'
    
  4. 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 が含まれます。

  5. kubectl のコンテキストを構成クラスタに切り替えます。

    kubectl config use-context gke-west-1
    

これで、構成クラスタにマルチクラスタ Gateway をデプロイする準備が整いました。

共有 VPC でマルチクラスタ Gateway を使用する

マルチクラスタ Gateway は、ユースケースに応じて異なるトポロジで共有 VPC 環境にデプロイすることもできます。

次の表に、共有 VPC 環境内でサポートされているマルチクラスタ Gateway トポロジを示します。

シナリオ フリート ホスト プロジェクト 構成クラスタ ワークロード クラスタ
1 共有 VPC ホスト プロジェクト 共有 VPC ホスト プロジェクト 共有 VPC ホスト プロジェクト
2 共有 VPC サービス プロジェクト 共有 VPC サービス プロジェクト
(フリート サービス プロジェクトと同じ)
共有 VPC サービス プロジェクト
(フリート サービス プロジェクトと同じ)

共有 VPC 環境でマルチクラスタ Gateway を作成するには、次の手順を使用します。

  1. 共有 VPC を使用したマルチクラスタ Service を設定する手順に沿って操作します。

  2. 構成クラスタにサービスを作成してエクスポートします。

  3. マルチクラスタの内部 Gateway を使用する場合は、プロキシ専用サブネットを作成します。

  4. マルチクラスタの外部または内部 Gateway と HTTPRoute を作成します。

これらの手順を完了したら、トポロジに応じてデプロイを検証できます。

トラブルシューティング

このセクションでは、マルチクラスタ 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 を有効にします。ただし、フリート上り(内向き)をすでに有効にしている場合は、フリート上り(内向き)を無効にしてから再度有効にすることで、この問題を解決します。

  1. Fleet Ingress を無効にします。

    gcloud container fleet ingress disable
    
  2. フリート上り(内向き)を有効にします。

    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。

次のステップ