您可以使用寬松模式的流量泳道實現應用版本隔離,基于鏈路透傳請求頭和引流請求頭,將流量路由到不同泳道。泳道中服務相互調用時,若目標服務不存在當前泳道則轉發至基線泳道,保障鏈路完整性,簡化流量管理。
開始閱讀前,請確保您已經閱讀并理解了使用寬松模式流量泳道實現全鏈路流量管理及其相關的內容。
場景概述
本示例使用mocka、mockb、mockc三個服務創建代表服務調用鏈三個版本的三條泳道:s1、s2、s3。其中s1為基線泳道,包含完整的三個服務,s2僅包含mocka和mockc兩個服務,s3僅包含mockb一個服務。
步驟一:創建泳道組和對應泳道
創建泳道組。
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,單擊目標實例名稱,然后在左側導航欄,選擇 。
在流量泳道頁面,單擊創建泳道組,在創建泳道組面板,配置相關信息,然后單擊確定。
配置項
說明
泳道組名稱
本示例配置為test。
入口網關
選擇ingressgateway。
泳道模式
選擇寬松模式。
調用鏈路上下文透傳方式
選擇透傳trace id。
trace id請求頭
由于示例應用在調用鏈路中透傳了請求頭my-trace-id,因此本示例配置為my-trace-id。
引流請求頭
用于網關根據請求頭內容向不同泳道引流及泳道上下文保持,可任意指定。本示例配置為x-asm-prefer-tag。
泳道服務
選擇目標Kubernetes集群和default命名空間,在下方列表中選中mocka、mockb和mockc服務,單擊圖標,添加目標服務到已選擇區域。
配置完成后,會自動生成對應的流量標簽TrafficLabel。您可以在控制臺左側導航欄,單擊流量標簽進行查看。例如,針對mocka服務會生成如下的TrafficLabel。
apiVersion: istio.alibabacloud.com/v1beta1 kind: TrafficLabel metadata: labels: asm-system: 'true' provider: asm swimlane-group: test name: asm-swimlane-test-mocka namespace: default spec: rules: - labels: - name: asm-label valueFrom: - '$getExternalInboundRequestHeader(x-asm-prefer-tag, my-trace-id)' workloadSelector: labels: app: mocka
創建s1、s2、s3泳道,并分別綁定v1、v2、v3版本。
在流量泳道頁面的流量規則定義區域,單擊創建泳道。
在創建泳道對話框,配置相關信息,然后單擊確定。
配置項
說明
泳道名稱
三條泳道分別配置為s1、s2、s3。
配置服務標簽
標簽名稱:選擇ASM_TRAFFIC_TAG
標簽值:三條泳道分別選擇v1、v2、v3。
添加服務
s1泳道:選擇mocka(default)、mockb(default)、mockc(default)。
s2泳道:選擇mocka(default)、mockc(default)。
s3泳道:選擇mockb(default)。
創建s1泳道的示例圖如下:
三條泳道創建完成后,示例效果如下:
說明默認情況下,您在泳道組中創建的第一條泳道將被設定為基線泳道。您可以修改基線泳道,當流量發往其他泳道中不存在的服務時,通過回退機制將請求轉發至基線泳道。具體操作,請參見在寬松模式中修改基線泳道。
三條泳道創建完成后,針對泳道組中的每個服務都將生成泳道規則對應的目標規則DestinationRule和虛擬服務VirtualService。您可以在控制臺左側導航欄,選擇
或虛擬服務進行查看。例如,針對mocka服務會自動創建如下DestinationRule和VirtualService。apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: labels: asm-system: 'true' provider: asm swimlane-group: test name: trafficlabel-dr-test-default-mocka namespace: istio-system spec: host: mocka.default.svc.cluster.local subsets: - labels: ASM_TRAFFIC_TAG: v1 name: s1 - labels: ASM_TRAFFIC_TAG: v2 name: s2
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: labels: asm-system: 'true' provider: asm swimlane-group: test name: trafficlabel-vs-test-default-mocka namespace: istio-system spec: hosts: - mocka.default.svc.cluster.local http: - name: default route: - destination: host: mocka.default.svc.cluster.local subset: $asm-label fallback: target: host: mocka.default.svc.cluster.local subset: s1
創建三條泳道對應的引流規則。
在流量泳道頁面的流量規則定義區域,單擊目標泳道右側操作列下的引流規則。
在添加引流規則對話框,配置相關信息,然后單擊確定。
本文以泳道服務對應入口API均為
/mock
為例,為每條泳道配置相同的引流規則。配置項
說明
入口服務
選擇mocka.default.svc.cluster.local。
引流規則
配置三條泳道引流規則的名稱分別為r1、r2、r3,域名為*。
匹配請求的URI
配置匹配方式為精確,匹配內容為/mock。
為s1泳道添加引流規則的示例圖如下:
三條泳道的引流規則創建成功后,示例效果如下:
創建成功后,會自動生成每條泳道的引流規則,即虛擬服務VirtualService。例如,針對泳道s2會生成如下的虛擬服務VirtualService。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: labels: asm-system: 'true' provider: asm swimlane-group: test name: swimlane-ingress-vs-test-s2 namespace: istio-system spec: gateways: - istio-system/ingressgateway hosts: - '*' http: - match: - headers: x-asm-prefer-tag: exact: s2 uri: exact: /mock name: r2 route: - destination: host: mocka.default.svc.cluster.local subset: s2 fallback: target: host: mocka.default.svc.cluster.local subset: s1
步驟二:驗證全鏈路灰度功能是否生效
獲取ASM網關的公網IP。具體操作,請參見獲取ASM網關地址。
執行以下命令,設置環境變量。
xxx.xxx.xxx.xxx
為上一步獲取的IP。export ASM_GATEWAY_IP=xxx.xxx.xxx.xxx
驗證全鏈路灰度功能是否生效。
執行以下命令,查看s1泳道的訪問效果。
x-asm-prefer-tag
對應的值s1
為步驟一.2創建s1泳道時配置的泳道名稱。for i in {1..100}; do curl -H 'x-asm-prefer-tag: s1' -H'my-trace-id: x000'$i http://${ASM_GATEWAY_IP}/mock ; echo ''; sleep 1; done;
預期輸出:
-> mocka(version: v1, ip: 172.17.0.54)-> mockb(version: v1, ip: 172.17.0.129)-> mockc(version: v1, ip: 172.17.0.130)
由預期輸出得到,通過設置HTTP標頭
x-asm-prefer-tag: s1
聲明的流量流向s1泳道下的相關服務,符合預期。執行以下命令,查看s2泳道的訪問效果。
x-asm-prefer-tag
對應的值s2
為步驟一.2創建s2泳道時配置的泳道名稱。for i in {1..100}; do curl -H 'x-asm-prefer-tag: s2' -H'my-trace-id: x000'$i http://${ASM_GATEWAY_IP}/mock ; echo ''; sleep 1; done;
預期輸出:
-> mocka(version: v2, ip: 172.17.0.9)-> mockb(version: v1, ip: 172.17.0.129)-> mockc(version: v2, ip: 172.17.0.128)
由預期輸出得到,通過設置HTTP標頭
x-asm-prefer-tag: s2
聲明的流量流向s2泳道下的相關服務。當流量發往泳道s2中不存在的服務mockb時,流量通過回退機制發往基線泳道s1中的mockb服務,后續流量發往mockc服務時,目標重新設定為s2泳道中的mockc服務,符合預期。執行以下命令,查看s3泳道的訪問效果。
x-asm-prefer-tag
對應的值s3
為步驟一.2創建s3泳道時配置的泳道名稱。for i in {1..100}; do curl -H 'x-asm-prefer-tag: s3' -H'my-trace-id: x000'$i http://${ASM_GATEWAY_IP}/mock ; echo ''; sleep 1; done;
預期輸出:
mocka(version: v1, ip: 192.168.1.103)-> mockb(version: v3, ip: 192.168.1.120)-> mockc(version: v1, ip: 192.168.1.105)
由預期輸出得到,通過設置HTTP標頭
x-asm-prefer-tag: s3
聲明的流量流向s3泳道下的相關服務。當流量發往泳道s3中不存在的服務mocka、mockc時,流量通過回退機制發往基線泳道s1中的mocka、mockc服務,符合預期。
在寬松模式中修改基線泳道
修改基線泳道的前提是已創建寬松模式的泳道組,并在泳道組中創建至少兩條泳道。
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,單擊目標實例名稱,然后在左側導航欄,選擇 。
在流量泳道頁面的目標泳道組頁簽,在流量規則定義區域,單擊基線泳道右側的圖標。
選擇要修改的基線泳道名稱,然后單擊確定修改。