Cloud Service Mesh と gcloud CLI を使用して GKE クラスタを作成する
このチュートリアルでは、Google Kubernetes Engine(GKE)Fleet API を使用して新しい GKE 一般公開クラスタでマネージド Cloud Service Mesh をプロビジョニングします。このチュートリアルでは、次のことについて説明します。
- Google Cloud プロジェクトを構成する。
- Cloud Service Mesh で必要な最小限の vCPU を使用して GKE クラスタを作成する。
- プロジェクトのフリートに GKE クラスタを登録する。
- Fleet API を使用してクラスタにマネージド Cloud Service Mesh をプロビジョニングする
- Ingress ゲートウェイをデプロイしてアプリケーションを公開する
- サンプル アプリケーションをデプロイして、Google Cloud コンソールの Cloud Service Mesh ダッシュボードにテレメトリー データを表示できるようにする。
- サンプル アプリケーションを公開してアクセスする。
Fleet API
このガイドは、GKE クラスタおよび GKE クラスタと一緒に管理できる他のリソースの論理グループであるフリートに精通していることを前提としています。フリートは GKE の概念であり、Kubernetes の概念ではありません。クラスタをフリートに登録すると、gcloud container fleet mesh update
コマンドを使用して、そのクラスタにマネージド Cloud Service Mesh をプロビジョニングできます。このチュートリアルを始める際に有効にする Fleet API(gkehub.googleapis.com
)により、フリートの使用が有効になります。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このクイックスタートの終了後、クラスタを削除するとそれ以上の請求が発生しなくなります。詳細については、クリーンアップをご覧ください。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE, Fleet (GKE Hub), and Cloud Service Mesh APIs.
- プロジェクト ID をメモします。
必要なツールをインストールする
このツールは、Cloud Shell またはローカルマシンで実行できます。Cloud Shell で必要なすべてのツールがプリインストールされます。
Cloud Shell
Cloud Shell は、Debian ベースの Linux オペレーティング システムを実行している g1-small Compute Engine 仮想マシン(VM)をプロビジョニングします。Cloud Shell を使用する利点は次のとおりです。
Cloud Shell には、
gcloud
、kubectl
、git
、必要な他のコマンドライン ツールが含まれています。Cloud Shell の $HOME ディレクトリには 5 GB の永続ストレージ スペースがあります。
テキスト エディタを選択できます。
コードエディタ。Cloud Shell ウィンドウの上部にある edit をクリックしてアクセスします。
Emacs、Vim、Nano。Cloud Shell のコマンドラインからアクセスします。
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
ローカル PC
次のツールがインストールされていることを確認してください。
Google Cloud CLI で認証します。
gcloud auth login --project PROJECT_ID
コンポーネントを更新します。
gcloud components update
GKE クラスタを作成する
次のコマンドを実行して、Cloud Service Mesh に必要な最少数の vCPU でクラスタを作成します。コマンドのプレースホルダを次の情報に置き換えます。
- CLUSTER_NAME: クラスタの名前。 名前には、小文字の英数字と
-
のみを使用できます。先頭には英字、末尾には英数字を使用し、40 文字以下にする必要があります。 - PROJECT_ID: クラスタが作成されるプロジェクト ID。
- CLUSTER_LOCATION: クラスタのゾーン(
us-central1-a
など)。
gcloud container clusters create CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION \ --machine-type=e2-standard-4 \ --num-nodes=2 \ --workload-pool=PROJECT_ID.svc.id.goog
クラスタの作成には数分かかります。クラスタの作成中、
gcloud
コマンドから次の内容が出力されます。Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...working...
作成に成功すると、次のような出力が表示されます。
Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...done. Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME]. To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/CLUSTER_LOCATION/CLUSTER_NAME?project=PROJECT_ID kubeconfig entry generated for CLUSTER_NAME. NAME: CLUSTER_NAME LOCATION: CLUSTER_LOCATION MASTER_VERSION: 1.20.10-gke.1600 MASTER_IP: 198.51.100.1 MACHINE_TYPE: e2-standard-4 NODE_VERSION: 1.20.10-gke.1600 NUM_NODES: 2 STATUS: RUNNING
- CLUSTER_NAME: クラスタの名前。 名前には、小文字の英数字と
クラスタとやり取りするために必要な認証情報を取得します。
gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
予想される出力:
Fetching cluster endpoint and auth data. kubeconfig entry generated for CLUSTER_NAME.
kubectl
の現在のコンテキストをクラスタに設定します。kubectl config set-context CLUSTER_NAME
予想される出力:
Context "CLUSTER_NAME" created.
Cloud Service Mesh のプロビジョニング
クラスタを作成してからこのページを閉じていない場合、プレースホルダには、gcloud container clusters create
コマンドに入力した値が設定されています。
プロジェクトのフリートで Cloud Service Mesh を有効にします。
gcloud container fleet mesh enable --project PROJECT_ID
出力は次のようになります。
Waiting for Feature Service Mesh to be created...done.
プロジェクトのフリートにクラスタを登録します。
gcloud container fleet memberships register CLUSTER_NAME-membership \ --gke-cluster=CLUSTER_LOCATION/CLUSTER_NAME \ --enable-workload-identity \ --project PROJECT_ID
出力は次のようになります。
Waiting for membership to be created...done. Finished registering to the Fleet.
Fleet API を使用して、クラスタにマネージド Cloud Service Mesh をプロビジョニングします。
gcloud container fleet mesh update \ --management automatic \ --memberships CLUSTER_NAME-membership \ --project PROJECT_ID
出力は次のようになります。
Waiting for Feature Service Mesh to be updated...done.
クラスタでマネージド Cloud Service Mesh が有効になっており、使用可能な状態であることを確認します。
gcloud container fleet mesh describe --project PROJECT_ID
Cloud Service Mesh がプロビジョニングされ、クラスタで使用可能な状態になるまでに 10 分ほどかかることがあります。
controlPlaneManagement.state: DISABLED
またはcontrolPlaneManagement.state: PROVISIONING
が表示された場合は、controlPlaneManagement.state: ACTIVE
が表示されるまで、数分ごとに前のコマンドを再実行する必要があります。出力は次のようになります。
createTime: '2022-07-06T01:05:39.110120474Z' membershipSpecs: projects/123456789123/locations/global/memberships/your-cluster-membership: mesh: management: MANAGEMENT_AUTOMATIC membershipStates: projects/123456789123/locations/global/memberships/your-cluster-membership: servicemesh: controlPlaneManagement: details: - code: REVISION_READY details: 'Ready: asm-managed' state: ACTIVE dataPlaneManagement: details: - code: OK details: Service is running. state: ACTIVE state: code: OK description: 'Revision(s) ready for use: asm-managed.' updateTime: '2022-07-06T01:19:24.243993678Z' name: projects/your-project-id/locations/global/features/servicemesh resourceState: state: ACTIVE spec: {} state: state: {} updateTime: '2022-07-06T01:19:27.475885687Z'
サンプルコードをダウンロードする
このチュートリアルで使用するサンプルコードを含む git リポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git
このチュートリアルの以降のセクションでは、DIR_PATH 変数を使用します。クローンを作成した anthos-service-mesh-packages
リポジトリのパス(例: ./anthos-service-mesh-packages
)にこの変数を設定します。
Ingress ゲートウェイをデプロイする
Cloud Service Mesh では、サービス メッシュの一部としてゲートウェイをデプロイし、管理できます。ゲートウェイでは、メッシュのエッジで動作し、受信または送信 HTTP / TCP 接続を処理するロードバランサを記述します。ゲートウェイは、メッシュ内外に送信されるトラフィックをきめ細かく制御する Envoy プロキシです。
Ingress ゲートウェイの名前空間をまだ作成していない場合は作成します。ゲートウェイはユーザー ワークロードであり、コントロール プレーンの名前空間にデプロイすることはおすすめしません。
GATEWAY_NAMESPACE
は、名前空間の名前に置き換えます。kubectl create namespace GATEWAY_NAMESPACE
予想される出力:
namespace/GATEWAY_NAMESPACE created
ゲートウェイで自動挿入を有効にします。必要な手順は、ゲートウェイの名前空間でデフォルトのインジェクション ラベル(例:
istio-injection=enabled
)とリビジョン ラベルのどちらを使用するかによって異なります。デフォルトのリビジョンタグとリビジョン ラベルは、サイドカー インジェクタ Webhook によって使用され、挿入されたプロキシを特定のコントロール プレーンのリビジョンに関連付けます。デフォルトのインジェクション ラベル
デフォルトのインジェクション ラベルを名前空間に適用します。
kubectl label namespace GATEWAY_NAMESPACE istio-injection=enabled istio.io/rev-
リビジョン ラベル
次のコマンドを使用して、
istiod
のリビジョン ラベルを探します。kubectl get deploy -n istio-system -l app=istiod -o \ "jsonpath={.items[*].metadata.labels['istio\.io/rev']}{'\n'}"
このコマンドは、Cloud Service Mesh バージョンに対応するリビジョン ラベル(例:
asm-1232-2
)を出力します。リビジョン ラベルを名前空間に適用します。次のコマンドで、
REVISION
は前の手順でメモしたistiod
リビジョン ラベルの値です。kubectl label namespace GATEWAY_NAMESPACE \ istio.io/rev=REVISION --overwrite
予想される出力:
namespace/GATEWAY_NAMESPACE labeled
出力中のメッセージ
"istio.io/rev" not found
は無視します。これは、今までは名前空間にistio.io/rev
ラベルが付加されていなかったことを示しており、Cloud Service Mesh の新規インストールまたは新規デプロイで想定されることです。名前空間にistio.io/rev
とistio-injection
の両方のラベルがあると自動挿入が失敗するため、Cloud Service Mesh ドキュメント内のすべてのkubectl label
コマンドで両方のラベルを明示的に指定します。ゲートウェイの名前空間にラベルが付いていない場合、ゲートウェイが
auto
イメージを pull するときにistio-ingressgateway
Pod がImagePullBackOff
エラーで失敗します。このイメージは Webhook で置き換える必要があります。anthos-service-mesh-packages
リポジトリからサンプルの Ingress ゲートウェイ .yaml 構成ファイルをダウンロードします。サンプルの Ingress ゲートウェイ .yaml 構成をそのまま適用するか、必要に応じて変更します。
kubectl apply -n GATEWAY_NAMESPACE \ -f CONFIG_PATH/istio-ingressgateway
予想される出力:
deployment.apps/istio-ingressgateway created poddisruptionbudget.policy/istio-ingressgateway created horizontalpodautoscaler.autoscaling/istio-ingressgateway created role.rbac.authorization.k8s.io/istio-ingressgateway created rolebinding.rbac.authorization.k8s.io/istio-ingressgateway created service/istio-ingressgateway created serviceaccount/istio-ingressgateway created
ゲートウェイのベスト プラクティスの詳細を確認してください。
Online Boutique のサンプルをデプロイする
anthos-service-mesh-packages
リポジトリの Online Boutique サンプル アプリケーションは、microservices-demo
リポジトリの元のマニフェスト セットから変更されています。ベスト プラクティスに従い、各サービスは、一意のサービス アカウントを持つ個別の名前空間にデプロイします。
アプリケーションの名前空間を作成します。
kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
予想される出力:
namespace/ad created namespace/cart created namespace/checkout created namespace/currency created namespace/email created namespace/frontend created namespace/loadgenerator created namespace/payment created namespace/product-catalog created namespace/recommendation created namespace/shipping created
自動サイドカー インジェクション(自動挿入)を有効にします。必要なコマンドは、デフォルトのインジェクション ラベル(
istio-injection=enabled
など)、または、Ingress ゲートウェイ名前空間にアノテーションを付けるのに使用したリビジョン ラベルのどちらを使用するかによって異なります。デフォルトのインジェクション ラベル
デフォルトのインジェクション ラベルを名前空間に適用します。 次のコマンドで、GATEWAY_NAMESPACE は、Ingress ゲートウェイ名前空間にアノテーションを付ける際に使用した値です。
for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns istio-injection=enabled istio.io/rev- done;
予想される出力:
namespace/ad labeled namespace/cart labeled namespace/checkout labeled namespace/currency labeled namespace/email labeled namespace/frontend labeled namespace/loadgenerator labeled namespace/payment labeled namespace/product-catalog labeled namespace/recommendation labeled namespace/shipping labeled
リビジョン ラベル
アプリケーションの名前空間にリビジョン ラベルを適用します。次のコマンドで、REVISION は、Ingress ゲートウェイ名前空間にアノテーションを付ける際に使用した値と同じです。
for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns istio.io/rev=REVISION --overwrite done;
予想される出力:
namespace/ad labeled namespace/cart labeled namespace/checkout labeled namespace/currency labeled namespace/email labeled namespace/frontend labeled namespace/loadgenerator labeled namespace/payment labeled namespace/product-catalog labeled namespace/recommendation labeled namespace/shipping labeled
サンプル アプリケーションをクラスタにデプロイします。
サービス アカウントとデプロイを作成します。
kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/deployments
予想される出力:
serviceaccount/ad created deployment.apps/adservice created serviceaccount/cart created deployment.apps/cartservice created serviceaccount/checkout created deployment.apps/checkoutservice created serviceaccount/currency created deployment.apps/currencyservice created serviceaccount/email created deployment.apps/emailservice created serviceaccount/frontend created deployment.apps/frontend created serviceaccount/loadgenerator created deployment.apps/loadgenerator created serviceaccount/payment created deployment.apps/paymentservice created serviceaccount/product-catalog created deployment.apps/productcatalogservice created serviceaccount/recommendation created deployment.apps/recommendationservice created serviceaccount/shipping created deployment.apps/shippingservice created
サービスを作成します。
kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/services
予想される出力:
service/adservice created service/cartservice created service/checkoutservice created service/currencyservice created service/emailservice created service/frontend created service/frontend-external created service/paymentservice created service/productcatalogservice created service/recommendationservice created service/shippingservice created
サービス エントリを作成します。
kubectl apply -f \ DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
予想される出力:
serviceentry.networking.istio.io/allow-egress-googleapis created serviceentry.networking.istio.io/allow-egress-google-metadata created
アプリケーションの公開とアクセス
アプリケーションを公開するには、いくつかの方法があります。このガイドでは、上記でデプロイした Ingress ゲートウェイを使用します。Online Boutique アプリケーションを公開するその他の方法については、Online Boutique サンプル アプリケーションのデプロイガイドの アプリケーションの公開とアクセスのセクションをご覧ください。
フロントエンド サービス用の
Gateway
とVirtualService
をデプロイしますkubectl apply -f \ DIR_PATH/samples/online-boutique/istio-manifests/frontend-gateway.yaml
予想される出力:
gateway.networking.istio.io/frontend-gateway created virtualservice.networking.istio.io/frontend-ingress created
Ingress ゲートウェイの外部 IP アドレスを取得します。プレースホルダは次の情報に置き換えます。
- GATEWAY_SERVICE_NAME: Ingress ゲートウェイ サービスの名前。変更せずにサンプル ゲートウェイをデプロイした場合は、
istio-ingressgateway
になります。 - GATEWAY_NAMESPACE: Ingress ゲートウェイをデプロイした名前空間。
kubectl get service GATEWAY_SERVICE_NAME \ -n GATEWAY_NAMESPACE
出力は次のようになります。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.19.247.233 35.239.7.64 80:31380/TCP,443:31390/TCP,31400:31400/TCP 27m
この例では、Ingress ゲートウェイの IP アドレスは
35.239.7.64
です。- GATEWAY_SERVICE_NAME: Ingress ゲートウェイ サービスの名前。変更せずにサンプル ゲートウェイをデプロイした場合は、
ブラウザでアプリケーションに移動して、インストールを確認します。
http://EXTERNAL_IP/
サービス メッシュ ダッシュボードを表示する
サイドカー プロキシが挿入されたクラスタにワークロードをデプロイすると、Google Cloud コンソールの Cloud Service Mesh ページで、Cloud Service Mesh が提供するすべてのオブザーバビリティ機能を確認できます。ワークロードをデプロイした後、Google Cloud コンソールにテレメトリー データが表示されるまでに 1~2 分ほどかかることがあります。
Google Cloud コンソールでの Cloud Service Mesh へのアクセスは、Identity and Access Management(IAM)によって制御されます。Cloud Service Mesh ページにアクセスするには、プロジェクト オーナーがユーザーに対して、プロジェクト編集者または閲覧者のロール、または、より限定的なロール(Google Cloud コンソールでの Cloud Service Mesh に対するアクセス制御を参照)を付与する必要があります。
Google Cloud コンソールで、[Cloud Service Mesh] に移動します。
メニューバーのプルダウン リストから Google Cloud プロジェクトを選択します。
複数のサービス メッシュがある場合は、[サービス メッシュ] プルダウン リストからメッシュを選択します。
詳細については、Google Cloud コンソールでの Cloud Service Mesh の確認をご覧ください。
クリーンアップ
クリーンアップの前に、相互 TLS の詳細を確認される場合は、Cloud Service Mesh の例: mTLS をご覧ください。
クラスタを維持して Online Boutique のサンプルを削除するには:
アプリケーションの名前空間を削除します。
kubectl delete -f DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
予想される出力:
namespace "ad" deleted namespace "cart" deleted namespace "checkout" deleted namespace "currency" deleted namespace "email" deleted namespace "frontend" deleted namespace "loadgenerator" deleted namespace "payment" deleted namespace "product-catalog" deleted namespace "recommendation" deleted namespace "shipping" deleted
サービス エントリを削除します。
kubectl delete -f DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
予想される出力:
serviceentry.networking.istio.io "allow-egress-googleapis" deleted serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
追加料金の発生を回避するには、クラスタを削除します。
次のコマンドを実行します。
gcloud container clusters delete CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
[Do you want to continue (Y/n)?] というプロンプトが表示されたら「y」と入力します。
数分後、次の出力が表示されます。
Deleting cluster CLUSTER_NAME...done. Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME].
次のステップ
- マネージド Cloud Service Mesh の詳細については、マネージド Cloud Service Mesh のプロビジョニングをご覧ください。
- このチュートリアルで使用する gcloud CLI の簡単な概要については、
gcloud
コマンドをご覧ください。 - Google Cloud コンソールで Cloud Service Mesh を確認する方法については、Google Cloud コンソールで Cloud Service Mesh を確認するをご覧ください。
- Cloud Trace、Distroless プロキシ イメージ、エンドユーザー認証などの Cloud Service Mesh オプション機能については、マネージド Cloud Service Mesh でオプション機能を有効にするをご覧ください。
- Cloud Service Mesh のセキュリティの詳細については、Cloud Service Mesh セキュリティの概要と Cloud Service Mesh セキュリティのベスト プラクティスをご覧ください。
- Cloud Service Mesh のテレメトリーの詳細については、オブザーバビリティの概要をご覧ください。