全链路灰度有两种使用方式,本文介绍如何在ASM中使用全链路灰度的泳道模式。

前提条件

功能介绍

灰度发布的核心思想是根据请求内容或者请求流量的比例将线上流量的一小部分转发至新版本,待灰度验证通过后,逐步调大新版本的请求流量,是一种循序渐进的发布方式。全链路灰度治理策略主要专注于整个调用链,它不关心链路上经过具体哪些微服务,流量控制视角从服务转移至请求链路上,仅需要少量的治理规则即可构建出从网关到整个后端服务的多个流量隔离环境,有效保障了多个服务顺利安全发布以及服务多版本并行开发,进一步促进业务的快速发展。

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

步骤一:部署示例服务

  1. 为default命名空间开启自动注入。
    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 在网格详情页面左侧导航栏,选择网格实例 > 全局命名空间
    5. default命名空间右侧的自动注入列下,单击启用Sidecar自动注入
      关于自动注入的更多信息,请参见多种方式灵活开启自动注入
  2. 在ACK集群中执行如下命令,部署示例服务。
    kubectl apply -f https://raw.githubusercontent.com/AliyunContainerService/asm-labs/main/fulllink-gray/swimlane/v1/application-v1.yaml
    kubectl apply -f https://raw.githubusercontent.com/AliyunContainerService/asm-labs/main/fulllink-gray/swimlane/v2/application-v2.yaml
    kubectl apply -f https://raw.githubusercontent.com/AliyunContainerService/asm-labs/main/fulllink-gray/swimlane/v3/application-v3.yaml

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

  1. 创建泳道组。
    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 在网格详情页面左侧导航栏选择流量管理中心 > 全链路灰度
    5. 全链路灰度页面,单击创建泳道组,在创建泳道组面板,配置相关参数,然后单击确定
      部分参数说明如下:
      参数说明
      泳道组名称本文配置为test
      入口网关本文配置为ingressgateway
      泳道服务选择目标Kubernetes集群命名空间,在下方列表中选中mockamockbmockc服务,单击移动图标,添加目标服务到已选择区域。
  2. 创建s1、s2、s3泳道,并分别绑定v1、v2、v3版本。
    本文以创建s1泳道为例进行说明,请参照以下步骤创建s2和s3泳道。
    1. 全链路灰度页面的流量分配区域,单击创建泳道
    2. 创建泳道对话框中,配置相关参数,然后单击确定
      创建泳道部分参数说明如下:
      参数说明
      泳道名称支持配置1~63个字符,可包含数字、字母和短划线(-)。本文配置为s1
      说明 访问服务时,带上对应的Header请求('x-asm-prefer-tag: 泳道名称')会路由到对应的版本。
      配置服务标签配置为v1
      添加服务选择mocka(default)mockb(default)mockc(default)
      创建完成后,示例效果如下:创建泳道
  3. 创建各个泳道对应的引流规则。
    1. 全链路灰度页面的流量分配区域,单击目标泳道右侧操作列下的引流规则
    2. 添加引流规则对话框中,配置相关参数,然后单击确定
      本文以泳道服务对应入口API均为/mock为例,为每个泳道配置相同的引流规则,配置信息如下。
      参数说明
      入口服务配置为mocka.default.svc.cluster.local
      引流规则配置名称r1域名*
      匹配URI配置匹配方式精确匹配内容/mock
      各个泳道的引流规则创建成功后,示例效果如下:引流规则

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

本文以s1和s2泳道进行验证说明,您可以参照以下步骤自行验证s3泳道。

  1. 执行以下命令,查看s1泳道的访问效果。
    s1步骤2创建s1泳道时配置的泳道名称。
    curl -H 'x-asm-prefer-tag: s1' http://${yourGatewayDomainOrIp}/mock
    预期输出:
    -> mocka(version: v1, ip: 10.0.250.213)-> mockb(version: v1, ip: 10.0.250.234)-> mockc(version: v1, ip: 10.0.250.220)
    通过Header x-asm-prefer-tag: s1声明流量应该流向泳道s1下的相关服务,由预期输出得到,符合预期。
  2. 执行以下命令,查看s2泳道的访问效果。
    s2步骤2创建s2泳道时配置的泳道名称。
    curl -H 'x-asm-prefer-tag: s2' http://${yourGatewayDomainOrIp}/mock
    预期输出:
    -> mocka(version: v2, ip: 10.0.250.229)-> mockb(version: v2, ip: 10.0.250.237)-> mockc(version: v2, ip: 10.0.250.238)
    通过Header x-asm-prefer-tag: s2声明流量应该流向泳道s2下的相关服务,由预期输出得到,符合预期。