Online Boutique のサンプル アプリケーションのデプロイ

このガイドでは、Cloud Service Mesh のデモのために、Online Boutique のサンプル アプリケーションをデプロイする方法について説明します。Cloud Service Mesh をまだインストールしていない場合は、インストール ガイドをご覧ください。

サンプルのダウンロードとデプロイ

アプリケーションをデプロイするには、まず kpt を使用して、anthos-service-mesh-packages リポジトリから Online Boutique マニフェストをダウンロードする必要があります。anthos-service-mesh-packages リポジトリの Online Boutique サンプル アプリケーションは、microservices-demo リポジトリの元のマニフェスト セットから変更されています。ベスト プラクティスに従い、各サービスは、一意のサービス アカウントを持つ個別の名前空間にデプロイします。

  1. まだインストールしていない場合は、kpt をインストールします。

    gcloud components install kpt
    
  2. 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).
    
  3. online-boutique ディレクトリに移動します。

    cd online-boutique
    
  4. アプリケーションの名前空間を作成します。

    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
    
  5. サンプルをクラスタにデプロイします。

    1. サービス アカウントとデプロイを作成します。

      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
      
    2. サービスを作成します。

      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
      
    3. サービス エントリを作成します。

      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
      

自動サイドカー インジェクションを有効にする

自動挿入を有効にするには、デフォルトのインジェクション ラベルを使用して名前空間にラベルを付けるか(デフォルトのタグを設定した場合)、リビジョン ラベルを名前空間に追加します。追加するラベルは、マネージド Cloud Service Mesh をデプロイしたか、クラスタ内コントロール プレーンをインストールしたかによって異なります。ラベルは、サイドカー インジェクタ Webhook によって、挿入されたサイドカーを特定のコントロール プレーン リビジョンに関連付けるのに使用されます。

クラスタ内

  1. 次のコマンドを使用して、istiod のラベルを探します。

    kubectl get deploy -n istio-system -l app=istiod -o \
      jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
    

    このコマンドは、Cloud Service Mesh バージョンに対応するリビジョン ラベル(例: asm-11910-9)を出力します。

  2. アプリケーションの名前空間にリビジョン ラベルを適用します。次のコマンドで、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
    
  3. 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
    

マネージド サービス メッシュ

  1. アプリケーションの名前空間にリビジョン ラベルを適用します。次のコマンドの REVISION ラベルは、マネージド Cloud Service Mesh リリース チャンネルの値(Regular の場合は asm-managed、Rapid の場合は asm-managed-rapid、Stable の場合は asm-managed-stable)にする必要があります。

    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
    
  2. また、オプションの マネージド データプレーンもデプロイした場合、次のようにアプリケーションの名前空間にアノテーションを設定します。

    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;
    
  3. 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 ゲートウェイをクラスタにデプロイした場合は、そのゲートウェイを使用して次の手順でアプリケーションを公開します。

  1. フロントエンド サービス用の GatewayVirtualService をデプロイします

    kubectl apply -f istio-manifests/frontend-gateway.yaml
    

    予想される出力:

    gateway.networking.istio.io/frontend-gateway created
    virtualservice.networking.istio.io/frontend-ingress created
    
  2. 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 です。

  3. ブラウザでアプリケーションに移動して、インストールを確認します。

    http://EXTERNAL_IP/
    

Ingress ゲートウェイなし

Ingress ゲートウェイをデプロイしていない場合、または Kubernetes Service を使用してアプリケーションを公開することを選択した場合は、次の手順を行います。

  1. LoadBalancer タイプの Service をデプロイして、フロントエンド サービスを公開します。

    kubectl apply -f frontend-external.yaml
    
  2. frontend-external サービスの外部 IP アドレスを探します。

    kubectl get service frontend-external -n frontend
    
  3. ブラウザでアプリケーションに移動して、インストールを確認します。

    http://EXTERNAL_IP/
    

Google Cloud コンソールで Cloud Service Mesh のオブザーバビリティ機能を確認できます。トポロジグラフがメッシュに表示されるまで、最長で 10 分かかることがあります。

クリーンアップ

Online Boutique を削除する前に、サンプルを使用する Cloud Service Mesh の例: mTLS を確認することをおすすめします。確認が完了したら、次のコマンドを使用して Online Boutique のサンプルを削除します。

  1. アプリケーションの名前空間を削除します。

    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
    
  2. サービス エントリを削除します。

    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
    

次のステップ