フォールトインジェクション

このタスクでは、アプリケーションの復元力をテストするためにフォールトを注入する方法を示します。

始める前に

  • インストールガイドの手順に従ってIstioをセットアップします。

  • Bookinfoサンプルアプリケーションを、デフォルトの宛先ルールを含めてデプロイします。

  • トラフィック管理の概念ドキュメントで、フォールトインジェクションに関する説明を確認してください。

  • リクエストルーティングタスクを実行するか、次のコマンドを実行して、アプリケーションバージョンのルーティングを適用します。

    ZipZip
    $ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
    $ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@
    
  • 上記の構成では、リクエストは次のように流れます。

    • productpagereviews:v2ratings (ユーザーjasonのみ)
    • productpagereviews:v1 (その他全員)

HTTP遅延フォールトの注入

Bookinfoアプリケーションマイクロサービスのレジリエンスをテストするために、ユーザーjasonに対して、reviews:v2ratingsマイクロサービス間に7秒間の遅延を注入します。このテストにより、Bookinfoアプリに意図的に導入されたバグが明らかになります。

reviews:v2サービスは、ratingsサービスへの呼び出しに対して10秒間のハードコーディングされた接続タイムアウトを持つことに注意してください。導入した7秒間の遅延があっても、エンドツーエンドのフローはエラーなしで継続されることが期待されます。

  1. テストユーザーjasonからのトラフィックを遅延させるフォールトインジェクションルールを作成します。

    Zip
    $ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml@
    
  2. ルールの作成を確認します。

    $ 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
    

    新しいルールがすべてのポッドに伝播するまで、数秒間待ちます。

遅延設定のテスト

  1. ブラウザでBookinfoウェブアプリケーションを開きます。

  2. /productpageウェブページで、ユーザーjasonとしてログインします。

    Bookinfoのホームページは約7秒でエラーなしで読み込まれることが期待されます。しかし、問題があります。レビューセクションにエラーメッセージが表示されます。

    Sorry, product reviews are currently unavailable for this book.
    
  3. ウェブページの応答時間を確認します。

    1. ウェブブラウザで開発者ツールメニューを開きます。
    2. ネットワークタブを開きます。
    3. /productpageウェブページを再読み込みします。ページは約6秒で読み込まれることがわかります。

発生した事象の理解

バグが見つかりました。マイクロサービスには、reviewsサービスが失敗する原因となるハードコーディングされたタイムアウトがあります。

予想通り、導入した7秒間の遅延は、reviewsratingsサービス間のタイムアウトが10秒間にハードコーディングされているため、reviewsサービスには影響しません。しかし、productpagereviewsサービス間にも、3秒+1回の再試行で合計6秒のハードコーディングされたタイムアウトがあります。その結果、productpageからreviewsへの呼び出しは早期にタイムアウトし、6秒後にエラーをスローします。

このようなバグは、異なるチームが独立して異なるマイクロサービスを開発する一般的なエンタープライズアプリケーションで発生する可能性があります。Istioのフォールトインジェクションルールを使用すると、エンドユーザーに影響を与えることなく、このような異常を特定できます。

バグの修正

通常は、次の方法で問題を修正します。

  1. productpageからreviewsサービスへのタイムアウトを増やすか、reviewsからratingsサービスへのタイムアウトを減らす。
  2. 修正済みのマイクロサービスを停止して再起動する。
  3. /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メッセージが表示されることが期待されます。

  1. ユーザーjasonにHTTPアボートを送信するフォールトインジェクションルールを作成します。

    Zip
    $ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml@
    
  2. ルールの作成を確認します。

    $ 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
    

アボート設定のテスト

  1. ブラウザでBookinfoウェブアプリケーションを開きます。

  2. /productpageで、ユーザーjasonとしてログインします。

    ルールがすべてのポッドに正常に伝播した場合、ページはすぐに読み込まれ、Ratings service is currently unavailableメッセージが表示されます。

  3. ユーザーjasonからログアウトするか、匿名ウィンドウ(または別のブラウザ)でBookinfoアプリケーションを開くと、/productpagejason以外の全員に対してreviews:v1ratingsをまったく呼び出さない)を呼び出します。そのため、エラーメッセージは表示されません。

クリーンアップ

  1. アプリケーションルーティングルールを削除します。

    Zip
    $ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
    
  2. 以降のタスクを検討しない場合は、Bookinfoクリーンアップの手順を参照して、アプリケーションをシャットダウンしてください。

この情報は役に立ちましたか?
改善のための提案はありますか?

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