GKE Gateway API の設定準備

このドキュメントで説明する構成は、プレビュー版をご利用のお客様に対してサポートされていますが、新規の Cloud Service Mesh ユーザーにはおすすめしません。詳細については、Cloud Service Mesh の概要をご覧ください。

このガイドでは、Cloud Service Mesh で Google Kubernetes Engine Gateway API を使用するための環境を準備する方法について説明します。大まかな手順は次のとおりです。

  1. 必要な Google Cloud API サービスを有効にします。
  2. GKE クラスタをデプロイする。
  3. IAM 権限を構成する。
  4. 必要なカスタム リソース定義(CRD)をインストールします。
  5. クラスタをフリートに登録します。
  6. (省略可)マルチクラスタ サービス(マルチクラスタ サービス ディスカバリ)を有効にします。
  7. サービス メッシュを有効にします。

GKE を使用していない場合は、サービス ルーティング API を使用して Mesh リソースを作成します。

始める前に

Deployment のコンポーネントが次の要件を満たしていることを確認します。

  • GKE をバージョン 1.20 以降にする必要があります。
  • xDS バージョン 3 API 以降のデータプレーンのみがサポートされます。
    • Envoy の最小バージョン 1.20.0
    • gRPC ブートストラップ ジェネレータの最小バージョン v0.14.0
  • GKE クラスタは、VPC ネイティブ(エイリアス IP)モードにする必要があります。
  • GKE とは異なり、Compute Engine のセルフマネージド Kubernetes クラスタはサポートされていません。
  • GKE のゲートウェイ機能に記載されている追加の制限事項は、Cloud Service Mesh と GKE Gateway API の統合に適用されます。
  • GKE ノードと Pod のサービス アカウントには、Traffic Director API にアクセスする権限が必要です。必要な権限の詳細については、Traffic Director API にアクセスするためのサービス アカウントの有効化をご覧ください。
  • プロジェクトごとのリソース使用量とバックエンド サービスの割り当ての上限が適用されます。

必要な Google Cloud API サービスを有効にする

  1. プロジェクトで必要な API が有効になっていない場合は、次のコマンドを実行して必要な API を有効にします。

    gcloud services enable --project=PROJECT_ID \
      container.googleapis.com \
      gkehub.googleapis.com \
      multiclusteringress.googleapis.com \
      trafficdirector.googleapis.com \
      networkservices.googleapis.com
    
  2. フリートに複数のクラスタを含める場合は、multiclusterservicediscovery API を有効にします。

    gcloud services enable --project=PROJECT_ID \
       multiclusterservicediscovery.googleapis.com
    

GKE クラスタをデプロイする

GKE クラスタをデプロイするには、次の手順を行います。

  1. us-west1-a ゾーンに gke-1 という名前の GKE クラスタを作成します。

    gcloud container clusters create gke-1 \
      --zone=us-west1-a \
      --enable-ip-alias \
      --workload-pool=PROJECT_ID.svc.id.goog \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --enable-mesh-certificates \
      --release-channel=regular \
      --project=PROJECT_ID
    
    • --enable-ip-alias: このフラグは VPC ネイティブ クラスタを作成し、VPC ネットワーク内で Pod の IP アドレスをルーティングできるようにします。
    • --workload-pool: このフラグは、クラスタがプロジェクトの Workload Identity プールに参加できるようにします。
    • --scopes: このフラグには、クラスタノードに割り当てられた OAuth スコープを指定します。
    • --release-channel: このフラグには regular チャネルを指定します。
    • --enable-mesh-certificates: このフラグは、今後利用可能になる可能性がある場合に Cloud Service Mesh の自動 mTLS 機能を有効にします。
  2. クラスタの認証情報を取得します。

    gcloud container clusters get-credentials gke-1 --zone=us-west1-a
    
  3. クラスタ コンテキストの名前を変更します。

    kubectl config rename-context gke_PROJECT_ID_us-west1-a_gke-1 gke-1
    

データプレーンの IAM 権限を構成する

このデモ用のデプロイメントでは、Cloud Service Mesh クライアント ロール roles/trafficdirector.client を、GKE クラスタ内のすべてのサービス アカウントなど、すべての認証済みユーザーに付与します。この IAM ロールは、Envoy などのデータプレーン内の Cloud Service Mesh クライアントが Cloud Service Mesh から構成を受信することを許可するために必要です。

すべての認証済みユーザーにクライアント ロールを付与せず、ロールをサービス アカウントに制限する場合は、GKE の Workload Identity ガイドを参照して、サービスに roles/trafficdirector.client ロールを持つ特別な Kubernetes サービス アカウントを設定してください。

  1. サービス アカウントに client ロールを付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "group:PROJECT_ID.svc.id.goog:/allAuthenticatedUsers/" \
      --role "roles/trafficdirector.client"
    

