流量泳道是指通过配置流量管理规则将应用的相关版本(或者其他特征)隔离成一个独立的运行环境(即泳道),并将满足规则的请求流量路由到目标版本(或者其他特征)的应用。您可以基于VirtualService和DestinationRule等流量规则实现流量泳道,同时通过配置流量降级,在某个版本(或者其他特征)的应用不可用时,将流量发往一个指定的降级版本(或其他特征)的应用。本文介绍如何在ASM中基于流量规则配置实现流量泳道和流量降级。
前提条件
已添加Kubernetes集群到ASM实例。具体操作,请参见添加集群到ASM实例。
已创建名称为ingressgateway的ASM网关。具体操作,请参见创建入口网关。
步骤一:部署示例服务
为default命名空间开启自动注入。具体操作,请参见启用自动注入。
关于自动注入的更多信息,请参见配置Sidecar注入策略。
使用数据面集群的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
步骤二:创建流量规则实现流量泳道
创建DestinationRule流量规则。
使用以下内容,创建dr-mock.yaml文件。
以下文件表示将mocka、mockb、mockc三个服务各自分为v1、v2、v3三个子集。
使用ASM实例的KubeConfig,执行以下命令,生效DestinationRule流量规则。
kubectl apply -f dr-mock.yaml
创建VirtualService流量规则。
使用以下内容,创建vs-mock.yaml文件。
以下文件表示为mocka→mockb→mockc的服务调用链路创建泳道。创建泳道后,由一个版本的服务发出的请求,只能发送到相同版本的服务。
使用ASM实例的KubeConfig,执行以下命令,生效VirtualService流量规则。
kubectl apply -f vs-mock.yaml
创建网关引流规则。
使用以下内容,创建gw-mock.yaml文件。
以下文件表示为mocka→mockb→mockc的服务调用链路创建网关引流规则。通过匹配发往网关请求的
x-asm-prefer-tag
Header,根据其中的Header值将请求路由到mocka服务的v1、v2、v3三个不同版本。使用ASM实例的KubeConfig,执行以下命令,生效网关引流规则。
kubectl apply -f gw-mock.yaml
步骤三:验证流量泳道是否生效
获取ASM网关的公网IP。具体操作,请参见获取ASM网关地址。
执行以下命令,设置环境变量。
xxx.xxx.xxx.xxx
为上一步获取的IP。export ASM_GATEWAY_IP=xxx.xxx.xxx.xxx
验证全灰度链路功能是否生效。
执行以下命令,查看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版本的相关服务,符合预期。执行以下命令,查看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版本的相关服务,符合预期。执行以下命令,查看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版本的相关服务,符合预期。
步骤四:配置流量泳道内的流量降级
使用以下内容,修改vs-mock.yaml文件。
以下文件表示为mocka→mockb→mockc的服务调用链路创建泳道,同时,当mockb或mockc的v2、v3版本不可用时,请求将发往服务的v1版本调用链。
使用ASM实例的KubeConfig,执行以下命令,修改原有VirtualService流量规则,生效流量降级配置。
kubectl apply -f vs-mock.yaml
步骤五:验证流量降级是否生效
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在无状态页面的操作列,单击mockb-v2工作负载对应的伸缩,在伸缩对话框,将所需容器组数量调整至1,单击确定,在确认对话框,单击确定,模拟v2版本的mockb服务故障效果。
执行以下命令,查看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版本调用链路,实现了流量降级。