Bookinfoアプリケーション

この例では、さまざまなIstio機能を実証するために使用される、4つの別々のマイクロサービスで構成されるサンプルアプリケーションをデプロイします。

このアプリケーションは、オンライン書店の一つのカタログエントリに似た、本に関する情報を表示します。ページには、本の概要、本の詳細(ISBN、ページ数など)、いくつかのレビューが表示されます。

Bookinfoアプリケーションは、4つの個別のマイクロサービスに分割されています。

  • productpageproductpageマイクロサービスは、ページに情報を入力するために、detailsおよびreviewsマイクロサービスを呼び出します。
  • detailsdetailsマイクロサービスには、本の情報が含まれています。
  • reviewsreviewsマイクロサービスには、本のレビューが含まれています。また、ratingsマイクロサービスも呼び出します。
  • ratingsratingsマイクロサービスには、書評に付随する本のランキング情報が含まれています。

reviewsマイクロサービスには3つのバージョンがあります。

  • バージョンv1はratingsサービスを呼び出しません。
  • バージョンv2はratingsサービスを呼び出し、各評価を1~5個の黒い星として表示します。
  • バージョンv3はratingsサービスを呼び出し、各評価を1~5個の赤い星として表示します。

アプリケーションのエンドツーエンドアーキテクチャを以下に示します。

Bookinfo Application without Istio
Istioを使用しないBookinfoアプリケーション

このアプリケーションはポリグロット(多言語対応)であり、マイクロサービスは異なる言語で記述されています。これらのサービスはIstioに依存していませんが、特にreviewsサービスの多数のサービス、言語、バージョンがあるため、興味深いサービスメッシュの例になります。

始める前に

まだ行っていない場合は、インストールガイドの手順に従ってIstioをセットアップしてください。

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

Istioでサンプルを実行するには、アプリケーション自体に変更を加える必要はありません。代わりに、各サービスの横にEnvoyサイドカーが注入された、Istio対応環境でサービスを構成して実行するだけです。結果のデプロイメントは次のようになります。

Bookinfo Application
Bookinfoアプリケーション

すべてのマイクロサービスは、サービスの着信および発信呼び出しをインターセプトするEnvoyサイドカーとともにパッケージ化され、Istioコントロールプレーンを介して、アプリケーション全体のルーティング、テレメトリ収集、およびポリシー適用を外部から制御するために必要なフックを提供します。

アプリケーションサービスの起動

  1. Istioインストールのルートディレクトリに移動します。

  2. デフォルトのIstioインストールでは、自動サイドカー注入が使用されます。アプリケーションをホストする名前空間にistio-injection=enabledというラベルを付けます。

    $ kubectl label namespace default istio-injection=enabled
    
  3. kubectlコマンドを使用してアプリケーションをデプロイします。

    Zip
    $ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo.yaml@
    

    このコマンドは、bookinfoアプリケーションのアーキテクチャ図に示されている4つのサービスすべてを起動します。レビューサービスの3つのバージョン(v1、v2、v3)すべてが起動されます。

  4. すべてのサービスとポッドが正しく定義され、実行されていることを確認します。

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

    および

    $ kubectl get pods
    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
    
  5. Bookinfoアプリケーションが実行されていることを確認するには、ratingsなどのポッドからcurlコマンドでリクエストを送信します。

    $ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
    <title>Simple Bookstore App</title>
    

イングレスIPとポートの特定

Bookinfoサービスが起動して実行されたので、アプリケーションをKubernetesクラスターの外部から(たとえば、ブラウザから)アクセスできるようにする必要があります。この目的のためにゲートウェイが使用されます。

  1. Bookinfoアプリケーションのゲートウェイを作成します。

    次のコマンドを使用して、Istioゲートウェイを作成します。

    Zip
    $ kubectl apply -f @samples/bookinfo/networking/bookinfo-gateway.yaml@
    gateway.networking.istio.io/bookinfo-gateway created
    virtualservice.networking.istio.io/bookinfo created
    

    ゲートウェイが作成されたことを確認します。

    $ kubectl get gateway
    NAME               AGE
    bookinfo-gateway   32s
    

    これらの手順に従って、ゲートウェイにアクセスするためのINGRESS_HOST変数とINGRESS_PORT変数を設定します。設定したら、ここに戻ってください。

  2. GATEWAY_URLを設定します。

    $ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
    

クラスター外からアプリケーションにアクセスできることの確認

Bookinfoアプリケーションがクラスターの外部からアクセスできることを確認するには、次のcurlコマンドを実行します。

$ curl -s "http://${GATEWAY_URL}/productpage" | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

ブラウザでhttp://$GATEWAY_URL/productpageを開いてBookinfoのWebページを表示することもできます。ページを数回リフレッシュすると、productpageにレビューの異なるバージョン(赤い星、黒い星、星なし)がラウンドロビン形式で表示されます。これは、まだIstioを使用してバージョンのルーティングを制御していないためです。

サービスバージョンの定義

Istioを使用してBookinfoのバージョンのルーティングを制御する前に、利用可能なバージョンを定義する必要があります。

Istioでは、宛先ルールサブセットを使用して、サービスのバージョンを定義します。次のコマンドを実行して、Bookinfoサービスのデフォルトの宛先ルールを作成します。

Zip
$ kubectl apply -f @samples/bookinfo/networking/destination-rule-all.yaml@

宛先ルールが伝播するまで数秒待ちます。

次のコマンドを使用して、宛先ルールを表示できます。

$ kubectl get destinationrules -o yaml

次のステップ

このサンプルを使用して、トラフィックルーティング、障害注入、レート制限などのIstioの機能を試すことができます。続行するには、興味に応じて、1つ以上のIstioタスクを参照してください。リクエストルーティングの設定は、初心者にとって良い出発点です。

クリーンアップ

Bookinfoサンプルの実験が完了したら、次のコマンドを使用してアンインストールしてクリーンアップします。

Zip
$ @samples/bookinfo/platform/kube/cleanup.sh@
この情報は役に立ちましたか?
改善のためのご提案はありますか?

フィードバックありがとうございます!