必要なカスタム リソース定義をインストールする

  1. Cloud Service Mesh で Gateway API を使用するために必要なカスタム リソース定義(CRD)をインストールします。

    kubectl apply -k "github.com/kubernetes-sigs/gateway-api/config/crd/experimental?ref=v0.6.0"
    
    kubectl kustomize "https://github.com/GoogleCloudPlatform/gke-networking-recipes.git/gateway-api/config/mesh/crd" \
    | kubectl apply -f -
    
  2. 次のコマンドを実行して、必要な CRD がクラスタに自動的にインストールされていることを確認します。

    kubectl get crds
    

    出力には、以下の CRD と Gateway API に関係のないものがすべて表示されますが、すべて作成日が異なります。

    NAME                                             CREATED AT
    gatewayclasses.gateway.networking.k8s.io                           2023-08-08T05:29:03Z
    gateways.gateway.networking.k8s.io                                 2023-08-08T05:29:03Z
    grpcroutes.gateway.networking.k8s.io                               2023-08-08T05:29:03Z
    httproutes.gateway.networking.k8s.io                               2023-08-08T05:29:03Z
    referencegrants.gateway.networking.k8s.io                          2023-08-08T05:29:04Z
    tcproutes.gateway.networking.k8s.io                                2023-08-08T05:29:04Z
    tdgrpcroutes.net.gke.io                                            2023-08-08T05:29:23Z
    tdmeshes.net.gke.io                                                2023-08-08T05:29:23Z
    tlsroutes.gateway.networking.k8s.io                                2023-08-08T05:29:05Z
    udproutes.gateway.networking.k8s.io                                2023-08-08T05:29:05Z
    

カスタム リソース tdmeshes.net.gke.iotdgrpcroutes.net.gke.io は、前の手順でインストールされています。

net.gke.io API グループの一部である CRD は GKE に固有のものです。これらのリソースは、networking.k8s.io API グループに含まれる OSS Gateway API の実装の一部ではありません。

クラスタをフリートに登録する

クラスタが正常に作成されたら、クラスタをフリートに登録する必要があります。クラスタをフリートに登録すると、登録済みクラスタで機能を選択的に有効にできます。

  1. クラスタをフリートに登録します。

    gcloud container hub memberships register gke-1 \
      --gke-cluster us-west1-a/gke-1 \
      --location global \
      --project=PROJECT_ID
    
  2. クラスタがフリートに登録されていることを確認します。

    gcloud container hub memberships list --project=PROJECT_ID
    

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

    NAME   EXTERNAL_ID
    gke-1  657e835d-3b6b-4bc5-9283-99d2da8c2e1b
    

(省略可)マルチクラスタ サービス ディスカバリを有効にする

マルチクラスタ サービス ディスカバリ機能を使用すると、フリートに登録されているすべてのクラスタにクラスタのローカル サービスをエクスポートできます。フリートに複数のクラスタを含める予定がない場合は、この手順は省略できます。

  1. マルチクラスタ サービス ディスカバリを有効にします。

    gcloud container hub multi-cluster-services enable \
      --project PROJECT_ID
    
  2. マルチクラスタ サービス ディスカバリに必要な 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"
    
  3. 登録済みクラスタでマルチクラスタ サービス ディスカバリが有効になっていることを確認します。すべてのクラスタが表示されるまでに数分かかることがあります。

    gcloud container hub multi-cluster-services describe --project=PROJECT_ID
    

    次のような gke-1 のメンバーシップが表示されます。

    createTime: '2021-04-02T19:34:57.832055223Z'
    membershipStates
      projects/PROJECT_NUM/locations/global/memberships/gke-1:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2021-05-27T11:03:07.770208064Z'
    name: projects/PROJECT_NUM/locations/global/features/multiclusterservicediscovery
    resourceState:
      state: ACTIVE
    spec: {}
    updateTime: '2021-04-02T19:34:58.983512446Z'
    

Cloud Service Mesh GKE サービス メッシュを有効にする

このセクションでは、サービス メッシュを有効にします。

  1. フリートに登録したクラスタで Cloud Service Mesh GKE サービス メッシュを有効にします。

    gcloud container hub ingress enable \
    --config-membership=projects/PROJECT_ID/locations/global/memberships/gke-1 \
      --project=PROJECT_ID
    
  2. この機能が有効になっていることを確認します。

    gcloud container hub ingress describe --project=PROJECT_ID
    

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

    createTime: '2021-05-26T13:27:37.460383111Z'
    membershipStates:
      projects/PROJECT_NUM/locations/global/memberships/gke-1:
        state:
          code: OK
          updateTime: '2021-05-27T15:08:19.397896080Z'
    resourceState:
     state: ACTIVE
    spec:
      multiclusteringress:
        configMembership: projects/PROJECT_ID/locations/global/memberships/gke-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 API コントローラに必要な次の Identity and Access Management(IAM)ロールを付与します。

    • roles/container.developer - このロールにより、コントローラはクラスタ内 Kubernetes リソースを管理できます。
    • roles/compute.networkAdmin - このロールにより、コントローラは Cloud Service Mesh のサービス メッシュ構成を管理できます。
    export PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format="value (projectNumber)")
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-multiclusteringress.iam.gserviceaccount.com" \
      --role "roles/container.developer"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-multiclusteringress.iam.gserviceaccount.com" \
      --role "roles/compute.networkAdmin"
    

次のステップ

サンプル デプロイメントを設定するには、次のガイドをご覧ください。