idou老師教你學Istio12 : Istio 實現流量鏡像

微服務爲我們帶來了快速開發部署的優秀特性,而如何降低開發和變更的風險成爲了一個問題。Istio的流量鏡像,也稱爲影子流量,是將生產流量鏡像拷貝到測試集羣或者新的版本中,在引導實時流量之前進行測試,可以有效地降低版本變更風險。

流量鏡像有以下優點:

1.當流量鏡像到不同的服務時,會發生在請求的關鍵路徑之外,這樣流量鏡像產生的任何問題都不會影響到生產;

2.忽略對任何鏡像流量的響應; 流量被視爲“即發即忘”,這樣就不會干擾到正常的生產流量的響應;

3.當流量被鏡像時,請求將通過其主機/授權報頭髮送到鏡像服務附上 –shadow,用以區分流量從何處被鏡像到何處;

4.利用實時生產用例和流量可以有更真實的測試服務環境,有效降低了部署的風險;

下面介紹幾種典型的使用場景可以發揮流量鏡像的優勢:

1.用於測試:測試集羣的測試可以使用生產實例真實流量,不會影響正常生產的關鍵路徑。

2.用於新版本校驗:可以實時對比生產流量和鏡像流量的輸出結果。

3.用於協作服務版本回退:當用到鏡像流量的服務需要修改協作服務時,因爲鏡像模式添加了-shadow標記, 所以可以正常處理鏡像請求,並在提交之前回滾。不會讓鏡像版本的更改影響生產版本。

4.隔離測試數據庫:與數據處理相關的業務,可以使用空的數據存儲並加載測試數據,針對該數據進行鏡像流量操作,實現測試數據的隔離。

下面通過實例來演示一下,先讓所有流量都到v1版本,然後使用規則將流量鏡像到v2版本:

環境準備:需要httpbin和tutum/curl兩個應用鏡像

步驟一(配置並啓動服務):

首先部署兩個版本的httpbin服務:

httpbin-v1:

idou老師教你學Istio12 : Istio 實現流量鏡像

httpbin-v2:

idou老師教你學Istio12 : Istio 實現流量鏡像

部署sleep服務,爲curl來提供負載:

idou老師教你學Istio12 : Istio 實現流量鏡像

當完成以上的配置文件後,就可以用kubectl create –f ./yourconfig.yaml來啓動服務,用kubectl get pod 來查看服務的運行狀態:

idou老師教你學Istio12 : Istio 實現流量鏡像

啓動httpbin service:

先通過kubectl get svc 查看是否有httpbin service。如果已創建service, 需要用kubectl delete service httpbin 刪除,並通過下圖所示yaml 新建service:

idou老師教你學Istio12 : Istio 實現流量鏡像

步驟二(創建路由策略):

1.使用kubectl delete virtualservice httpbin,kubectl delete destinationrule httpbin刪除已有httpbin策略,並通過下圖yaml來創建新的路由策略,將全部的流量導入到v1版本:

idou老師教你學Istio12 : Istio 實現流量鏡像

通過kubectl create –f ./yourrules.yaml生效:

idou老師教你學Istio12 : Istio 實現流量鏡像

2.現在服務已經搭建好了,我們向服務發送一些流量:

idou老師教你學Istio12 : Istio 實現流量鏡像

3.分別查看httpbin的v1,v2的pod中的日誌:

idou老師教你學Istio12 : Istio 實現流量鏡像

我們可以發現v1 pod中有剛纔流量訪問的記錄,而v2的pod中日誌爲空,說明流量並沒有進入到v2的pod中,這與我們全部流量導入到v1中的策略相匹配。

步驟三(鏡像流量):

  1. 修改路由規則將流量鏡像到v2服務:

idou老師教你學Istio12 : Istio 實現流量鏡像

刪除之前部署的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 發送流量:

idou老師教你學Istio12 : Istio 實現流量鏡像

3.查看v1和v2的訪問日誌:

idou老師教你學Istio12 : Istio 實現流量鏡像

通過對比記錄的時間戳我們可以發現在更改策略後,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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章