リクエストタイムアウト
このタスクでは、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 のクリーンアップの手順に従って、アプリケーションをシャットダウンしてください。