Bookinfo サンプルのデプロイ

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

Cloud Service Mesh をインストールすると、いくつかのサンプル アプリケーションがインストールされます。このガイドでは、BookInfo サンプルをデプロイする方法について説明します。これはシンプルなモック ブックストア アプリケーションで、商品のウェブページ、書籍の詳細、レビュー(レビュー Service は複数のバージョンを使用)、評価を提供する 4 つの Service で構成されます。これらはすべて Cloud Service Mesh で管理されます。この例で使用されているソースコードなどのすべてのファイルは、samples/bookinfo の Cloud Service Mesh インストール ディレクトリにあります。

サイドカーの自動インジェクションの有効化

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

マネージド

  1. 名前空間には、デフォルトのインジェクション ラベルまたはリビジョン ラベルを使用できます

    デフォルトのインジェクション ラベル

    デフォルトのインジェクション ラベルを名前空間に適用します。

    kubectl label namespace NAMESPACE istio-injection=enabled istio.io/rev-
    

    リビジョン ラベル

    アプリケーションをデプロイする前に、名前空間から以前の istio-injection ラベルを削除し、代わりに istio.io/rev=REVISION_LABEL ラベルを設定します。

    特定のリビジョン ラベルに変更するには、REVISION_LABEL をクリックし、該当するラベル(Rapid チャネルの場合は asm-managed-rapid、Regular チャネルの場合は asm-managed、チャネルの安定性の場合はasm-managed-stable)に置き換えます。

    リビジョン ラベルはリリース チャンネルに対応しています。

    リビジョン ラベル チャネル
    asm-managed Regular
    asm-managed-rapid Rapid
    asm-managed-stable Stable
    kubectl label namespace NAMESPACE istio-injection- istio.io/rev=REVISION_LABEL --overwrite
    
  2. オプションのマネージド データプレーンをデプロイした場合、次のように NAMESPACE 名前空間にアノテーションを設定します。

    kubectl annotate --overwrite namespace NAMESPACE \
    mesh.cloud.google.com/proxy='{"managed":"true"}'
    

クラスタ内

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

    kubectl -n istio-system get pods -l app=istiod --show-labels
    

    出力は次のようになります。

    NAME                                READY   STATUS    RESTARTS   AGE   LABELS
    istiod-asm-173-3-5788d57586-bljj4   1/1     Running   0          23h   app=istiod,istio.io/rev=asm-11910-9,istio=istiod,pod-template-hash=5788d57586
    istiod-asm-173-3-5788d57586-vsklm   1/1     Running   1          23h   app=istiod,istio.io/rev=asm-11910-9,istio=istiod,pod-template-hash=5788d57586
    

    出力の LABELS 列で、接頭辞 istio.io/rev= に続く istiod リビジョン ラベルの値をメモします。この例での値は asm-11910-9 です。

  2. リビジョン ラベルをデフォルトの名前空間に適用します。次のコマンドにおいて、REVISION は前の手順でメモした istiod リビジョン ラベルの値です。

    kubectl label namespace default istio-injection- istio.io/rev=REVISION --overwrite
    

    出力内のメッセージ "istio-injection not found" は無視してかまいません。このメッセージは、今までは Namespace に istio-injection ラベルが付いていなかったことを意味しており、Cloud Service Mesh の新規インストールや新規デプロイでは想定される状態です。Namespace に istio-injection とリビジョン ラベルの両方があると自動インジェクションの動作は未定義になるため、Cloud Service Mesh ドキュメント内のすべての kubectl label コマンドでは、一方のみを明示的に設定するようにしています。

アプリケーションのデプロイ

これで、default Namespace で自動インジェクションが有効になりました。BookInfo アプリケーションの Service をデプロイすると、各 Service と一緒にサイドカー プロキシが挿入されます。

  1. Cloud Service Mesh をインストールしたコンピュータのコマンドラインで Cloud Service Mesh のインストール ディレクトリのルートに移動します。必要に応じて、インストール ファイルをダウンロードしてください。

  2. kubectl を使用してアプリケーションをデフォルトの名前空間にデプロイします。

    kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
    
  3. 次のコマンドを実行して、アプリケーションが正しくデプロイされていることを確認します。

    kubectl get services
    

    出力:

    NAME                       CLUSTER-IP   EXTERNAL-IP   PORT(S)              AGE
    details                    10.0.0.31    <none>        9080/TCP             6m
    kubernetes                 10.0.0.1     <none>        443/TCP              7d
    productpage                10.0.0.120   <none>        9080/TCP             6m
    ratings                    10.0.0.15    <none>        9080/TCP             6m
    reviews                    10.0.0.170   <none>        9080/TCP             6m

    kubectl get pod
    

    出力:

    NAME                                        READY     STATUS    RESTARTS   AGE
    details-v1-1520924117-48z17                 2/2       Running   0          6m
    productpage-v1-560495357-jk1lz              2/2       Running   0          6m
    ratings-v1-734492171-rnr5l                  2/2       Running   0          6m
    reviews-v1-874083890-f0qf0                  2/2       Running   0          6m
    reviews-v2-1343845940-b34q5                 2/2       Running   0          6m
    reviews-v3-1813607990-8ch52                 2/2       Running   0          6m
  4. 最後に、アプリケーションの Ingress ゲートウェイ ルーティングを定義します。

    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    

    出力:

    gateway.networking.istio.io/bookinfo-gateway created
    virtualservice.networking.istio.io/bookinfo created

アプリケーションのデプロイの検証

BookInfo アプリケーションが機能しているかどうかを確認するには、Ingress ゲートウェイにトラフィックを送信する必要があります。

  • Cloud Service Mesh を Google Distributed Cloud にインストールした場合は、Cloud Service Mesh のインストール後に構成した Ingress ゲートウェイの外部 IP アドレスを取得します。

  • Cloud Service Mesh を GKE にインストールした場合は、Ingress ゲートウェイの外部 IP アドレスを次のように取得します。

    kubectl get service istio-ingressgateway -n istio-system
    

    出力:

    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 です。

アプリケーションの実行

  1. curl で BookInfo アプリが実行されていることを確認します。

    curl -I http://EXTERNAL_IP/productpage
    

    レスポンスに 200 が示されている場合、アプリケーションが Cloud Service Mesh と正しく連動しています。

  2. BookInfo ウェブページを表示するには、ブラウザに次のアドレスを入力します。

    http://EXTERNAL_IP/productpage
    

    ページを何回か更新すると、ラウンドロビン スタイル(赤色の星、黒色の星、星なし)で示される、さまざまなバージョンのレビューが製品ページに表示されます。

トラフィックを生成しているアプリケーションが作成されたため、 Google Cloud コンソールで Cloud Service Mesh ページに移動して、指標やその他のオブザーバビリティ機能を確認できます。

クリーンアップ

Bookinfo サンプルによるテストが完了したら、クラスタから削除します。

  1. 次のスクリプトを使用して Bookinfo をアンインストールします。

    samples/bookinfo/platform/kube/cleanup.sh
    
  2. シャットダウンを確認します。

    kubectl get virtualservices   #-- there should be no virtual services
    kubectl get destinationrules  #-- there should be no destination rules
    kubectl get gateway           #-- there should be no gateway
    kubectl get pods              #-- the Bookinfo pods should be deleted
    

次のステップ

Bookinfo サンプルの詳細を確認する