フォールトインジェクション
このタスクでは、アプリケーションの復元力をテストするためにフォールトを注入する方法を示します。
始める前に
インストールガイドの手順に従ってIstioをセットアップします。
Bookinfoサンプルアプリケーションを、デフォルトの宛先ルールを含めてデプロイします。
トラフィック管理の概念ドキュメントで、フォールトインジェクションに関する説明を確認してください。
リクエストルーティングタスクを実行するか、次のコマンドを実行して、アプリケーションバージョンのルーティングを適用します。
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@ $ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@上記の構成では、リクエストは次のように流れます。
productpage→reviews:v2→ratings(ユーザーjasonのみ)productpage→reviews:v1(その他全員)
HTTP遅延フォールトの注入
Bookinfoアプリケーションマイクロサービスのレジリエンスをテストするために、ユーザーjasonに対して、reviews:v2とratingsマイクロサービス間に7秒間の遅延を注入します。このテストにより、Bookinfoアプリに意図的に導入されたバグが明らかになります。
reviews:v2サービスは、ratingsサービスへの呼び出しに対して10秒間のハードコーディングされた接続タイムアウトを持つことに注意してください。導入した7秒間の遅延があっても、エンドツーエンドのフローはエラーなしで継続されることが期待されます。
テストユーザー
jasonからのトラフィックを遅延させるフォールトインジェクションルールを作成します。$ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml@ルールの作成を確認します。
$ kubectl get virtualservice ratings -o yaml apiVersion: networking.istio.io/v1 kind: VirtualService ... spec: hosts: - ratings http: - fault: delay: fixedDelay: 7s percentage: value: 100 match: - headers: end-user: exact: jason route: - destination: host: ratings subset: v1 - route: - destination: host: ratings subset: v1新しいルールがすべてのポッドに伝播するまで、数秒間待ちます。
遅延設定のテスト
ブラウザでBookinfoウェブアプリケーションを開きます。
/productpageウェブページで、ユーザーjasonとしてログインします。Bookinfoのホームページは約7秒でエラーなしで読み込まれることが期待されます。しかし、問題があります。レビューセクションにエラーメッセージが表示されます。
Sorry, product reviews are currently unavailable for this book.ウェブページの応答時間を確認します。
- ウェブブラウザで開発者ツールメニューを開きます。
- ネットワークタブを開きます。
/productpageウェブページを再読み込みします。ページは約6秒で読み込まれることがわかります。
発生した事象の理解
バグが見つかりました。マイクロサービスには、reviewsサービスが失敗する原因となるハードコーディングされたタイムアウトがあります。
予想通り、導入した7秒間の遅延は、reviewsとratingsサービス間のタイムアウトが10秒間にハードコーディングされているため、reviewsサービスには影響しません。しかし、productpageとreviewsサービス間にも、3秒+1回の再試行で合計6秒のハードコーディングされたタイムアウトがあります。その結果、productpageからreviewsへの呼び出しは早期にタイムアウトし、6秒後にエラーをスローします。
このようなバグは、異なるチームが独立して異なるマイクロサービスを開発する一般的なエンタープライズアプリケーションで発生する可能性があります。Istioのフォールトインジェクションルールを使用すると、エンドユーザーに影響を与えることなく、このような異常を特定できます。
バグの修正
通常は、次の方法で問題を修正します。
productpageからreviewsサービスへのタイムアウトを増やすか、reviewsからratingsサービスへのタイムアウトを減らす。- 修正済みのマイクロサービスを停止して再起動する。
/productpageウェブページがエラーなしで応答を返すことを確認します。
しかし、reviewsサービスのv3で既に修正を実行しています。reviews:v3サービスは、reviewsからratingsサービスへのタイムアウトを10秒から2.5秒に減らすため、ダウンストリームのproductpageリクエストのタイムアウト(未満)と互換性があります。
トラフィックシフトタスクで説明されているように、すべてのトラフィックをreviews:v3に移行すると、遅延ルールを2.5秒未満の任意の値(例:2秒)に変更し、エンドツーエンドのフローがエラーなしで継続されることを確認できます。
HTTPアボートフォールトの注入
マイクロサービスのレジリエンスをテストするもう1つの方法は、HTTPアボートフォールトを導入することです。このタスクでは、テストユーザーjasonに対してratingsマイクロサービスにHTTPアボートを導入します。
この場合、ページはすぐに読み込まれ、Ratings service is currently unavailableメッセージが表示されることが期待されます。
ユーザー
jasonにHTTPアボートを送信するフォールトインジェクションルールを作成します。$ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml@ルールの作成を確認します。
$ kubectl get virtualservice ratings -o yaml apiVersion: networking.istio.io/v1 kind: VirtualService ... spec: hosts: - ratings http: - fault: abort: httpStatus: 500 percentage: value: 100 match: - headers: end-user: exact: jason route: - destination: host: ratings subset: v1 - route: - destination: host: ratings subset: v1
アボート設定のテスト
ブラウザでBookinfoウェブアプリケーションを開きます。
/productpageで、ユーザーjasonとしてログインします。ルールがすべてのポッドに正常に伝播した場合、ページはすぐに読み込まれ、
Ratings service is currently unavailableメッセージが表示されます。ユーザー
jasonからログアウトするか、匿名ウィンドウ(または別のブラウザ)でBookinfoアプリケーションを開くと、/productpageはjason以外の全員に対してreviews:v1(ratingsをまったく呼び出さない)を呼び出します。そのため、エラーメッセージは表示されません。
クリーンアップ
アプリケーションルーティングルールを削除します。
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@以降のタスクを検討しない場合は、Bookinfoクリーンアップの手順を参照して、アプリケーションをシャットダウンしてください。