服務網格ASM支持通過流量標簽功能將應用的相關版本(或者其他特征)隔離成一個獨立的運行環境(即泳道),然后通過設置泳道規則,將滿足規則的請求流量路由到目標版本(或者其他特征)的應用上。本文介紹如何在ASM中使用泳道模式下的流量管理功能。
前提條件
已添加集群到ASM實例。具體操作,請參見添加集群到ASM實例。
已創建名稱為ingressgateway的ASM網關。具體操作,請參見創建入口網關服務。
已創建名稱為ingressgateway且命名空間為istio-system的網關規則。具體操作,請參見管理網關規則。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: ingressgateway namespace: istio-system spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - '*'
功能介紹
灰度發布會根據請求內容或者請求流量的比例將線上流量的一小部分轉發至新版本,待灰度驗證通過后,逐步調大新版本的請求流量,是一種循序漸進的發布方式。
全鏈路灰度治理策略主要專注于整個調用鏈,不關心鏈路上經過具體哪些微服務。流量控制視角從服務轉移至請求鏈路上。您僅需制定少量的治理規則,便可構建從網關到整個后端服務的多個流量隔離環境,有效保障多個服務順利安全發布以及服務多版本并行開發,進一步促進業務的快速發展。更多信息,請參見流量標簽TrafficLabel說明。
本文示例場景如下。圖中有三個泳道s1、s2、s3,分別包含三個服務mocka、mockb、mockc。在ASM控制臺部署泳道后,您可以查看各個泳道的流量分布是否符合預期。
步驟一:部署示例服務
為default命名空間啟用Sidecar網格代理自動注入。具體操作,請參見啟用自動注入。
關于自動注入的更多信息,請參見開啟Sidecar自動注入。
在ACK集群中執行以下命令,部署示例服務。
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v1/application-v1.yaml kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v2/application-v2.yaml kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v3/application-v3.yaml
步驟二:創建泳道組和對應泳道
創建泳道組。
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,單擊目標實例名稱,然后在左側導航欄,選擇 。
在流量泳道頁面,單擊創建泳道組,在創建泳道組面板,配置相關信息,然后單擊確定。
配置項
說明
泳道組名稱
本示例配置為test。
入口網關
選擇ingressgateway。
泳道服務
選擇目標Kubernetes集群和default命名空間,在下方列表中選中mocka、mockb和mockc服務,單擊圖標,添加目標服務到已選擇區域。
配置完成后,會自動生成對應的流量標簽TrafficLabel。
apiVersion: istio.alibabacloud.com/v1beta1 kind: TrafficLabel metadata: labels: asm-system: 'true' provider: asm name: asm-trafficlabel-global namespace: istio-system spec: rules: - labels: - name: asm-label valueFrom: - $getLabel(ASM_TRAFFIC_TAG)
創建s1、s2、s3泳道,并分別綁定v1、v2、v3版本。
下文以創建s1泳道為例進行說明,請參照以下步驟創建s2和s3泳道。
在流量泳道頁面的流量規則定義區域,單擊創建泳道。
在創建泳道對話框,配置相關信息,然后單擊確定。
配置項
說明
泳道名稱
本示例配置為s1。
說明訪問服務時,帶上對應的Header請求(
'x-asm-prefer-tag: 泳道名稱'
)會路由到對應的版本。配置服務標簽
本示例配置為v1。
添加服務
選擇mocka(default)、mockb(default)和mockc(default)。
三個泳道創建完成后,示例效果如下:
每創建一個泳道,會自動創建對應的目標規則DestinationRule。例如s1泳道創建完成后,會自動創建如下目標規則DestinationRule示例。
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: creationTimestamp: '2023-05-29T09:06:09Z' generation: 3 labels: asm-system: 'true' provider: asm swimlane-group: test name: trafficlabel-dr-test-default-mocka namespace: istio-system resourceVersion: '1310364657' uid: 7112ce64-0176-4ff3-b5f3-66263085**** spec: host: mocka.default.svc.cluster.local subsets: - labels: ASM_TRAFFIC_TAG: v1 name: s1 - labels: ASM_TRAFFIC_TAG: v1 name: v1 - labels: ASM_TRAFFIC_TAG: v2 name: v2 - labels: ASM_TRAFFIC_TAG: v2 name: s2 - labels: ASM_TRAFFIC_TAG: v3 name: v3 - labels: ASM_TRAFFIC_TAG: v3 name: s3
創建各個泳道對應的引流規則。
下文以創建s1泳道的引流規則為例進行說明,請參照以下步驟創建s2和s3泳道的引流規則。
在流量泳道頁面的流量規則定義區域,單擊目標泳道右側操作列下的引流規則。
在添加引流規則對話框,配置相關信息,然后單擊確定。
本文以泳道服務對應入口API均為
/mock
為例,為每個泳道配置相同的引流規則。配置項
說明
入口服務
選擇mocka.default.svc.cluster.local。
引流規則
配置名稱為r1,域名為*。
匹配請求的URI
配置匹配方式為精確,匹配內容為/mock。
三個泳道的引流規則創建成功后,示例效果如下:
創建成功后,會自動生成如下虛擬服務VirtualService示例。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: creationTimestamp: '2023-05-29T09:13:00Z' generation: 3 labels: asm-system: 'true' istioGateway: ingressgateway provider: asm name: ingressgateway namespace: istio-system resourceVersion: '1310388638' uid: d60baa2f-3a12-472f-881a-15d21004**** spec: gateways: - istio-system/ingressgateway hosts: - '*' http: - match: - headers: x-asm-prefer-tag: exact: s2 uri: exact: /mock name: swimelane-ingress-route-test-s2-rule2 route: - destination: host: mocka.default.svc.cluster.local subset: s2 - match: - headers: x-asm-prefer-tag: exact: s3 uri: exact: /mock name: swimelane-ingress-route-test-s3-rule3 route: - destination: host: mocka.default.svc.cluster.local subset: s3 - match: - headers: x-asm-prefer-tag: exact: s1 uri: exact: /mock name: swimelane-ingress-route-test-s1-rule1 route: - destination: host: mocka.default.svc.cluster.local subset: s1 apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: creationTimestamp: '2023-05-29T09:13:00Z' generation: 3 labels: asm-system: 'true' istioGateway: ingressgateway provider: asm name: ingressgateway namespace: istio-system resourceVersion: '1310388638' uid: d60baa2f-3a12-472f-881a-15d21004**** spec: gateways: - istio-system/ingressgateway hosts: - '*' http: - match: - headers: x-asm-prefer-tag: exact: s2 uri: exact: /mock name: swimelane-ingress-route-test-s2-rule2 route: - destination: host: mocka.default.svc.cluster.local subset: s2 - match: - headers: x-asm-prefer-tag: exact: s3 uri: exact: /mock name: swimelane-ingress-route-test-s3-rule3 route: - destination: host: mocka.default.svc.cluster.local subset: s3 - match: - headers: x-asm-prefer-tag: exact: s1 uri: exact: /mock name: swimelane-ingress-route-test-s1-rule1 route: - destination: 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' 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' http://${ASM_GATEWAY_IP}/mock ; echo ''; sleep 1; done;
預期輸出:
-> mocka(version: v2, ip: 172.17.0.9)-> mockb(version: v2, ip: 172.17.0.126)-> mockc(version: v2, ip: 172.17.0.128)
由預期輸出得到,通過設置HTTP標頭
x-asm-prefer-tag: s2
聲明的流量流向s2泳道下的相關服務,符合預期。執行以下命令,查看s3泳道的訪問效果。
x-asm-prefer-tag
對應的值s3
為步驟2創建s3泳道時配置的泳道名稱。for i in {1..100}; do curl -H 'x-asm-prefer-tag: s3' http://${ASM_GATEWAY_IP}/mock ; echo ''; sleep 1; done;
預期輸出:
-> mocka(version: v3, ip: 172.17.0.132)-> mockb(version: v3, ip: 172.17.0.127)-> mockc(version: v3, ip: 172.17.0.69)
由預期輸出得到,通過設置HTTP標頭
x-asm-prefer-tag: s3
聲明的流量流向s3泳道下的相關服務,符合預期。
(可選)步驟四:查看網格拓撲
若您已通過ASM控制臺開啟網格拓撲的可觀測性,可以查看在上述請求下的網格拓撲。具體操作,請參見通過ASM控制臺開啟網格拓撲的可觀測性。