マルチクラスタ ゲートウェイを有効にする


このページでは、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-east1us-west1 のリージョンにデプロイします。

クラスタはプロジェクトのフリートに登録されます。GKE クラスタをフリートにグループ化すると、マルチクラスタ ゲートウェイの対象にできます。

  1. us-west1gke-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 以降。
  2. 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
    
  3. 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
    
  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 --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 サーバーにアクセスできるようになります。デフォルトでは、認証情報に自動生成された名前が使用されます。

  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 をデプロイする準備が整いました。

トラブルシューティング

このセクションでは、マルチクラスタ 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 機能は無効になります。
  • マルチクラスタ Gateway はグローバル サービスとして実行されます。マルチクラスタ Gateway コントローラでリージョンの Fleet コントロール プレーン障害が発生した場合は、静的障害として、リージョンがサービスに復帰するまでそれ以上ロードバランサの変更を行わないことで対応します。

次のステップ