全部產品
Search
文件中心

Alibaba Cloud Service Mesh:基於流量規則配置實現流量泳道和流量降級

更新時間:Jun 30, 2024

流量泳道是指通過配置流量管理規則將應用的相關版本(或者其他特徵)隔離成一個獨立的運行環境(即泳道),並將滿足規則的請求流量路由到目標版本(或者其他特徵)的應用。您可以基於VirtualService和DestinationRule等流量規則實現流量泳道,同時通過配置流量降級,在某個版本(或者其他特徵)的應用不可用時,將流量發往一個指定的降級版本(或其他特徵)的應用。本文介紹如何在ASM中基於流量規則配置實現流量泳道和流量降級。

前提條件

步驟一:部署樣本服務

  1. 為default命名空間開啟自動注入。具體操作,請參見啟用自動注入

    關於自動注入的更多資訊,請參見配置Sidecar注入策略

  2. 使用資料面叢集的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

步驟二:建立流量規則實現流量泳道

  1. 建立DestinationRule流量規則。

    1. 使用以下內容,建立dr-mock.yaml檔案。

      以下檔案表示將mocka、mockb、mockc三個服務各自分為v1、v2、v3三個子集。

      展開查看dr-mock.yaml

      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        name: mocka
        namespace: istio-system
      spec:
        host: mocka.default.svc.cluster.local
        subsets:
          - labels:
              version: v1
            name: v1
          - labels:
              version: v2
            name: v2
          - labels:
              version: v3
            name: v3
      ---
      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        name: mockb
        namespace: istio-system
      spec:
        host: mockb.default.svc.cluster.local
        subsets:
          - labels:
              version: v1
            name: v1
          - labels:
              version: v2
            name: v2
          - labels:
              version: v3
            name: v3
      ---
      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        name: mockc
        namespace: istio-system
      spec:
        host: mockc.default.svc.cluster.local
        subsets:
          - labels:
              version: v1
            name: v1
          - labels:
              version: v2
            name: v2
          - labels:
              version: v3
            name: v3
    2. 使用ASM執行個體的KubeConfig,執行以下命令,生效DestinationRule流量規則。

      kubectl apply -f dr-mock.yaml
  2. 建立VirtualService流量規則。

    1. 使用以下內容,建立vs-mock.yaml檔案。

      以下檔案表示為mocka→mockb→mockc的服務調用鏈路建立泳道。建立泳道後,由一個版本的服務發出的請求,只能發送到相同版本的服務。

      展開vs-mock.yaml

      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: mockb
        namespace: istio-system
      spec:
        hosts:
          - mockb.default.svc.cluster.local
        http:
        - match:
          - sourceLabels:
              version: v1
          route:
          - destination:
              host: mockb.default.svc.cluster.local
              subset: v1
        - match:
          - sourceLabels:
              version: v2
          route:
          - destination:
              host: mockb.default.svc.cluster.local
              subset: v2
        - match:
          - sourceLabels:
              version: v3
          route:
          - destination:
              host: mockb.default.svc.cluster.local
              subset: v3
      ---
      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: mockc
        namespace: istio-system
      spec:
        hosts:
          - mockc.default.svc.cluster.local
        http:
        - match:
          - sourceLabels:
              version: v1
          route:
          - destination:
              host: mockc.default.svc.cluster.local
              subset: v1
        - match:
          - sourceLabels:
              version: v2
          route:
          - destination:
              host: mockc.default.svc.cluster.local
              subset: v2
        - match:
          - sourceLabels:
              version: v3
          route:
          - destination:
              host: mockc.default.svc.cluster.local
              subset: v3
    2. 使用ASM執行個體的KubeConfig,執行以下命令,生效VirtualService流量規則。

      kubectl apply -f vs-mock.yaml
  3. 建立網關引流規則。

    1. 使用以下內容,建立gw-mock.yaml檔案。

      以下檔案表示為mocka→mockb→mockc的服務調用鏈路建立網關引流規則。通過匹配發往網關請求的x-asm-prefer-tag Header,根據其中的Header值將請求路由到mocka服務的v1、v2、v3三個不同版本。

      展開查看gw-mock.yaml

      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:
              - '*'
      ---
      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: ingressgateway
        namespace: istio-system
      spec:
        gateways:
          - istio-system/ingressgateway
        hosts:
          - '*'
        http:
          - match:
              - headers:
                  x-asm-prefer-tag:
                    exact: v1
                uri:
                  exact: /mock
            route:
              - destination:
                  host: mocka.default.svc.cluster.local
                  subset: v1
          - match:
              - headers:
                  x-asm-prefer-tag:
                    exact: v2
                uri:
                  exact: /mock
            route:
              - destination:
                  host: mocka.default.svc.cluster.local
                  subset: v2
          - match:
              - headers:
                  x-asm-prefer-tag:
                    exact: v3
                uri:
                  exact: /mock
            route:
              - destination:
                  host: mocka.default.svc.cluster.local
                  subset: v3
    2. 使用ASM執行個體的KubeConfig,執行以下命令,生效網關引流規則。

      kubectl apply -f gw-mock.yaml

