故障注入
此任務示範如何注入故障以測試應用程式的復原能力。
開始之前
依照安裝指南中的指示設定 Istio。
檢閱流量管理概念文件中關於故障注入的討論。
執行請求路由任務或執行以下命令,來套用應用程式版本路由
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@ $ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@
使用上述設定,這是請求的流動方式
productpage
→reviews:v2
→ratings
(僅適用於使用者jason
)productpage
→reviews:v1
(適用於其他人)
注入 HTTP 延遲故障
為了測試 Bookinfo 應用程式微服務的彈性,請在使用者 jason
的 reviews:v2
和 ratings
微服務之間注入 7 秒的延遲。此測試將揭露 Bookinfo 應用程式中有意引入的錯誤。
請注意,reviews:v2
服務對 ratings
服務的呼叫具有 10 秒的硬編碼連線逾時。即使您引入了 7 秒的延遲,您仍然期望端對端流程能夠繼續進行,而不會發生任何錯誤。
建立一個故障注入規則,以延遲來自測試使用者
jason
的流量。$ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml@
確認規則已建立
$ 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
請等待幾秒鐘,讓新規則傳播到所有 Pod。
測試延遲設定
在您的瀏覽器中開啟 Bookinfo 網頁應用程式。
在
/productpage
網頁上,以使用者jason
身分登入。您預期 Bookinfo 首頁大約在 7 秒內載入,且不會發生錯誤。但是,這裡有一個問題:Reviews 區塊會顯示錯誤訊息。
Sorry, product reviews are currently unavailable for this book.
檢視網頁回應時間
- 在您的網頁瀏覽器中開啟「開發人員工具」選單。
- 開啟「網路」分頁
- 重新載入
/productpage
網頁。您會看到該網頁實際上大約在 6 秒內載入。
了解發生了什麼事
您已找到一個錯誤。微服務中存在硬編碼的逾時設定,導致 reviews
服務失敗。
如預期,您引入的 7 秒延遲不會影響 reviews
服務,因為 reviews
和 ratings
服務之間的逾時硬編碼為 10 秒。但是,productpage
和 reviews
服務之間也存在硬編碼的逾時設定,編碼為 3 秒 + 1 次重試,總計 6 秒。因此,productpage
對 reviews
的呼叫過早逾時,並在 6 秒後拋出錯誤。
類似這樣的錯誤可能會在典型的企業應用程式中發生,因為不同的團隊會獨立開發不同的微服務。Istio 的故障注入規則可協助您識別此類異常狀況,而不會影響終端使用者。
修正錯誤
您通常會透過以下方式修復此問題:
- 增加
productpage
到reviews
服務的逾時時間,或減少reviews
到ratings
的逾時時間 - 停止並重新啟動已修復的微服務
- 確認
/productpage
網頁的回應沒有任何錯誤。
但是,您已經在 reviews
服務的 v3 版本中執行了修正程式。reviews:v3
服務將 reviews
到 ratings
的逾時時間從 10 秒縮短到 2.5 秒,使其與下游 productpage
請求的逾時時間相容(小於)。
如果您按照流量轉移任務中的說明,將所有流量遷移到 reviews:v3
,則可以嘗試將延遲規則更改為任何小於 2.5 秒的數值,例如 2 秒,並確認端對端流程能夠繼續進行,而不會發生任何錯誤。
注入 HTTP 中止故障
測試微服務彈性的另一種方法是引入 HTTP 中止故障。在此任務中,您將針對測試使用者 jason
對 ratings
微服務引入 HTTP 中止。
在這種情況下,您預期頁面會立即載入,並顯示 Ratings service is currently unavailable
訊息。
建立一個故障注入規則,為使用者
jason
發送 HTTP 中止。$ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml@
確認規則已建立
$ 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
測試中止設定
在您的瀏覽器中開啟 Bookinfo 網頁應用程式。
在
/productpage
上,以使用者jason
身分登入。如果規則已成功傳播到所有 Pod,頁面會立即載入,並顯示
Ratings service is currently unavailable
訊息。如果您從使用者
jason
登出,或在匿名視窗 (或另一個瀏覽器) 中開啟 Bookinfo 應用程式,您會看到/productpage
仍然為除了jason
以外的所有人呼叫reviews:v1
(完全不呼叫ratings
)。因此,您將不會看到任何錯誤訊息。
清理
移除應用程式路由規則
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
如果您不打算探索任何後續任務,請參閱 Bookinfo 清理 指示以關閉應用程式。