このガイドでは、Anthos Service Mesh のデモのために、Online Boutique のサンプル アプリケーションをデプロイする方法について説明します。Anthos Service Mesh をまだインストールしていない場合は、インストール ガイドをご覧ください。
サンプルのダウンロードとデプロイ
アプリケーションをデプロイするには、まず kpt
を使用して、anthos-service-mesh-packages
リポジトリから Online Boutique マニフェストをダウンロードする必要があります。anthos-service-mesh-packages
リポジトリの Online Boutique サンプル アプリケーションは、microservices-demo
リポジトリの元のマニフェスト セットから変更されています。ベスト プラクティスに従い、各サービスは、一意のサービス アカウントを持つ個別の名前空間にデプロイします。
まだインストールしていない場合は、
kpt
をインストールします。gcloud components install kpt
kpt
を使用してサンプルをダウンロードします。kpt pkg get \ https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/samples/online-boutique \ online-boutique
予想される出力
Package "online-boutique": Fetching https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages@main From https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages * branch main -> FETCH_HEAD Adding package "samples/online-boutique". Fetched 1 package(s).
online-boutique
ディレクトリに移動します。cd online-boutique
アプリケーションの名前空間を作成します。
kubectl apply -f 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
サンプルをクラスタにデプロイします。
サービス アカウントとデプロイを作成します。
kubectl apply -f 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 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 istio-manifests/allow-egress-googleapis.yaml
予想される出力:
serviceentry.networking.istio.io/allow-egress-googleapis created serviceentry.networking.istio.io/allow-egress-google-metadata created
自動サイドカー インジェクションを有効にする
自動挿入を有効にするには、デフォルトのインジェクション ラベルを使用して名前空間にラベルを付けるか(デフォルトのタグを設定した場合)、リビジョン ラベルを名前空間に追加します。追加するラベルは、マネージド Anthos Service Mesh をデプロイしたか、クラスタ内コントロール プレーンをインストールしたかによって異なります。ラベルは、サイドカー インジェクタ Webhook によって、挿入されたサイドカーを特定のコントロール プレーン リビジョンに関連付けるのに使用されます。
クラスタ内
次のコマンドを使用して、
istiod
のラベルを探します。kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
このコマンドは、Anthos Service Mesh バージョンに対応するリビジョン ラベル(例:
asm-1129-3
)を出力します。アプリケーションの名前空間にリビジョン ラベルを適用します。次のコマンドで、REVISION は前の手順でメモした
istiod
リビジョン ラベルの値です。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
Pod を再起動します。
for ns in ad cart checkout currency email frontend loadgenerator \ payment product-catalog recommendation shipping; do kubectl rollout restart deployment -n ${ns} done;
予想される出力:
deployment.apps/adservice restarted deployment.apps/cartservice restarted deployment.apps/checkoutservice restarted deployment.apps/currencyservice restarted deployment.apps/emailservice restarted deployment.apps/frontend restarted deployment.apps/loadgenerator restarted deployment.apps/paymentservice restarted deployment.apps/productcatalogservice restarted deployment.apps/recommendationservice restarted deployment.apps/shippingservice restarted
マネージド サービス メッシュ
アプリケーションの名前空間にリビジョン ラベルを適用します。次のコマンドの REVISION ラベルは、
asmcli
をプロビジョニングしたときに指定した--channel
の値である必要があります。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
また、オプションのマネージド データプレーンもデプロイした場合、次のようにアプリケーションの名前空間にアノテーションを設定します。
for ns in ad cart checkout currency email frontend loadgenerator \ payment product-catalog recommendation shipping; do kubectl annotate --overwrite namespace $ns mesh.cloud.google.com/proxy='{"managed":"true"}' done;
Pod を再起動します。
for ns in ad cart checkout currency email frontend loadgenerator \ payment product-catalog recommendation shipping; do kubectl rollout restart deployment -n ${ns} done;
予想される出力:
deployment.apps/adservice restarted deployment.apps/cartservice restarted deployment.apps/checkoutservice restarted deployment.apps/currencyservice restarted deployment.apps/emailservice restarted deployment.apps/frontend restarted deployment.apps/loadgenerator restarted deployment.apps/paymentservice restarted deployment.apps/productcatalogservice restarted deployment.apps/recommendationservice restarted deployment.apps/shippingservice restarted
アプリケーションの公開とアクセス
アプリケーションをメッシュ外に公開する方法は、Ingress ゲートウェイをデプロイしたかどうかによって異なります。アプリケーションの公開には、Istio Ingress ゲートウェイか、Kubernetes Service の使用を選択できます。
Ingress ゲートウェイの使用
Ingress ゲートウェイをクラスタにデプロイした場合は、そのゲートウェイを使用して次の手順でアプリケーションを公開します。
フロントエンド サービス用の
Gateway
とVirtualService
をデプロイしますkubectl apply -f 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 ゲートウェイ サービスの名前。サンプル ゲートウェイをそのままデプロイしたか、デフォルトの Ingress ゲートウェイをデプロイした場合、名前は
istio-ingressgateway
になります。GATEWAY_NAMESPACE: Ingress ゲートウェイをデプロイした名前空間。デフォルトの Ingress ゲートウェイをデプロイした場合、名前空間は
istio-system
です。
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
です。ブラウザでアプリケーションに移動して、インストールを確認します。
http://EXTERNAL_IP/
Ingress ゲートウェイなし
Ingress ゲートウェイをデプロイしていない場合や、Kubernetes Service を使用してアプリケーションを公開することを選択した場合は、次の手順を行います。
LoadBalancer
タイプの Service をデプロイして、フロントエンド サービスを公開します。kubectl apply -f frontend-external.yaml
frontend-external
サービスの外部 IP アドレスを探します。kubectl get service frontend-external -n frontend
ブラウザでアプリケーションに移動して、インストールを確認します。
http://EXTERNAL_IP/
GKE の場合、Google Cloud コンソールで Anthos Service Mesh のオブザーバビリティ機能を確認できます。トポロジグラフがメッシュに表示されるまで、最長で 10 分かかることがあります。
クリーンアップ
Online Boutique を削除する前に、サンプルを使用する Anthos Service Mesh の例: mTLS を確認することをおすすめします。確認が完了したら、次のコマンドを使用して Online Boutique のサンプルを削除します。
アプリケーションの名前空間を削除します。
kubectl delete -f 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 istio-manifests/allow-egress-googleapis.yaml
予想される出力:
serviceentry.networking.istio.io "allow-egress-googleapis" deleted serviceentry.networking.istio.io "allow-egress-google-metadata" deleted