マルチクラスタ ゲートウェイの有効化

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

このページでは、マルチクラスタ GKE Gateway コントローラを有効にする方法について説明します。これは Google がホストするコントローラで、外部ロードバランサと内部ロードバランサをプロビジョニングします。コンテナのロード バランシングに Gateway リソースと HTTPRoute リソースを使用する方法については、Gateways のデプロイまたはマルチクラスタ Gateways のデプロイをご覧ください。

マルチクラスタ GKE ゲートウェイ コントローラは、2 つのマルチクラスタ GatewayClasses をインストールします。つまり、外部マルチクラスタ ゲートウェイの場合は gke-l7-gxlb-mc、内部マルチクラスタ ゲートウェイ用には gke-l7-rilb-mc をインストールします。

さまざまな GKE の GatewayClasses の機能について詳細を確認してください。

要件

マルチクラスタ ゲートウェイを使用するには、以下のものが必要です。

内部マルチクラスタ ゲートウェイを使用するには、次の条件を満たしている必要があります。

  • プロジェクトでプロキシ専用サブネットを有効にする必要があります。
  • 同じゲートウェイを共有する GKE クラスタが、すべて同じ Google Cloud リージョンに配置されている必要があります。

料金

Gateway コントローラを介してデプロイされたすべての Compute Engine リソースは、GKE クラスタが存在するプロジェクトに対して課金されます。リージョン Gateway コントローラは、GKE Standard と Autopilot の一部として追加料金なしで提供されます。マルチクラスタ Gateway コントローラは、プレビュー期間中は追加料金なしで使用できます。一般提供になると、マルチクラスタ Gateway はマルチクラスタ Ingress と Gateway の料金に従って課金されます。

始める前に

マルチクラスタ ゲートウェイのデプロイを開始する前に、次のタスクを完了してください。

必要な API が有効になっていない場合は、次のコマンドを実行して有効にします。

  gcloud services enable \
    container.googleapis.com \
    gkehub.googleapis.com \
    multiclusterservicediscovery.googleapis.com \
    multiclusteringress.googleapis.com \
    trafficdirector.googleapis.com \
    --project=PROJECT_ID

PROJECT_ID は、GKE クラスタが実行されているプロジェクト ID に置き換えます。

環境の準備

マルチクラスタ ゲートウェイのデプロイの例を完了するには、複数の 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 のリージョンにデプロイします。

  1. us-west1gke-west-1 という名前の GKE クラスタを作成します。

    gcloud container clusters create gke-west-1 \
        --zone=us-west1-a \
        --enable-ip-alias \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --cluster-version=VERSION \
        --project=PROJECT_ID
    

    次のように置き換えます。

    • PROJECT_ID: GKE クラスタが実行されているプロジェクト ID。
    • VERSION: GKE のバージョン。1.20 以降にする必要があります。また、--release-channel フラグを使用してリリース チャンネルを選択することもできます。リリース チャンネルには、デフォルトのバージョン 1.20 以降が必要です。
  2. us-west1(または前のクラスタと同じリージョン)に、gke-west-2 という名前の別の GKE クラスタを作成します。

    gcloud container clusters create gke-west-2 \
        --zone=us-west1-a \
        --enable-ip-alias \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --cluster-version=VERSION \
        --project=PROJECT_ID
    
  3. us-east1(または前のリージョンとは異なるリージョン)に gke-east-1 という名前の GKE クラスタを作成します。

    gcloud container clusters create gke-east-1 \
        --zone=us-east1-b \
        --enable-ip-alias \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --cluster-version=VERSION \
        --project=PROJECT_ID
    

クラスタ認証情報を構成する

このステップでは、覚えやすい名前を使用してクラスタ認証情報を構成します。これにより、複数のクラスタにリソースをデプロイするときに、クラスタの切り替えが容易になります。

  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 に置き換えます。

フリートに登録する

  1. 3 つのクラスタすべてが正常に作成されたら、これらのクラスタをプロジェクトのフリートに登録する必要があります。GKE クラスタをフリートにグループ化すると、マルチクラスタ ゲートウェイの対象にできます。

    gcloud container fleet memberships register gke-west-1 \
         --gke-cluster us-west1-a/gke-west-1 \
         --enable-workload-identity \
         --project=PROJECT_ID
    
    gcloud container fleet memberships register gke-west-2 \
         --gke-cluster us-west1-a/gke-west-2 \
         --enable-workload-identity \
         --project=PROJECT_ID
    
    gcloud container fleet memberships register gke-east-1 \
         --gke-cluster us-east1-b/gke-east-1 \
         --enable-workload-identity \
         --project=PROJECT_ID
    
  2. クラスタがフリートに正常に登録されたことを確認します。

    gcloud container fleet memberships list --project=PROJECT_ID
    

    出力は次のようになります。

    NAME          EXTERNAL_ID
    gke-east-1  657e835d-3b6b-4bc5-9283-99d2da8c2e1b
    gke-west-2  f3727836-9cb0-4ffa-b0c8-d51001742f19
    gke-west-1  93de69c0-859e-4ddd-bf3a-e3d62ef5090b
    

