リクエストタイムアウト
このタスクでは、Istioを使用してEnvoyでリクエストタイムアウトを設定する方法を示します。
始める前に
リクエストタイムアウト
HTTPリクエストのタイムアウトは、ルートルールのタイムアウトフィールドを使用して指定できます。デフォルトでは、リクエストタイムアウトは無効になっていますが、このタスクでは、reviews
サービスのタイムアウトを0.5秒に上書きします。ただし、その効果を確認するには、ratings
サービスへの呼び出しに意図的に2秒の遅延を導入する必要もあります。
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
$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: reviews
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
- name: reviews-v2
port: 9080
EOF
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
Gateway APIはまだフォールトインジェクションをサポートしていないため、現時点ではIstio VirtualService
を使用して遅延を追加する必要があります。
$ 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
EOF
ブラウザで Bookinfo の URL
http://$GATEWAY_URL/productpage
を開いてください。ここで$GATEWAY_URL
は、Bookinfo のドキュメントで説明されているように、Ingress の外部 IP アドレスです。Bookinfo アプリケーションが正常に動作している(評価の星が表示されている)はずですが、ページを更新するたびに 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
$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: reviews
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
- name: reviews-v2
port: 9080
timeouts:
request: 500ms
EOF
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
ヘッダーを追加した場合、リクエストごとにオーバーライドすることもできることです。ヘッダーでは、タイムアウトは秒ではなくミリ秒で指定されます。
クリーンアップ
- アプリケーションのルーティングルールを削除します
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
$ kubectl delete httproute reviews
$ kubectl delete virtualservice ratings
- 後続のタスクを試す予定がない場合は、Bookinfo のクリーンアップの手順に従って、アプリケーションをシャットダウンしてください。