GKE Gateway API の設定準備
このドキュメントで説明する構成は、プレビュー版をご利用のお客様に対してサポートされていますが、新規の Cloud Service Mesh ユーザーにはおすすめしません。詳細については、Cloud Service Mesh の概要をご覧ください。
このガイドでは、Cloud Service Mesh で Google Kubernetes Engine Gateway API を使用するための環境を準備する方法について説明します。大まかな手順は次のとおりです。
- 必要な Google Cloud API サービスを有効にします。
- GKE クラスタをデプロイする。
- IAM 権限を構成する。
- 必要なカスタム リソース定義(CRD)をインストールします。
- クラスタをフリートに登録します。
- (省略可)マルチクラスタ サービス(マルチクラスタ サービス ディスカバリ)を有効にします。
- サービス メッシュを有効にします。
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 サービスを有効にする
プロジェクトで必要な API が有効になっていない場合は、次のコマンドを実行して必要な API を有効にします。
gcloud services enable --project=PROJECT_ID \ container.googleapis.com \ gkehub.googleapis.com \ multiclusteringress.googleapis.com \ trafficdirector.googleapis.com \ networkservices.googleapis.com
フリートに複数のクラスタを含める場合は、
multiclusterservicediscovery
API を有効にします。gcloud services enable --project=PROJECT_ID \ multiclusterservicediscovery.googleapis.com
GKE クラスタをデプロイする
GKE クラスタをデプロイするには、次の手順を行います。
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 機能を有効にします。
クラスタの認証情報を取得します。
gcloud container clusters get-credentials gke-1 --zone=us-west1-a
クラスタ コンテキストの名前を変更します。
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 サービス アカウントを設定してください。
サービス アカウントに
client
ロールを付与します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member "group:PROJECT_ID.svc.id.goog:/allAuthenticatedUsers/" \ --role "roles/trafficdirector.client"
必要なカスタム リソース定義をインストールする
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 -
次のコマンドを実行して、必要な 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.io
と tdgrpcroutes.net.gke.io
は、前の手順でインストールされています。
net.gke.io
API グループの一部である CRD は GKE に固有のものです。これらのリソースは、networking.k8s.io
API グループに含まれる OSS Gateway API の実装の一部ではありません。
クラスタをフリートに登録する
クラスタが正常に作成されたら、クラスタをフリートに登録する必要があります。クラスタをフリートに登録すると、登録済みクラスタで機能を選択的に有効にできます。
クラスタをフリートに登録します。
gcloud container hub memberships register gke-1 \ --gke-cluster us-west1-a/gke-1 \ --location global \ --project=PROJECT_ID
クラスタがフリートに登録されていることを確認します。
gcloud container hub memberships list --project=PROJECT_ID
出力は次のようになります。
NAME EXTERNAL_ID gke-1 657e835d-3b6b-4bc5-9283-99d2da8c2e1b
(省略可)マルチクラスタ サービス ディスカバリを有効にする
マルチクラスタ サービス ディスカバリ機能を使用すると、フリートに登録されているすべてのクラスタにクラスタのローカル サービスをエクスポートできます。フリートに複数のクラスタを含める予定がない場合は、この手順は省略できます。
マルチクラスタ サービス ディスカバリを有効にします。
gcloud container hub multi-cluster-services enable \ --project PROJECT_ID
マルチクラスタ サービス ディスカバリに必要な 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"
登録済みクラスタでマルチクラスタ サービス ディスカバリが有効になっていることを確認します。すべてのクラスタが表示されるまでに数分かかることがあります。
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 サービス メッシュを有効にする
このセクションでは、サービス メッシュを有効にします。
フリートに登録したクラスタで Cloud Service Mesh GKE サービス メッシュを有効にします。
gcloud container hub ingress enable \ --config-membership=projects/PROJECT_ID/locations/global/memberships/gke-1 \ --project=PROJECT_ID
この機能が有効になっていることを確認します。
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'
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"
次のステップ
サンプル デプロイメントを設定するには、次のガイドをご覧ください。