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

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

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

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

要件

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

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

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

料金

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

始める前に

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

必要な 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 \
        --release-channel=rapid \
        --cluster-version=1.20 \
        --project=PROJECT_ID
    

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

  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 \
        --release-channel=rapid \
        --cluster-version=1.20 \
        --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 \
        --release-channel=rapid \
        --cluster-version=1.20 \
        --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 に置き換えます。

Hub に登録する

  1. 3 つのクラスタがすべて正常に作成されたら、クラスタを GKE Hub に登録する必要があります。これにより、各クラスタがプロジェクトのフリート(マルチクラスタ ゲートウェイのターゲットとなる GKE クラスタを含むリソース)にマッピングされます。

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

    gcloud alpha container hub 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. 登録済みクラスタのフリートでマルチクラスタ サービスを有効にします。これにより、Hub に登録されている 2 つのクラスタの MCS コントローラが有効になり、Service のリッスンとエクスポートを開始できます。

    gcloud container hub 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 hub 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 API カスタム リソース定義(CRD)をインストールする必要があります。

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

    kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v0.3.0" \
    | kubectl apply -f -
    

    次の CRD がインストールされます。

    customresourcedefinition.apiextensions.k8s.io/backendpolicies.networking.x-k8s.io created
    customresourcedefinition.apiextensions.k8s.io/gatewayclasses.networking.x-k8s.io created
    customresourcedefinition.apiextensions.k8s.io/gateways.networking.x-k8s.io created
    customresourcedefinition.apiextensions.k8s.io/httproutes.networking.x-k8s.io created
    customresourcedefinition.apiextensions.k8s.io/tcproutes.networking.x-k8s.io created
    customresourcedefinition.apiextensions.k8s.io/tlsroutes.networking.x-k8s.io created
    customresourcedefinition.apiextensions.k8s.io/udproutes.networking.x-k8s.io created
    

次のステップでコントローラを有効にすると、クラスタにマルチクラスタ GatewayClass がインストールされ、マルチクラスタ ゲートウェイのデプロイが可能になります。

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

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

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

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

    gcloud alpha container hub ingress enable \
        --config-membership=/projects/PROJECT_ID/locations/global/memberships/gke-west-1 \
        --project=PROJECT_ID
    
  2. 登録済みクラスタでグローバル GKE ゲートウェイ コントローラが有効になっていることを確認します。

    gcloud alpha container hub 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. ingress Hub 機能が有効になると、構成クラスタでマルチクラスタ GatewayClass が使用可能になります。GatewayClasses のリストで、外部マルチクラスタ ゲートウェイには gke-l7-gxlb-mc が、内部マルチクラスタ ゲートウェイには gke-l7-rilb-mc が表示されます。これで、これらの 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
    

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

次のステップ