このガイドでは、Google Kubernetes Engine(GKE)Autopilot クラスタでマネージド Cloud Service Mesh を設定する方法について説明します。Cloud Service Mesh は、Istio をベースとしたフルマネージド サービス メッシュです。
このチュートリアルでは、デフォルト設定の単一の GKE Autopilot クラスタで動作するプロダクション レディなサービス メッシュを構成する方法について説明します。環境を設計する際は、Cloud Service Mesh プロビジョニング ガイドを詳細に確認することもおすすめします。
GKE Autopilot でマネージド Cloud Service Mesh を実行するメリット
Autopilot モードで GKE を使用すると、Google によりクラスタの設定と管理が自動的に処理されます。Autopilot モードでは、クラスタの運用が効率化され、アプリケーションに集中できます。同様に、マネージド Cloud Service Mesh は、数ステップでプロビジョニングできるフルマネージド サービス メッシュです。
- マネージド Cloud Service Mesh は、Fleet API を使用してプロビジョニングできます(
istioctlなどのクライアントサイド ツールは必要ありません)。 - Cloud Service Mesh では、昇格した権限をコンテナに付与しなくても、サイドカー プロキシがワークロードに自動的に挿入されます。
- 追加の構成なしでメッシュとサービスの詳細なダッシュボードを表示し、その指標を使用することでサービスレベル目標(SLO)とアラートを構成して、アプリケーションの健全性をモニタリングできます。
- マネージド Cloud Service Mesh コントロール プレーンは自動的にアップグレードされ、最新のセキュリティ パッチと機能を確実に利用できます。
- Cloud Service Mesh マネージド データプレーンは、ワークロードのサイドカー プロキシを自動的にアップグレードするため、プロキシのアップグレードとセキュリティ パッチが利用可能になったときに、サービスを自分で再起動する必要がありません。
- Cloud Service Mesh はサポートされているプロダクトであり、標準のオープンソースの Istio API を使用して構成できます。サポートされている機能をご覧ください。
環境の設定
環境の設定には gcloud CLI または Terraform を使用します。
gcloud
環境変数を設定します。
PROJECT_ID=PROJECT_ID gcloud config set project ${PROJECT_ID}Mesh API を有効にします。
gcloud services enable mesh.googleapis.commesh.googleapis.com を有効にして API を有効にする
API 目的 無効化が可能か meshconfig.googleapis.comCloud Service Mesh は、Mesh Configuration API を使用して、メッシュから Google Cloudに構成データをリレーします。また、Mesh Configuration API を有効にすると、 Google Cloud コンソールの Cloud Service Mesh のページにアクセスして、Cloud Service Mesh 認証局を使用できます。 × meshca.googleapis.comマネージド Cloud Service Mesh で使用される Cloud Service Mesh 認証局に関連します。 × container.googleapis.comGoogle Kubernetes Engine(GKE)クラスタを作成するために必要です。 × gkehub.googleapis.comメッシュをフリートとして管理するために必要です。 × monitoring.googleapis.comメッシュ ワークロードのテレメトリーをキャプチャするために必要です。 × stackdriver.googleapis.comService UI を使用するために必要です。 × opsconfigmonitoring.googleapis.comGoogle Cloud外のクラスタで Service UI を使用するために必要です。 × connectgateway.googleapis.comマネージド Cloud Service Mesh コントロール プレーンがメッシュ ワークロードにアクセスできるようにするために必要です。 ○* trafficdirector.googleapis.com高可用性でスケーラブルなマネージド コントロール プレーンを実現します。 ○* networkservices.googleapis.com高可用性でスケーラブルなマネージド コントロール プレーンを実現します。 ○* networksecurity.googleapis.com高可用性でスケーラブルなマネージド コントロール プレーンを実現します。 ○*
Terraform
gcloud config set project PROJECT_ID
GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
export GOOGLE_CLOUD_PROJECT
GKE クラスタを作成する
Autopilot モードで GKE クラスタを作成する
gcloud
フリートのメンバーとして登録されたクラスタを作成します。
gcloud container clusters create-auto asm-cluster \ --location="us-central1" \ --enable-fleetクラスタがフリートに登録されていることを確認します。
gcloud container fleet memberships list出力は次のようになります。
NAME: asm-cluster EXTERNAL_ID: LOCATION: us-central1Cloud Service Mesh を構成するうえで必要になるため、メンバーシップ名をメモします。
Terraform
GKE クラスタの作成には google_container_cluster リソースを使用します。クラスタの作成時にクラスタがフリートに追加されるように、fleet ブロックを設定します。
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
マネージド Cloud Service Mesh をプロビジョニングする
クラスタのフリート メンバーで、servicemesh 機能を使用して、マネージド Cloud Service Mesh をプロビジョニングします。
gcloud
プロジェクトで、Cloud Service Mesh のフリート機能を有効にします。
gcloud container fleet mesh enableメッシュの自動管理を有効にします。
gcloud container fleet mesh update \ --management=automatic \ --memberships=MEMBERSHIP_NAME \ --location=us-central1MEMBERSHIP_NAMEは、クラスタがフリートに登録されていることを確認した際に表示されたメンバーシップ名に置き換えます。
Terraform
Mesh API を有効にするには、google_project_service リソースを使用します。
google_gke_hub_feature リソースと google_gke_hub_feature_membership リソースを使用して、クラスタでマネージド Cloud Service Mesh を構成します。
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
コントロール プレーンがアクティブであることを確認する
controlPlaneManagement.state が ACTIVE になるまで待ちます。この処理には 15 分ほどかかる場合があります。
watch -n 30 gcloud container fleet mesh describe
出力は次のようになります。
membershipSpecs:
projects/746296320118/locations/us-central1/memberships/asm-cluster:
mesh:
management: MANAGEMENT_AUTOMATIC
membershipStates:
projects/746296320118/locations/us-central1/memberships/asm-cluster:
servicemesh:
controlPlaneManagement:
details:
- code: REVISION_READY
details: 'Ready: asm-managed'
state: ACTIVE
dataPlaneManagement:
details:
- code: PROVISIONING
details: Service is provisioning.
state: PROVISIONING
state:
code: OK
description: 'Revision(s) ready for use: asm-managed.'
Autopilot クラスタはワークロードをデプロイするまでノードをプロビジョニングしないため、上り(内向き)ゲートウェイをデプロイするまで、dataPlaneManagement セクションは PROVISIONING 状態のままです。
メッシュの上り(内向き)ゲートウェイをデプロイする
このセクションでは、サンプル アプリケーションの受信トラフィックを処理するために、メッシュの上り(内向き)ゲートウェイをデプロイします。上り(内向き)ゲートウェイは、メッシュのエッジで動作するロードバランサで、受信または送信 HTTP / TCP 接続を処理します。
ゲートウェイを専用の Namespace にデプロイしてその Deployment にラベルを付け、Cloud Service Mesh コントロール プレーンによって安全に管理され、自動的にアップグレードされるようにします。
クラスタにアクセスできるように認証情報をダウンロードします。
gcloud container clusters get-credentials asm-cluster --location=us-central1ゲートウェイのデプロイ用の Namespace を作成します。
kubectl create namespace bank-gatewaysCloud Service Mesh コントロール プレーンによってゲートウェイ構成がデプロイに自動的に挿入されるように、Namespace にラベルを追加します。
kubectl label namespace bank-gateways istio-injection=enabled上り(内向き)ゲートウェイを Namespace にデプロイします。
Helm
helm repo add istio https://istio-release.storage.googleapis.com/charts helm repo update helm install --wait --namespace bank-gateways \ --set resources.requests.cpu=250m \ --set resources.requests.memory=512Mi \ --set resources.requests.ephemeral-storage=1Gi \ --set resources.limits.cpu=250m \ --set resources.limits.memory=512Mi \ --set resources.limits.ephemeral-storage=1Gi \ istio-ingressgateway istio/gatewaykubectl
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages kubectl apply -n bank-gateways \ -f ./anthos-service-mesh-packages/samples/gateways/istio-ingressgateway kubectl -n bank-gateways wait "deployment/istio-ingressgateway" \ --for=condition=available --timeout=240s本番環境にデプロイする場合は、適切なリソース リクエストを設定してください。GKE Autopilot は、
requestsに設定されたリソース値のみを考慮します(limitsではありません)。Istio プロジェクトでは、パフォーマンスとスケーラビリティに関する情報を公開しています。
サンプル アプリケーションをデプロイする
デプロイ用の Kubernetes の Namespace を作成します。
kubectl create namespace bank-sampleCloud Service Mesh によりサンプル Pod にサイドカー プロキシが自動的に挿入されるように、Namespace にラベルを追加します。
kubectl label namespace bank-sample istio-injection=enabledサンプル アプリケーションをデプロイします。
git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git kubectl apply -n bank-sample -f bank-of-anthos/extras/jwt/jwt-secret.yaml kubectl apply -n bank-sample -f bank-of-anthos/kubernetes-manifests/アプリケーションの準備ができるまで待ちます。これには数分かかります。
watch kubectl -n bank-sample get podsアプリケーションの準備が整うと、出力は次のようになります。
NAME READY STATUS RESTARTS AGE accounts-db-0 2/2 Running 0 2m16s balancereader-5c695f78f5-x4wlz 2/2 Running 0 3m8s contacts-557fc79c5-5d7fg 2/2 Running 0 3m7s frontend-7dd589c5d7-b4cgq 2/2 Running 0 3m7s ledger-db-0 2/2 Running 0 3m6s ledgerwriter-6497f5cf9b-25c6x 2/2 Running 0 3m5s loadgenerator-57f6896fd6-lx5df 2/2 Running 0 3m5s transactionhistory-6c498965f-tl2sk 2/2 Running 0 3m4s userservice-95f44b65b-mlk2p 2/2 Running 0 3m4sIstio の
GatewayリソースとVirtualServiceリソースを作成して、上り(内向き)ゲートウェイの背後にあるアプリケーションを公開します。kubectl apply -n bank-sample -f bank-of-anthos/extras/istio/frontend-ingress.yamlサンプル アプリケーションへのリンクを取得します。
INGRESS_HOST=$(kubectl -n bank-gateways get service istio-ingressgateway \ -o jsonpath='{.status.loadBalancer.ingress[0].ip}') echo "http://$INGRESS_HOST"ブラウザで、リンクをクリックしてサンプル アプリケーションを開きます。デフォルトのユーザー名とパスワードでログインしてアプリケーションを表示します。
相互 TLS を適用する
STRICT 相互 TLS(mTLS)モードが有効になっていることを確認します。メッシュのデフォルトの PeerAuthentication ポリシーを istio-system Namespace に適用します。
次のマニフェストを
mesh-peer-authn.yamlとして保存します。apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "default" namespace: "istio-system" spec: mtls: mode: STRICTマニフェストをクラスタに適用します。
kubectl apply -f mesh-peer-authn.yaml
この構成をオーバーライドするには、特定の Namespace に PeerAuthentication リソースを作成します。
Cloud Service Mesh ダッシュボードを確認する
Google Cloud コンソールで [Cloud Service Mesh] に移動し、メッシュのダッシュボードを表示します。
メニューバーのプルダウン リストからプロジェクトを選択します。
メッシュにあるすべてのマイクロサービスを含む概要の表が表示され、マイクロサービス間の接続が図示されます。各マイクロサービスについて、この表には SRE の「ゴールデン シグナル」のうち 3 つが表示されます。
- トラフィック - 1 秒あたりのリクエスト数
- エラー率 - パーセンテージ
- レイテンシ - ミリ秒
これらの指標は、マイクロサービスによって処理される実際のトラフィックに基づいています。
frontendService には、サンプル アプリケーションの一部としてデプロイされたloadgeneratorクライアントによって、定常的なテスト トラフィックが自動的に送信されます。Cloud Service Mesh は、指標、ログ、トレース(オプション)を Google Cloud Observability に自動的に送信します。表内の
frontendサービスをクリックすると、サービスの概要ダッシュボードが表示されます。サービスの追加指標に加え、インバウンド接続とアウトバウンド接続のビジュアリゼーションが表示されます。また、サービスのモニタリングとアラート用に、サービスレベル オブジェクト(SLO)を作成することもできます。
mTLS が有効になっていることを確認する
パネルのセキュリティ リンクをクリックすると、frontend サービスのセキュリティの概要が表示されます。表とビジュアリゼーションには、マイクロサービス間のインバウンド接続とアウトバウンド接続のそれぞれに緑色の鍵アイコンが表示されます。このアイコンは、接続が認証と暗号化に mTLS を使用していることを示します。