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=enabled
kubectl
コマンドを使用してアプリケーションをデプロイします。$ 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 6m
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クラスターの外部から(たとえば、ブラウザから)アクセスできるようにする必要があります。この目的のためにゲートウェイが使用されます。
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 created
Kubernetesの
Gateway
リソースを作成すると、関連するプロキシサービスもデプロイされるため、次のコマンドを実行して、ゲートウェイが準備完了になるのを待ちます。$ kubectl wait --for=condition=programmed gtw bookinfo-gateway
bookinfoゲートウェイリソースからゲートウェイアドレスとポートを取得します。
$ 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@