使用泳道模式下的流量管理功能

服务网格ASM支持通过流量标签功能将应用的相关版本(或者其他特征)隔离成一个独立的运行环境(即泳道),然后通过设置泳道规则,将满足规则的请求流量路由到目标版本(或者其他特征)的应用上。本文介绍如何在ASM中使用泳道模式下的流量管理功能。

前提条件

  • 已创建ASM企业版或旗舰版实例,且版本为1.17.2.22及以上。具体操作,请参见创建ASM实例升级ASM实例

  • 已添加集群到ASM实例。具体操作,请参见添加集群到ASM实例

  • 已创建名称为ingressgateway的ASM网关。具体操作,请参见创建入口网关服务

  • 已创建名称为ingressgateway且命名空间为istio-system的网关规则。具体操作,请参见管理网关规则

    展开查看Gateway 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:
            - '*'
    

功能介绍

灰度发布会根据请求内容或者请求流量的比例将线上流量的一小部分转发至新版本,待灰度验证通过后,逐步调大新版本的请求流量,是一种循序渐进的发布方式。

全链路灰度治理策略主要专注于整个调用链,不关心链路上经过具体哪些微服务。流量控制视角从服务转移至请求链路上。您仅需制定少量的治理规则,便可构建从网关到整个后端服务的多个流量隔离环境,有效保障多个服务顺利安全发布以及服务多版本并行开发,进一步促进业务的快速发展。更多信息,请参见流量标签TrafficLabel说明

本文示例场景如下。图中有三个泳道s1、s2、s3,分别包含三个服务mocka、mockb、mockc。在ASM控制台部署泳道后,您可以查看各个泳道的流量分布是否符合预期。泳道模式的全链路灰度

步骤一:部署示例服务

  1. 为default命名空间启用Sidecar网格代理自动注入。具体操作,请参见启用自动注入

    关于自动注入的更多信息,请参见开启Sidecar自动注入

  2. 在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

步骤二:创建泳道组和对应泳道

  1. 创建泳道组。

    1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

    2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择流量管理中心 > 流量泳道

    3. 流量泳道页面,单击创建泳道组,在创建泳道组面板,配置相关信息,然后单击确定

      配置项

      说明

      泳道组名称

      本示例配置为test

      入口网关

      选择ingressgateway

      泳道服务

      选择目标Kubernetes集群default命名空间,在下方列表中选中mockamockbmockc服务,单击移动图标,添加目标服务到已选择区域。

      配置完成后,会自动生成对应的流量标签TrafficLabel。

      展开查看TrafficLabel YAML文件

      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)
      

  2. 创建s1、s2、s3泳道,并分别绑定v1、v2、v3版本。

    下文以创建s1泳道为例进行说明,请参照以下步骤创建s2和s3泳道。

    1. 流量泳道页面的流量规则定义区域,单击创建泳道

    2. 创建泳道对话框,配置相关信息,然后单击确定

      配置项

      说明

      泳道名称

      本示例配置为s1

      说明

      访问服务时,带上对应的Header请求('x-asm-prefer-tag: 泳道名称')会路由到对应的版本。

      配置服务标签

      本示例配置为v1。

      添加服务

      选择mocka(default)mockb(default)mockc(default)

      创建泳道

      三个泳道创建完成后,示例效果如下:创建泳道

      每创建一个泳道,会自动创建对应的目标规则DestinationRule。例如s1泳道创建完成后,会自动创建如下目标规则DestinationRule示例。

      展开查看DestinationRule YAML示例

      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
      

  3. 创建各个泳道对应的引流规则。

    下文以创建s1泳道的引流规则为例进行说明,请参照以下步骤创建s2和s3泳道的引流规则。

    1. 流量泳道页面的流量规则定义区域,单击目标泳道右侧操作列下的引流规则

    2. 添加引流规则对话框,配置相关信息,然后单击确定

      本文以泳道服务对应入口API均为/mock为例,为每个泳道配置相同的引流规则。

      配置项

      说明

      入口服务

      选择mocka.default.svc.cluster.local

      引流规则

      配置名称r1域名*

      匹配请求的URI

      配置匹配方式精确匹配内容/mock

      三个泳道的引流规则创建成功后,示例效果如下:引流规则

      创建成功后,会自动生成如下虚拟服务VirtualService示例。

      展开查看VirtualService YAML示例

      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
      

步骤三:验证全链路灰度功能是否生效

  1. 获取ASM网关的公网IP。具体操作,请参见获取ASM网关地址

  2. 执行以下命令,设置环境变量。

    xxx.xxx.xxx.xxx为上一步获取的IP。

    export ASM_GATEWAY_IP=xxx.xxx.xxx.xxx
  3. 验证全链路灰度功能是否生效。

    1. 执行以下命令,查看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泳道下的相关服务,符合预期。

    2. 执行以下命令,查看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泳道下的相关服务,符合预期。

    3. 执行以下命令,查看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控制台开启网格拓扑的可观测性网格拓扑..png