全部產品
Search
文件中心

Alibaba Cloud Service Mesh:情境二:在鏈路中透傳自訂要求標頭

更新時間:Jul 17, 2024

您可以使用寬鬆模式的流量泳道實現應用版本隔離,將鏈路透傳要求標頭指定為引流要求標頭,使用鏈路透傳要求標頭的內容向不同泳道引流。泳道中服務相互調用時,若目標服務不存在當前泳道則轉寄至基準泳道,保障鏈路完整性,簡化流量管理。

重要

開始閱讀前,請確保您已經閱讀並理解了使用寬鬆模式流量泳道實現全鏈路流量管理及其相關的內容。

情境概述

本樣本使用mocka、mockb、mockc三個服務建立代表格服務調用鏈三個版本的三個泳道:s1、s2、s3。其中s1為基準泳道,包含完整的三個服務,s2僅包含mocka、mockc兩個服務,s3僅包含mockb一個服務。同時,鏈路透傳要求標頭與引流要求標頭都指定為my-request-id。

步驟一:建立泳道組和對應泳道

  1. 建立泳道組。

    1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

    2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇流量管理中心 > 流量泳道

    3. 流量泳道頁面,單擊建立泳道組,在建立泳道組面板,配置相關資訊,然後單擊確定

      配置項

      說明

      泳道組名稱

      本樣本配置為test

      入口網關

      選擇ingressgateway

      泳道模式

      選擇寬鬆模式

      調用鏈路上下文透傳方式

      選擇自訂要求標頭透傳

      鏈路透傳要求標頭

      配置為my-request-id

      泳道服務

      選擇目標Kubernetes叢集和default命名空間,在下方列表中選中mockamockbmockc服務,單擊移動表徵圖,添加目標服務到已選擇地區。

  2. 建立s1、s2、s3泳道,並分別綁定v1、v2、v3版本。

    1. 流量泳道頁面的流量規則定義地區,單擊建立泳道

    2. 建立泳道對話方塊,配置相關資訊,然後單擊確定

      配置項

      說明

      泳道名稱

      三條泳道分別配置為s1s2s3

      佈建服務標籤

      標籤名稱:配置為ASM_TRAFFIC_TAG

      標籤值:三條泳道分別配置為v1v2v3

      添加服務

      s1泳道:選擇mocka(default)mockb(default)mockc(default)

      s2泳道:選擇mocka(default)mockc(default)

      s3泳道:選擇mockb(default)。

      建立s1泳道的樣本圖如下。

      image.png

      三個泳道建立完成後,樣本效果如下。預設情況下,您在泳道組中建立的第一個泳道將被設定為基準泳道。您也可以修改基準泳道,當流量發往其它泳道中不存在的服務時,通過回退機制將請求轉寄至基準泳道。關於修改基準泳道的具體操作,請參見修改基準泳道image.png

      三個泳道建立完成後,針對泳道組中的每個服務都將產生泳道規則對應的目標規則DestinationRule和虛擬服務VirtualService。您可以在控制台左側導覽列,選擇流量管理中心 > 目標規則虛擬服務進行查看。例如,針對mocka服務會自動建立如下DestinationRule和VirtualService。

      展開查看DestinationRule YAML樣本

      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
      

      展開查看VirtualService YAML樣本

      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:
          - match:
              - headers:
                  my-request-id:
                    exact: s1
            route:
              - destination:
                  host: mocka.default.svc.cluster.local
                  subset: s1
                fallback:
                  target:
                    host: mocka.default.svc.cluster.local
                    subset: s1
          - match:
              - headers:
                  my-request-id:
                    exact: s2
            route:
              - destination:
                  host: mocka.default.svc.cluster.local
                  subset: s2
                fallback:
                  target:
                    host: mocka.default.svc.cluster.local
                    subset: s1
          - match:
              - headers:
                  my-request-id:
                    exact: s3
            route:
              - destination:
                  host: mocka.default.svc.cluster.local
                  subset: s3
                fallback:
                  target:
                    host: mocka.default.svc.cluster.local
                    subset: s1
      
  3. 建立三個泳道對應的引流規則。

    1. 流量泳道頁面的流量規則定義地區,單擊目標泳道右側操作列下的引流規則

    2. 添加引流規則對話方塊,配置相關資訊,然後單擊確定

      本文以泳道服務對應入口API均為/mock為例,為每個泳道配置相同的引流規則。

      配置項

      說明

      入口服務

      選擇mocka.default.svc.cluster.local

      引流規則

      配置三個泳道的引流規則名稱分別為r1r2r3網域名稱*

      匹配請求的URI

      配置匹配方式精確匹配內容/mock

      為s1泳道添加引流規則的樣本圖如下:

      image.png

      三個泳道的引流規則建立成功後,樣本效果如下:image.png

      建立成功後,會自動產生每條泳道的引流規則,即虛擬服務VirtualService。例如,針對s2泳道會產生如下的虛擬服務VirtualService。

      展開查看VirtualService YAML樣本

      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:
                  my-request-id:
                    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
      

步驟二:驗證全鏈路灰階功能是否生效

  1. 擷取ASM網關的公網IP。具體操作,請參見擷取ASM網關地址

  2. 執行以下命令,設定環境變數。

    xxx.xxx.xxx.xxx為上一步擷取的IP。

    export ASM_GATEWAY_IP=xxx.xxx.xxx.xxx
  3. 驗證全鏈路灰階功能是否生效。

    1. 執行以下命令,查看s1泳道的訪問效果。

      my-request-id對應的值s1步驟一.2建立s1泳道時配置的泳道名稱。

      for i in {1..100};  do curl -H'my-request-id: 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標題my-request-id: s1聲明的流量流向s1泳道下的相關服務,符合預期。

    2. 執行以下命令,查看s2泳道的訪問效果。

      my-request-id對應的值s2步驟一.2建立s2泳道時配置的泳道名稱。

      for i in {1..100};  do curl -H'my-request-id: s2' http://${ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;

      預期輸出:

      mocka(version: v2, ip: 192.168.1.101)-> mockb(version: v1, ip: 192.168.1.100)-> mockc(version: v2, ip: 192.168.1.116)

      可以看到,通過設定HTTP標題my-request-id: s2聲明的流量流向s2泳道下的相關服務。當流量發往泳道s2中不存在的服務mockb時,流量通過回退機制發往基準泳道s1中的mockb服務,後續流量發往mockc服務時,目標重新設定為s2泳道中的mockc服務,符合預期。

    3. 執行以下命令,查看s3泳道的訪問效果。

      my-request-id對應的值s3步驟一.2建立s3泳道時配置的泳道名稱。

      for i in {1..100};  do curl -H'my-request-id: s3' 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標題my-request-id: s3聲明的流量流向s3泳道下的相關服務。當流量發往泳道s3中不存在的服務mocka、mockc時,流量通過回退機制發往基準泳道s1中的mocka、mockc服務,符合預期。