idou老師教你學Istio12 : Istio 實現流量鏡像
流量鏡像有以下優點:
1.當流量鏡像到不同的服務時,會發生在請求的關鍵路徑之外,這樣流量鏡像產生的任何問題都不會影響到生產;
2.忽略對任何鏡像流量的響應; 流量被視為“即發即忘”,這樣就不會幹擾到正常的生產流量的響應;
3.當流量被鏡像時,請求將通過其主機/授權報頭發送到鏡像服務附上 –shadow,用以區分流量從何處被鏡像到何處;
4.利用實時生產用例和流量可以有更真實的測試服務環境,有效降低了部署的風險;
下面介紹幾種典型的使用場景可以發揮流量鏡像的優勢:
1.用於測試:測試集群的測試可以使用生產實例真實流量,不會影響正常生產的關鍵路徑。
2.用於新版本校驗:可以實時對比生產流量和鏡像流量的輸出結果。
3.用於協作服務版本回退:當用到鏡像流量的服務需要修改協作服務時,因為鏡像模式添加了-shadow標記, 所以可以正常處理鏡像請求,並在提交之前回滾。不會讓鏡像版本的更改影響生產版本。
4.隔離測試數據庫:與數據處理相關的業務,可以使用空的數據存儲並加載測試數據,針對該數據進行鏡像流量操作,實現測試數據的隔離。
下面通過實例來演示一下,先讓所有流量都到v1版本,然後使用規則將流量鏡像到v2版本:
環境準備:需要httpbin和tutum/curl兩個應用鏡像
步驟一(配置並啟動服務):
首先部署兩個版本的httpbin服務:
httpbin-v1:
httpbin-v2:
部署sleep服務,為curl來提供負載:
當完成以上的配置文件後,就可以用kubectl create –f ./yourconfig.yaml來啟動服務,用kubectl get pod 來查看服務的運行狀態:
啟動httpbin service:
先通過kubectl get svc 查看是否有httpbin service。如果已創建service, 需要用kubectl delete service httpbin 刪除,並通過下圖所示yaml 新建service:
步驟二(創建路由策略):
1.使用kubectl delete virtualservice httpbin,kubectl delete destinationrule httpbin刪除已有httpbin策略,並通過下圖yaml來創建新的路由策略,將全部的流量導入到v1版本:
通過kubectl create –f ./yourrules.yaml生效:
2.現在服務已經搭建好了,我們向服務發送一些流量:
3.分別查看httpbin的v1,v2的pod中的日誌:
我們可以發現v1 pod中有剛才流量訪問的記錄,而v2的pod中日誌為空,說明流量並沒有進入到v2的pod中,這與我們全部流量導入到v1中的策略相匹配。
步驟三(鏡像流量):
- 修改路由規則將流量鏡像到v2服務:
刪除之前部署的virtualservice規則,將上圖的yaml用kubectl create –f 部署,其中mirror字段將流量鏡像指定到v2服務。
2.發送流量:
通過指令
kubectl exec -it $SLEEP_POD -c sleep -- sh -c ‘curl http://httpbin:8080/headers‘ | python -m json.tool 發送流量:
3.查看v1和v2的訪問日誌:
通過對比記錄的時間戳我們可以發現在更改策略後,v1的流量被鏡像到了v2。日誌中的v2報文比v1大是流量被標記為影子流量所致。
步驟四(清除):
1.清除路由規則:
kubectl delete virtualservice httpbin
kubectl delete destinationrule httpbin
2.關閉httpbin/sleep服務:
kubectl delete deploy httpbin-v1 httpbin-v2 sleep
kubectl delete svc httpbin
通過以上步驟我們知道了如何設置路由規則來引入流量鏡像。
相關服務請訪問https://support.huaweicloud.com/cce/index.html?cce_helpcenter_2019
idou老師教你學Istio12 : Istio 實現流量鏡像