請求逾時
此任務說明如何使用 Istio 在 Envoy 中設定請求逾時。
開始之前
請求逾時
可以使用路由規則中的 timeout 欄位指定 HTTP 請求的逾時。預設情況下,請求逾時已停用,但在本任務中,您會將 reviews
服務逾時覆寫為半秒。不過,為了看到效果,您還會在對 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
是入口的外部 IP 位址,如 Bookinfo 文件中所述。您應該會看到 Bookinfo 應用程式正常運作(顯示評分星號),但是每次您重新整理頁面時都會有 2 秒的延遲。
現在為對
reviews
服務的呼叫新增半秒的請求逾時。
$ 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 網頁。
您現在應該看到它在大約 1 秒內返回,而不是 2 秒,並且評論不可用。
了解發生了什麼
在這個任務中,您使用 Istio 設定呼叫 reviews
微服務的請求逾時為半秒。預設情況下,請求逾時是停用的。由於 reviews
服務在處理請求時會隨後呼叫 ratings
服務,因此您使用 Istio 在呼叫 ratings
時注入 2 秒的延遲,以導致 reviews
服務花費超過半秒才能完成,因此您可以看到逾時的效果。
您觀察到 Bookinfo 產品頁面(呼叫 reviews
服務來填充頁面)沒有顯示評論,而是顯示訊息:抱歉,目前無法提供此書的產品評論。這是因為它從 reviews
服務收到逾時錯誤的結果。
如果您檢查故障注入任務,您會發現 productpage
微服務對於呼叫 reviews
微服務也有自己的應用程式級逾時(3 秒)。請注意,在這個任務中,您使用了 Istio 路由規則將逾時設定為半秒。如果您將逾時設定為大於 3 秒的值(例如 4 秒),則逾時將不會產生任何效果,因為兩者中限制較嚴格的將優先。更多詳細資訊可以在這裡找到。
關於 Istio 中的逾時,還有一點需要注意的是,除了像您在這個任務中所做的那樣在路由規則中覆寫它們之外,如果應用程式在傳出請求中新增 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 清理說明來關閉應用程式。