マルチクラスタ Service を有効にする

  1. 登録済みクラスタのフリートでマルチクラスタ サービスを有効にします。これにより、フリートに登録されている 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: '2021-04-02T19:34:57.832055223Z'
    membershipStates
      projects/381015962062/locations/global/memberships/gke-east-1:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2021-05-27T11:03:07.770208064Z'
      projects/381015962062/locations/global/memberships/gke-west-1:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2021-05-27T09:32:14.401508987Z'
      projects/381015962062/locations/global/memberships/gke-west-2:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2021-05-27T13:53:27.628109510Z'
    name: projects/PROJECT_ID/locations/global/features/multiclusterservicediscovery
    resourceState:
      state: ACTIVE
    spec: {}
    updateTime: '2021-04-02T19:34:58.983512446Z'
    

Gateway API CRD をインストールする

GKE で Gateway リソースを使用する前に、クラスタに Gateway API カスタム リソース定義(CRD)をインストールする必要があります。

  1. Gateway リソースをデプロイする GKE クラスタで、次のコマンドを実行します。

    kubectl --context gke-west-1 apply -k "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v0.5.0"
    

    このコマンドにより、v1beta1 CRD がインストールされます。

    出力は次のようになります。

    customresourcedefinition.apiextensions.k8s.io/gatewayclasses.gateway.networking.k8s.io configured
    customresourcedefinition.apiextensions.k8s.io/gateways.gateway.networking.k8s.io configured
    customresourcedefinition.apiextensions.k8s.io/httproutes.gateway.networking.k8s.io configured
    

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

マルチクラスタ GKE ゲートウェイ コントローラは、マルチクラスタ ゲートウェイ(および MulticlusterIngress リソース)のデプロイを管理します。これは gcloud container fleet ingress enable コマンドで有効にします。

マルチクラスタ ゲートウェイ コントローラを有効にする場合は、構成クラスタを選択する必要があります。構成クラスタは、ゲートウェイとルートリソースがデプロイされている GKE クラスタです。これは、クラスタ間のルーティングを一元的に制御する場所です。構成クラスタとして選択するクラスタを決定する方法については、構成クラスタの設計をご覧ください。

  1. マルチクラスタ GKE Gateway コントローラを有効にして、構成クラスタを指定します。構成クラスタは後からいつでも更新できます。この例では、マルチクラスタ ゲートウェイのリソースをホストする構成クラスタとして gke-west-1 を指定しています。

    gcloud container fleet ingress enable \
        --config-membership=/projects/PROJECT_ID/locations/global/memberships/gke-west-1 \
        --project=PROJECT_ID
    
  2. フリートでグローバル GKE Gateway Controller が有効になっていることを確認します。

    gcloud container fleet ingress describe --project=PROJECT_ID
    

    出力は次のようになります。

    createTime: '2021-05-26T13:27:37.460383111Z'
    membershipStates:
      projects/381015962062/locations/global/memberships/gke-east-1:
        state:
          code: OK
          updateTime: '2021-05-27T15:08:19.397896080Z'
      projects/381015962062/locations/global/memberships/gke-west-1:
        state:
          code: OK
          updateTime: '2021-05-27T15:08:19.397895711Z'
      projects/381015962062/locations/global/memberships/gke-west-2:
        state:
          code: OK
          updateTime: '2021-05-27T15:08:19.397896293Z'
    resourceState:
      state: ACTIVE
    spec:
      multiclusteringress:
        configMembership: projects/PROJECT_ID/locations/global/memberships/gke-west-1
    state:
      state:
        code: OK
        description: Ready to use
        updateTime: '2021-05-26T13:27:37.899549111Z'
    updateTime: '2021-05-27T15:08:19.397895711Z'
    
  3. 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 とプロジェクト番号に置き換えます。

  4. GatewayClass がクラスタに存在することを確認します。

    kubectl get gatewayclasses --context=gke-west-1
    

    出力は次のようになります。

    NAME             CONTROLLER
    gke-l7-gxlb      networking.gke.io/gateway
    gke-l7-gxlb-mc   networking.gke.io/gateway
    gke-l7-rilb      networking.gke.io/gateway
    gke-l7-rilb-mc   networking.gke.io/gateway
    

    この出力には、外部マルチクラスタ ゲートウェイ用の GatewayClass gke-l7-gxlb-mc と内部マルチクラスタ ゲートウェイ用の GatewayClass gke-l7-rilb-mc が含まれます。

  5. kubectl コンテキストをコントロール クラスタに切り替えます。

    kubectl config use-context gke-west-1
    

これで、構成クラスタにマルチクラスタのゲートウェイとルートをデプロイする準備が整いました。

次のステップ