Bookinfo サンプルのデプロイ

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

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

サンプル画像のネットワーク アクセス

asmcli ツールは、コアメッシュのインストール中に Docker Hub(docker.io)から何も確認したり、プルしたりしません。ただし、インストール後にサードパーティのコンテナ イメージをデプロイすると、Kubelet が Docker Hub と Docker Hub のバックエンド Cloudflare CDN からサンプル アプリケーション イメージをフェッチします。

制限付きネットワークまたはエアギャップ ネットワークでは、明示的に対応しない限り、これらのイメージの pull は失敗します。

イメージの pull に対応するには、次のいずれかの方法を選択します。

  • 下り(外向き)トラフィックを許可する

    ファイアウォールまたはプロキシを更新して、次のドメインへの HTTPS(ポート 443)の下り(外向き)を許可します。Docker Hub は HTTP 307 リダイレクトを使用してイメージレイヤを配信するため、Cloudflare ドメインが必要です。

    • docker.io
    • hub.docker.com
    • *.cloudflarestorage.com
  • プライベート レジストリにミラーリングする

    完全に制限された環境では、ファイアウォール ポートを開かないでください。代わりに、必要なサンプル イメージを内部レジストリにミラーリングし、内部レジストリを使用するようにクラスタを構成します。

    GDC 環境でこれを設定する手順については、コンテナ イメージにレジストリ ミラーを使用するをご覧ください。

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

  1. インジェクションの名前空間を有効にします。手順は、コントロール プレーンの実装によって異なります。

    マネージド(TD)

    1. デフォルトのインジェクション ラベルを名前空間に適用します。
    kubectl label namespace default \
        istio.io/rev- istio-injection=enabled --overwrite
    

    マネージド(Istiod)

    推奨: 次のコマンドを実行して、デフォルトのインジェクション ラベルを名前空間に適用します。

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

    マネージド Istiod コントロール プレーンを使用している既存のユーザーの場合: デフォルトのインジェクションを使用することをおすすめしますが、リビジョンベースのインジェクションもサポートされています。次の手順を行います。

    1. 次のコマンドを実行して、利用可能なリリース チャンネルを探します。

      kubectl -n istio-system get controlplanerevision
      

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

      NAME                AGE
      asm-managed-rapid   6d7h
      

      注: 上記のリストに 2 つのコントロール プレーンのリビジョンが表示されている場合は、1 つを削除します。クラスタに複数のコントロール プレーン チャネルを配置することはできません。

      出力で、NAME 列の値は、Cloud Service Mesh バージョンで使用可能なリリース チャンネルに対応するリビジョン ラベルです。

    2. リビジョン ラベルを名前空間に適用します。

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

    クラスタ内

    推奨: 次のコマンドを実行して、デフォルトのインジェクション ラベルを名前空間に適用します。

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

    デフォルトのインジェクションを使用することをおすすめしますが、リビジョンベースのインジェクションもサポートされています。 次の手順で対応します。

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

      kubectl get deploy -n istio-system -l app=istiod -o \
         jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. リビジョン ラベルを名前空間に適用します。次のコマンドで、REVISION_LABEL は前の手順でメモした istiod リビジョン ラベルの値です。

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

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

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

  1. Cloud Service Mesh をインストールしたコンピュータのコマンドラインで Cloud Service Mesh のインストール ディレクトリのルートに移動します。必要に応じて、bookinfo サンプル アプリケーションを含むクラスタ内インストール ファイルをダウンロードし、ファイルを解凍します。

  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 ゲートウェイにトラフィックを送信する必要があります。

  • VMware 用の Google Distributed Cloud に Cloud Service Mesh(ソフトウェアのみ)をインストールした場合は、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 サンプルの詳細を確認する