新增 reviews 的新版本
在本模組中,您將部署 reviews
服務的新版本,_v2_
,它將回傳評論者提供的評分數量和星星顏色。在真實世界的場景中,在您部署之前,您會執行靜態分析測試、單元測試、整合測試、端對端測試以及在預備環境中的測試。
部署新的
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
存取您的應用程式,以確保已部署的微服務沒有干擾它。
從叢集內部,使用您先前部署的測試容器來測試您的微服務新版本。請注意,您的新版本在測試期間會存取
ratings
微服務的生產 Pod。另外請注意,您必須使用 Pod IP 來存取您的微服務新版本,因為它未被選中用於reviews
服務。取得 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
向 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"}}]}
透過連續發送 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 ...
先前的步驟確保您的
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
現在,您存取應用程式網頁,並觀察到評分出現黑色星星。您可以多次存取該頁面,並看到有時頁面會帶有星星(約 25% 的時間),有時則沒有星星(約 75% 的時間)。
Bookinfo 網路應用程式,評分顯示為黑色星星 如果您在真實世界的場景中遇到新版本的任何問題,您可以快速取消部署新版本,這樣就只會使用舊版本
$ 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% 的時間內出現。
接下來,增加您新版本的副本數。您可以逐步進行,仔細檢查錯誤的數量是否沒有增加
$ kubectl scale deployment reviews-v2 --replicas=3 deployment.apps/reviews-v2 scaled
現在,多次存取您的應用程式網頁,並看到黑色星星大約在半數的時間內出現。
現在,您可以讓舊版本退役
$ kubectl delete deployment reviews-v1 deployment.apps "reviews-v1" deleted
存取應用程式的網頁將只回傳帶有黑色星星的評論。
在先前的步驟中,您執行了 reviews
的更新。首先,您部署了新版本,但沒有向其發送模擬的生產流量。您使用測試流量在生產環境中測試了它。您檢查了新版本是否提供正確的結果。您發布了新版本,逐漸增加其生產流量。最後,您讓舊版本退役。
從這裡開始,您可以使用以下範例任務來改進您的部署策略。首先,在生產環境中進行新版本的端到端測試。這需要能夠使用請求參數(例如使用儲存在 Cookie 中的使用者名稱)將流量導向新版本。此外,執行將生產流量鏡像到您的新版本,並檢查新版本是否提供不正確的結果或產生錯誤。最後,對部署的推出獲得更詳細的控制。舉例來說,您可以部署 1%,然後每小時增加 1%,只要服務沒有出現降級。Istio 透過幫助您以直接的方式執行這些任務,來增強 Kubernetes 的價值。有關部署的更詳細資訊和最佳實務,請參閱部署模型。
從這裡開始,您有兩個選擇
使用服務網格。在服務網格中,您將所有報告、路由、策略、安全性邏輯放入邊車代理程式中,這些代理程式會透明地注入到您的應用程式 Pod 中。業務邏輯保留在應用程式的程式碼中,不需要對應用程式程式碼進行任何變更。
在應用程式程式碼中實作所需的功能。大多數功能已經存在於各種程式庫中,例如 Java 程式語言的 Netflix 的 Hystrix 程式庫。但是,現在您必須變更程式碼才能使用這些程式庫。您必須付出額外的努力,您的程式碼會變得臃腫,業務邏輯會與報告、路由、策略、網路邏輯混雜在一起。由於您的微服務使用不同的程式語言,您必須學習、使用、更新多個程式庫。
請參閱Istio 服務網格,了解 Istio 如何執行此處提及的任務以及更多任務。在接下來的模組中,您將探索各種 Istio 功能。
您已準備好在 productpage
上啟用 Istio。