流量泳道是指通過配置流量管理規則將應用的相關版本(或者其他特徵)隔離成一個獨立的運行環境(即泳道),並將滿足規則的請求流量路由到目標版本(或者其他特徵)的應用。您可以基於VirtualService和DestinationRule等流量規則實現流量泳道,同時通過配置流量降級,在某個版本(或者其他特徵)的應用不可用時,將流量發往一個指定的降級版本(或其他特徵)的應用。本文介紹如何在ASM中基於流量規則配置實現流量泳道和流量降級。
前提條件
已建立ASM企業版或旗艦版執行個體,且執行個體版本為1.17及以上。具體操作,請參見建立ASM執行個體或升級ASM執行個體。
已添加Kubernetes叢集到ASM執行個體。具體操作,請參見添加叢集到ASM執行個體。
已建立名稱為ingressgateway的ASM網關。具體操作,請參見建立入口網關。
步驟一:部署樣本服務
為default命名空間開啟自動注入。具體操作,請參見啟用自動注入。
關於自動注入的更多資訊,請參見配置Sidecar注入策略。
使用資料面叢集的KubeConfig,執行以下命令,部署樣本服務。
樣本服務包含mocka、mockb、mockc三個服務,每個服務都有v1、v2、v3三個版本。
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
步驟二:建立流量規則實現流量泳道
建立DestinationRule流量規則。
使用以下內容,建立dr-mock.yaml檔案。
以下檔案表示將mocka、mockb、mockc三個服務各自分為v1、v2、v3三個子集。
使用ASM執行個體的KubeConfig,執行以下命令,生效DestinationRule流量規則。
kubectl apply -f dr-mock.yaml
建立VirtualService流量規則。
使用以下內容,建立vs-mock.yaml檔案。
以下檔案表示為mocka→mockb→mockc的服務調用鏈路建立泳道。建立泳道後,由一個版本的服務發出的請求,只能發送到相同版本的服務。
使用ASM執行個體的KubeConfig,執行以下命令,生效VirtualService流量規則。
kubectl apply -f vs-mock.yaml
建立網關引流規則。
使用以下內容,建立gw-mock.yaml檔案。
以下檔案表示為mocka→mockb→mockc的服務調用鏈路建立網關引流規則。通過匹配發往網關請求的
x-asm-prefer-tag
Header,根據其中的Header值將請求路由到mocka服務的v1、v2、v3三個不同版本。使用ASM執行個體的KubeConfig,執行以下命令,生效網關引流規則。
kubectl apply -f gw-mock.yaml
步驟三:驗證流量泳道是否生效
擷取ASM網關的公網IP。具體操作,請參見擷取ASM網關地址。
執行以下命令,設定環境變數。
xxx.xxx.xxx.xxx
為上一步擷取的IP。export ASM_GATEWAY_IP=xxx.xxx.xxx.xxx
驗證全灰階鏈路功能是否生效。
執行以下命令,查看v1泳道的訪問效果。
for i in {1..100}; do curl -H 'x-asm-prefer-tag: v1' 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: v1
聲明的流量流向v1版本的相關服務,符合預期。執行以下命令,查看v2泳道的訪問效果。
for i in {1..100}; do curl -H 'x-asm-prefer-tag: v2' 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: v2
聲明的流量流向v2版本的相關服務,符合預期。執行以下命令,查看v3泳道的訪問效果。
for i in {1..100}; do curl -H 'x-asm-prefer-tag: v3' 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: v3
聲明的流量流向v3版本的相關服務,符合預期。
步驟四:配置流量泳道內的流量降級
使用以下內容,修改vs-mock.yaml檔案。
以下檔案表示為mocka→mockb→mockc的服務調用鏈路建立泳道,同時,當mockb或mockc的v2、v3版本不可用時,請求將發往服務的v1版本調用鏈。
使用ASM執行個體的KubeConfig,執行以下命令,修改原有VirtualService流量規則,生效流量降級配置。
kubectl apply -f vs-mock.yaml
步驟五:驗證流量降級是否生效
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在無狀態頁面的操作列,單擊mockb-v2工作負載對應的伸縮,在伸縮對話方塊,將所需容器組數量調整至1,單擊確定,在確認對話方塊,單擊確定,類比v2版本的mockb服務故障效果。
執行以下命令,查看v2泳道的訪問效果。
for i in {1..100}; do curl -H 'x-asm-prefer-tag: v2' http://${ASM_GATEWAY_IP}/mock ; echo ''; sleep 1; done;
預期輸出:
-> mocka(version: v2, ip: 172.17.0.9)-> mockb(version: v1, ip: 172.17.0.126)-> mockc(version: v1, ip: 172.17.0.128)
由預期輸出得到,通過設定HTTP標題
x-asm-prefer-tag: v2
聲明的流量流向v2版本的相關服務。在流量流經v2版本的mockb服務時,由於v2版本的mockb服務發生故障,請求後續發往服務的v1版本調用鏈路,實現了流量降級。