步驟三:驗證流量泳道是否生效

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

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

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

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

    1. 執行以下命令,查看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版本的相關服務,符合預期。

    2. 執行以下命令,查看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版本的相關服務,符合預期。

    3. 執行以下命令,查看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版本的相關服務,符合預期。

步驟四:配置流量泳道內的流量降級

  1. 使用以下內容,修改vs-mock.yaml檔案。

    以下檔案表示為mocka→mockb→mockc的服務調用鏈路建立泳道,同時,當mockb或mockc的v2、v3版本不可用時,請求將發往服務的v1版本調用鏈。

    展開查看vs-mock.yaml

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: mockb
      namespace: istio-system
    spec:
      hosts:
        - mockb.default.svc.cluster.local
      http:
      - match:
        - sourceLabels:
            version: v1
        route:
        - destination:
            host: mockb.default.svc.cluster.local
            subset: v1
      - match:
        - sourceLabels:
            version: v2
        route:
        - destination:
            host: mockb.default.svc.cluster.local
            subset: v2
          fallback:
            target:
              host: mockb.default.svc.cluster.local
              subset: v1
      - match:
        - sourceLabels:
            version: v3
        route:
        - destination:
            host: mockb.default.svc.cluster.local
            subset: v3
          fallback:
            target:
              host: mockb.default.svc.cluster.local
              subset: v1
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: mockc
      namespace: istio-system
    spec:
      hosts:
        - mockc.default.svc.cluster.local
      http:
      - match:
        - sourceLabels:
            version: v1
        route:
        - destination:
            host: mockc.default.svc.cluster.local
            subset: v1
      - match:
        - sourceLabels:
            version: v2
        route:
        - destination:
            host: mockc.default.svc.cluster.local
            subset: v2
          fallback:
            target:
              host: mockc.default.svc.cluster.local
              subset: v1
      - match:
        - sourceLabels:
            version: v3
        route:
        - destination:
            host: mockc.default.svc.cluster.local
            subset: v3
          fallback:
            target:
              host: mockc.default.svc.cluster.local
              subset: v1
  2. 使用ASM執行個體的KubeConfig,執行以下命令,修改原有VirtualService流量規則,生效流量降級配置。

    kubectl apply -f vs-mock.yaml

步驟五:驗證流量降級是否生效

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 無狀態

  3. 無狀態頁面的操作列,單擊mockb-v2工作負載對應的伸縮,在伸縮對話方塊,將所需容器組數量調整至1,單擊確定,在確認對話方塊,單擊確定,類比v2版本的mockb服務故障效果。

  4. 執行以下命令,查看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版本調用鏈路,實現了流量降級。