リクエストタイムアウト

このタスクでは、Istioを使用してEnvoyでリクエストタイムアウトを設定する方法を示します。

始める前に

リクエストタイムアウト

HTTPリクエストのタイムアウトは、ルートルールのタイムアウトフィールドを使用して指定できます。デフォルトでは、リクエストタイムアウトは無効になっていますが、このタスクでは、reviewsサービスのタイムアウトを0.5秒に上書きします。ただし、その効果を確認するには、ratingsサービスへの呼び出しに意図的に2秒の遅延を導入する必要もあります。

  1. reviewsサービスのv2、つまりratingsサービスを呼び出すバージョンにリクエストをルーティングします。
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v2
EOF
  1. ratingsサービスへの呼び出しに2秒の遅延を追加します。
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - fault:
      delay:
        percentage:
          value: 100
        fixedDelay: 2s
    route:
    - destination:
        host: ratings
        subset: v1
EOF
  1. ブラウザで Bookinfo の URL http://$GATEWAY_URL/productpage を開いてください。ここで $GATEWAY_URL は、Bookinfo のドキュメントで説明されているように、Ingress の外部 IP アドレスです。

    Bookinfo アプリケーションが正常に動作している(評価の星が表示されている)はずですが、ページを更新するたびに 2 秒の遅延が発生します。

  2. 次に、reviews サービスへの呼び出しに 0.5 秒のリクエストタイムアウトを追加します。

$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v2
    timeout: 0.5s
EOF
  1. Bookinfo の Web ページを更新します。

    今度は、2 秒ではなく約 1 秒で応答が返ってくるはずで、レビューは利用できなくなっています。

何が起こったかを理解する

このタスクでは、Istio を使用して、reviews マイクロサービスへの呼び出しのリクエストタイムアウトを 0.5 秒に設定しました。デフォルトでは、リクエストタイムアウトは無効になっています。reviews サービスは、リクエストを処理する際に ratings サービスを呼び出すため、Istio を使用して ratings への呼び出しに 2 秒の遅延を注入し、reviews サービスの完了に 0.5 秒以上かかるようにしました。その結果、タイムアウトが動作していることを確認できました。

レビューを表示する代わりに、Bookinfo の製品ページ(ページを生成するために reviews サービスを呼び出す)に「申し訳ありません。この本の製品レビューは現在利用できません。」というメッセージが表示されたことが観察できます。これは、reviews サービスからタイムアウトエラーを受け取った結果です。

フォールトインジェクションのタスク を確認すると、productpage マイクロサービスにも、reviews マイクロサービスへの呼び出しに対してアプリケーションレベルのタイムアウト(3 秒)があることがわかります。このタスクでは、Istio のルーティングルールを使用してタイムアウトを 0.5 秒に設定しました。代わりにタイムアウトを 3 秒より大きい値(4 秒など)に設定していた場合、より制限の厳しい方が優先されるため、タイムアウトは効果がありませんでした。詳細については、こちらをご覧ください。

Istio のタイムアウトについてもう 1 つ注意すべき点は、このタスクで行ったようにルーティングルールでオーバーライドできるだけでなく、アプリケーションがアウトバウンドリクエストに x-envoy-upstream-rq-timeout-ms ヘッダーを追加した場合、リクエストごとにオーバーライドすることもできることです。ヘッダーでは、タイムアウトは秒ではなくミリ秒で指定されます。

クリーンアップ

  • アプリケーションのルーティングルールを削除します
Zip
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
  • 後続のタスクを試す予定がない場合は、Bookinfo のクリーンアップの手順に従って、アプリケーションをシャットダウンしてください。
この情報は役に立ちましたか?
改善のためのご提案はありますか?

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