フォールトインジェクション
このタスクでは、アプリケーションの復元力をテストするためにフォールトを注入する方法を示します。
始める前に
インストールガイドの手順に従って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クリーンアップの手順を参照して、アプリケーションをシャットダウンしてください。