故障注入

此任務示範如何注入故障以測試應用程式的復原能力。

開始之前

  • 依照安裝指南中的指示設定 Istio。

  • 部署Bookinfo範例應用程式,包括預設目的地規則

  • 檢閱流量管理概念文件中關於故障注入的討論。

  • 執行請求路由任務或執行以下命令,來套用應用程式版本路由

    ZipZip
    $ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
    $ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@
    
  • 使用上述設定,這是請求的流動方式

    • productpagereviews:v2ratings(僅適用於使用者 jason
    • productpagereviews:v1(適用於其他人)

注入 HTTP 延遲故障

為了測試 Bookinfo 應用程式微服務的彈性,請在使用者 jasonreviews:v2ratings 微服務之間注入 7 秒的延遲。此測試將揭露 Bookinfo 應用程式中有意引入的錯誤。

請注意,reviews:v2 服務對 ratings 服務的呼叫具有 10 秒的硬編碼連線逾時。即使您引入了 7 秒的延遲,您仍然期望端對端流程能夠繼續進行,而不會發生任何錯誤。

  1. 建立一個故障注入規則,以延遲來自測試使用者 jason 的流量。

    壓縮 (Zip)
    $ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml@
    
  2. 確認規則已建立

    $ 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。

測試延遲設定

  1. 在您的瀏覽器中開啟 Bookinfo 網頁應用程式。

  2. /productpage 網頁上,以使用者 jason 身分登入。

    您預期 Bookinfo 首頁大約在 7 秒內載入,且不會發生錯誤。但是,這裡有一個問題:Reviews 區塊會顯示錯誤訊息。

    Sorry, product reviews are currently unavailable for this book.
    
  3. 檢視網頁回應時間

    1. 在您的網頁瀏覽器中開啟「開發人員工具」選單。
    2. 開啟「網路」分頁
    3. 重新載入 /productpage 網頁。您會看到該網頁實際上大約在 6 秒內載入。

了解發生了什麼事

您已找到一個錯誤。微服務中存在硬編碼的逾時設定,導致 reviews 服務失敗。

如預期,您引入的 7 秒延遲不會影響 reviews 服務,因為 reviewsratings 服務之間的逾時硬編碼為 10 秒。但是,productpagereviews 服務之間也存在硬編碼的逾時設定,編碼為 3 秒 + 1 次重試,總計 6 秒。因此,productpagereviews 的呼叫過早逾時,並在 6 秒後拋出錯誤。

類似這樣的錯誤可能會在典型的企業應用程式中發生,因為不同的團隊會獨立開發不同的微服務。Istio 的故障注入規則可協助您識別此類異常狀況,而不會影響終端使用者。

修正錯誤

您通常會透過以下方式修復此問題:

  1. 增加 productpagereviews 服務的逾時時間,或減少 reviewsratings 的逾時時間
  2. 停止並重新啟動已修復的微服務
  3. 確認 /productpage 網頁的回應沒有任何錯誤。

但是,您已經在 reviews 服務的 v3 版本中執行了修正程式。reviews:v3 服務將 reviewsratings 的逾時時間從 10 秒縮短到 2.5 秒,使其與下游 productpage 請求的逾時時間相容(小於)。

如果您按照流量轉移任務中的說明,將所有流量遷移到 reviews:v3,則可以嘗試將延遲規則更改為任何小於 2.5 秒的數值,例如 2 秒,並確認端對端流程能夠繼續進行,而不會發生任何錯誤。

注入 HTTP 中止故障

測試微服務彈性的另一種方法是引入 HTTP 中止故障。在此任務中,您將針對測試使用者 jasonratings 微服務引入 HTTP 中止。

在這種情況下,您預期頁面會立即載入,並顯示 Ratings service is currently unavailable 訊息。

  1. 建立一個故障注入規則,為使用者 jason 發送 HTTP 中止。

    壓縮 (Zip)
    $ kubectl apply -f @samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml@
    
  2. 確認規則已建立

    $ 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
    

測試中止設定

  1. 在您的瀏覽器中開啟 Bookinfo 網頁應用程式。

  2. /productpage 上,以使用者 jason 身分登入。

    如果規則已成功傳播到所有 Pod,頁面會立即載入,並顯示 Ratings service is currently unavailable 訊息。

  3. 如果您從使用者 jason 登出,或在匿名視窗 (或另一個瀏覽器) 中開啟 Bookinfo 應用程式,您會看到 /productpage 仍然為除了 jason 以外的所有人呼叫 reviews:v1 (完全不呼叫 ratings)。因此,您將不會看到任何錯誤訊息。

清理

  1. 移除應用程式路由規則

    壓縮 (Zip)
    $ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
    
  2. 如果您不打算探索任何後續任務,請參閱 Bookinfo 清理 指示以關閉應用程式。

這個資訊有用嗎?
您有任何改進建議嗎?

感謝您的回饋!