新增 reviews 的新版本

在本模組中,您將部署 reviews 服務的新版本,_v2_,它將回傳評論者提供的評分數量和星星顏色。在真實世界的場景中,在您部署之前,您會執行靜態分析測試、單元測試、整合測試、端對端測試以及在預備環境中的測試。

  1. 部署新的 reviews 微服務版本,但不帶 app=reviews 標籤。沒有該標籤,新版本將不會被選中來提供 reviews 服務。因此,它不會被生產程式碼調用。執行以下指令來部署 reviews 微服務的第 2 版,同時將標籤 app=reviews 替換為 app=reviews_test

    $ curl -s https://raw.githubusercontent.com/istio/istio/release-1.24/samples/bookinfo/platform/kube/bookinfo.yaml | sed 's/app: reviews/app: reviews_test/' | kubectl apply -l app=reviews_test,version=v2 -f -
    deployment.apps/reviews-v2 created
    
  2. 存取您的應用程式,以確保已部署的微服務沒有干擾它。

  3. 從叢集內部,使用您先前部署的測試容器來測試您的微服務新版本。請注意,您的新版本在測試期間會存取 ratings 微服務的生產 Pod。另外請注意,您必須使用 Pod IP 來存取您的微服務新版本,因為它未被選中用於 reviews 服務。

    1. 取得 Pod 的 IP

      $ REVIEWS_V2_POD_IP=$(kubectl get pod -l app=reviews_test,version=v2 -o jsonpath='{.items[0].status.podIP}')
      $ echo $REVIEWS_V2_POD_IP
      
    2. 向 Pod 發送請求,並查看它是否回傳正確的結果

      $ kubectl exec $(kubectl get pod -l app=curl -o jsonpath='{.items[0].metadata.name}') -- curl -sS "$REVIEWS_V2_POD_IP:9080/reviews/7"
      {"id": "7","reviews": [{  "reviewer": "Reviewer1",  "text": "An extremely entertaining play by Shakespeare. The slapstick humour is refreshing!", "rating": {"stars": 5, "color": "black"}},{  "reviewer": "Reviewer2",  "text": "Absolutely fun and entertaining. The play lacks thematic depth when compared to other plays by Shakespeare.", "rating": {"stars": 4, "color": "black"}}]}
      
    3. 透過連續發送 10 次請求來執行基本負載測試

      $ kubectl exec $(kubectl get pod -l app=curl -o jsonpath='{.items[0].metadata.name}') -- sh -c "for i in 1 2 3 4 5 6 7 8 9 10; do curl -o /dev/null -s -w '%{http_code}\n' $REVIEWS_V2_POD_IP:9080/reviews/7; done"
      200
      200
      ...
      
  4. 先前的步驟確保您的 reviews 新版本可以運作,您可以部署它。您將部署服務的單一副本到生產環境,這樣真正的生產流量就會開始流向您的新服務版本。在目前的設定下,75% 的流量將流向舊版本(舊版本的三個 Pod),而 25% 將流向新版本(單一個 Pod)。

    要部署 *reviews v2*,請重新部署帶有 app=reviews 標籤的新版本,這樣它就可以被 reviews 服務定址。

    $ kubectl label pods -l version=v2 app=reviews --overwrite
    pod "reviews-v2-79c8c8c7c5-4p4mn" labeled
    
  5. 現在,您存取應用程式網頁,並觀察到評分出現黑色星星。您可以多次存取該頁面,並看到有時頁面會帶有星星(約 25% 的時間),有時則沒有星星(約 75% 的時間)。

    Bookinfo Web Application with black stars as ratings
    Bookinfo 網路應用程式,評分顯示為黑色星星
  6. 如果您在真實世界的場景中遇到新版本的任何問題,您可以快速取消部署新版本,這樣就只會使用舊版本

    $ kubectl delete deployment reviews-v2
    $ kubectl delete pod -l app=reviews,version=v2
    deployment.apps "reviews-v2" deleted
    pod "reviews-v2-79c8c8c7c5-4p4mn" deleted
    

    允許一些時間讓組態變更在系統中傳播。然後,多次存取您的應用程式網頁,並看到現在黑色星星沒有出現。

    要還原新版本

    $ kubectl apply -l app=reviews,version=v2 -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/bookinfo/platform/kube/bookinfo.yaml
    deployment.apps/reviews-v2 created
    

    多次存取您的應用程式網頁,並看到現在黑色星星大約在 25% 的時間內出現。

  7. 接下來,增加您新版本的副本數。您可以逐步進行,仔細檢查錯誤的數量是否沒有增加

    $ kubectl scale deployment reviews-v2 --replicas=3
    deployment.apps/reviews-v2 scaled
    

    現在,多次存取您的應用程式網頁,並看到黑色星星大約在半數的時間內出現。

  8. 現在,您可以讓舊版本退役

    $ kubectl delete deployment reviews-v1
    deployment.apps "reviews-v1" deleted
    

    存取應用程式的網頁將只回傳帶有黑色星星的評論。

在先前的步驟中,您執行了 reviews 的更新。首先,您部署了新版本,但沒有向其發送模擬的生產流量。您使用測試流量在生產環境中測試了它。您檢查了新版本是否提供正確的結果。您發布了新版本,逐漸增加其生產流量。最後,您讓舊版本退役。

從這裡開始,您可以使用以下範例任務來改進您的部署策略。首先,在生產環境中進行新版本的端到端測試。這需要能夠使用請求參數(例如使用儲存在 Cookie 中的使用者名稱)將流量導向新版本。此外,執行將生產流量鏡像到您的新版本,並檢查新版本是否提供不正確的結果或產生錯誤。最後,對部署的推出獲得更詳細的控制。舉例來說,您可以部署 1%,然後每小時增加 1%,只要服務沒有出現降級。Istio 透過幫助您以直接的方式執行這些任務,來增強 Kubernetes 的價值。有關部署的更詳細資訊和最佳實務,請參閱部署模型

從這裡開始,您有兩個選擇

  1. 使用服務網格。在服務網格中,您將所有報告、路由、策略、安全性邏輯放入邊車代理程式中,這些代理程式會透明地注入到您的應用程式 Pod 中。業務邏輯保留在應用程式的程式碼中,不需要對應用程式程式碼進行任何變更。

  2. 在應用程式程式碼中實作所需的功能。大多數功能已經存在於各種程式庫中,例如 Java 程式語言的 Netflix 的 Hystrix 程式庫。但是,現在您必須變更程式碼才能使用這些程式庫。您必須付出額外的努力,您的程式碼會變得臃腫,業務邏輯會與報告、路由、策略、網路邏輯混雜在一起。由於您的微服務使用不同的程式語言,您必須學習、使用、更新多個程式庫。

請參閱Istio 服務網格,了解 Istio 如何執行此處提及的任務以及更多任務。在接下來的模組中,您將探索各種 Istio 功能。

您已準備好productpage 上啟用 Istio

此資訊是否有用?
您有任何改進建議嗎?

感謝您的回饋!