本文介绍如何在ASM中使用泳道模式下的流量管理功能。具体关于ASM中的全链路灰度相关概念可以参考https://help.aliyun.com/document_detail/375313.html。
前提条件
- 已创建ASM企业版或旗舰版实例,且版本为v1.17.2.22或以上。具体操作,请参见创建ASM实例。
- 已创建ACK集群, 并已添加集群到ASM实例。具体操作,请参见添加集群到ASM实例。
- 已创建了名称为ingressgateway的ASM网关。具体操作,请参见创建入口网关服务。
- 已经创建了名称为ingressgateway且命名空间为istio-system的规则配置, 定义如下:
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:
- '*'
功能介绍
灰度发布的核心思想是根据请求内容或者请求流量的比例将线上流量的一小部分转发至新版本,待灰度验证通过后,逐步调大新版本的请求流量,是一种循序渐进的发布方式。全链路灰度治理策略主要专注于整个调用链,它不关心链路上经过具体哪些微服务,流量控制视角从服务转移至请求链路上,仅需要少量的治理规则即可构建出从网关到整个后端服务的多个流量隔离环境,有效保障了多个服务顺利安全发布以及服务多版本并行开发,进一步促进业务的快速发展。
本文示例场景如下,图中有三个泳道s1、s2、s3,分别包含三个服务mocka、mockb、mockc。在ASM控制台部署泳道后,查看各个泳道的流量分布是否符合预期。
步骤一:部署示例服务
- 为命名空间default开启自动注入。
- 登录ASM控制台。在左侧导航栏,选择服务网格 > 网格管理。
- 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
- 在网格详情页面左侧导航栏,选择网格实例 > 全局命名空间。
- 在命名空间default右侧的自动注入列下,单击启用Sidecar自动注入。关于自动注入的更多信息,请参见多种方式灵活开启自动注入。
- 在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
步骤二:创建泳道组和对应泳道
- 创建泳道组。
- 登录ASM控制台。在左侧导航栏,选择服务网格 > 网格管理。
- 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
- 在网格详情页面左侧导航栏选择流量管理中心 > 全链路灰度。
- 在全链路灰度页面,单击创建泳道组,在创建泳道组面板,配置相关参数,然后单击确定。部分参数说明如下:
参数 | 说明 |
---|---|
泳道组名称 | 本文配置为test。 |
入口网关 | 本文配置为ingressgateway。 |
泳道服务 | 选择目标Kubernetes集群和命名空间,在下方列表中选中mocka、mockb和mockc服务,单击![]() |
此时, 会生成对应的流量标签TrafficLabel:
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)
- 创建s1、s2、s3泳道,并分别绑定v1、v2、v3版本。本文以创建s1泳道为例进行说明,请参照以下步骤创建s2和s3泳道。
- 在全链路灰度页面的流量分配区域,单击创建泳道。
- 在创建泳道对话框中,配置相关参数,然后单击确定。
部分参数说明如下:创建完成后,示例效果如下:
参数 | 说明 |
---|---|
泳道名称 | 支持配置1~63个字符,可包含数字、字母和短划线(-)。本文配置为s1。说明 访问服务时,带上对应的Header请求('x-asm-prefer-tag: 泳道名称')会路由到对应的版本。 |
配置服务标签 | 配置为v1。 |
添加服务 | 选择mocka(default)、mockb(default)和mockc(default)。 |
每创建一个泳道, 会创建对应的目标规则DestinationRule。例如创建完泳道s1之后, 将会创建如下类似内容的目标规则DestinationRule:
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-6626308510d4
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
- 创建各个泳道对应的引流规则。
- 在全链路灰度页面的流量分配区域,单击目标泳道右侧操作列下的引流规则。
- 在添加引流规则对话框中,配置相关参数,然后单击确定。本文以泳道服务对应入口API均为/mock为例,为每个泳道配置相同的引流规则,配置信息如下。各个泳道的引流规则创建成功后,示例效果如下:
参数 | 说明 |
---|---|
入口服务 | 配置为mocka.default.svc.cluster.local。 |
引流规则 | 配置名称仅为作为路由名称, 例如可以分别定义为rule1、rule2或者rule3等。域名表示流量路由发送的目标主机名, 例如可以定义为*。 |
匹配URI | 配置匹配方式为精确,本示例中匹配内容为/mock。 |
对应生成如下类似内容的虚拟服务:
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-15d21004748f
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
步骤三:验证全灰度链路功能是否生效
通过ASM控制台获取网关的公网IP,执行以下命令。
export ASM_GATEWAY_IP=xxx.xxx.xxx.xxx
以s1和s2泳道进行验证全灰度链路功能是否生效,您可以参照以下步骤自行验证s3泳道。
执行以下命令,查看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下的相关服务,由预期输出得到,符合预期。
- 执行以下命令,查看s2泳道的访问效果。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;
通过设置HTTP标头 x-asm-prefer-tag: s2声明流量应该流向泳道s2下的相关服务,由预期输出得到,符合预期。-> mocka(version: v2, ip: 172.17.0.9)-> mockb(version: v2, ip: 172.17.0.126)-> mockc(version: v2, ip: 172.17.0.128)
4.执行以下命令,查看s2泳道的访问效果。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: s2声明流量应该流向泳道s2下的相关服务,由预期输出得到,符合预期。
步骤四:查看网格拓扑
如果已经通过ASM控制台开启网格拓扑的可观测性, 参见文档https://help.aliyun.com/document_detail/200336.html?spm=a2c4g.158935.0.0.794e5a84b04yWj,
那么可以查看在上述请求下的网格拓扑, 类似结果如下。