Bookinfoアプリケーション
この例では、さまざまなIstio機能を実証するために使用される、4つの別々のマイクロサービスで構成されるサンプルアプリケーションをデプロイします。
このアプリケーションは、オンライン書店の一つのカタログエントリに似た、本に関する情報を表示します。ページには、本の概要、本の詳細(ISBN、ページ数など)、いくつかのレビューが表示されます。
Bookinfoアプリケーションは、4つの個別のマイクロサービスに分割されています。
productpage。productpageマイクロサービスは、ページに情報を入力するために、detailsおよびreviewsマイクロサービスを呼び出します。details。detailsマイクロサービスには、本の情報が含まれています。reviews。reviewsマイクロサービスには、本のレビューが含まれています。また、ratingsマイクロサービスも呼び出します。ratings。ratingsマイクロサービスには、書評に付随する本のランキング情報が含まれています。
reviewsマイクロサービスには3つのバージョンがあります。
- バージョンv1は
ratingsサービスを呼び出しません。 - バージョンv2は
ratingsサービスを呼び出し、各評価を1~5個の黒い星として表示します。 - バージョンv3は
ratingsサービスを呼び出し、各評価を1~5個の赤い星として表示します。
アプリケーションのエンドツーエンドアーキテクチャを以下に示します。
このアプリケーションはポリグロット(多言語対応)であり、マイクロサービスは異なる言語で記述されています。これらのサービスはIstioに依存していませんが、特にreviewsサービスの多数のサービス、言語、バージョンがあるため、興味深いサービスメッシュの例になります。
始める前に
まだ行っていない場合は、インストールガイドの手順に従ってIstioをセットアップしてください。
アプリケーションのデプロイ
Istioでサンプルを実行するには、アプリケーション自体に変更を加える必要はありません。代わりに、各サービスの横にEnvoyサイドカーが注入された、Istio対応環境でサービスを構成して実行するだけです。結果のデプロイメントは次のようになります。
すべてのマイクロサービスは、サービスの着信および発信呼び出しをインターセプトするEnvoyサイドカーとともにパッケージ化され、Istioコントロールプレーンを介して、アプリケーション全体のルーティング、テレメトリ収集、およびポリシー適用を外部から制御するために必要なフックを提供します。
アプリケーションサービスの起動
Istioインストールのルートディレクトリに移動します。
デフォルトのIstioインストールでは、自動サイドカー注入が使用されます。アプリケーションをホストする名前空間に
istio-injection=enabledというラベルを付けます。$ kubectl label namespace default istio-injection=enabledkubectlコマンドを使用してアプリケーションをデプロイします。$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo.yaml@このコマンドは、
bookinfoアプリケーションのアーキテクチャ図に示されている4つのサービスすべてを起動します。レビューサービスの3つのバージョン(v1、v2、v3)すべてが起動されます。すべてのサービスとポッドが正しく定義され、実行されていることを確認します。
$ 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 6mBookinfoアプリケーションが実行されていることを確認するには、
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クラスターの外部から(たとえば、ブラウザから)アクセスできるようにする必要があります。この目的のためにゲートウェイが使用されます。
Bookinfoアプリケーションのゲートウェイを作成します。
次のコマンドを使用して、Istioゲートウェイを作成します。
$ 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変数を設定します。設定したら、ここに戻ってください。次のコマンドを使用して、Kubernetesゲートウェイを作成します。
$ kubectl apply -f @samples/bookinfo/gateway-api/bookinfo-gateway.yaml@ gateway.gateway.networking.k8s.io/bookinfo-gateway created httproute.gateway.networking.k8s.io/bookinfo createdKubernetesの
Gatewayリソースを作成すると、関連するプロキシサービスもデプロイされるため、次のコマンドを実行して、ゲートウェイが準備完了になるのを待ちます。$ kubectl wait --for=condition=programmed gtw bookinfo-gatewaybookinfoゲートウェイリソースからゲートウェイアドレスとポートを取得します。
$ export INGRESS_HOST=$(kubectl get gtw bookinfo-gateway -o jsonpath='{.status.addresses[0].value}') $ export INGRESS_PORT=$(kubectl get gtw bookinfo-gateway -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')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サービスのデフォルトの宛先ルールを作成します。
$ kubectl apply -f @samples/bookinfo/networking/destination-rule-all.yaml@
宛先ルールが伝播するまで数秒待ちます。
次のコマンドを使用して、宛先ルールを表示できます。
$ kubectl get destinationrules -o yaml
サービスのバージョンを定義するためにDestinationRuleサブセットを使用するIstio APIとは異なり、Kubernetes Gateway APIではこの目的のためにバックエンドサービス定義を使用します。
次のコマンドを実行して、reviewsサービスの3つのバージョンのバックエンドサービス定義を作成します。
$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo-versions.yaml@
次のステップ
このサンプルを使用して、トラフィックルーティング、障害注入、レート制限などのIstioの機能を試すことができます。続行するには、興味に応じて、1つ以上のIstioタスクを参照してください。リクエストルーティングの設定は、初心者にとって良い出発点です。
クリーンアップ
Bookinfoサンプルの実験が完了したら、次のコマンドを使用してアンインストールしてクリーンアップします。
$ @samples/bookinfo/platform/kube/cleanup.sh@