云原生网关新版全链路灰度迁移

更新时间:
复制为 MD 格式

在云原生网关升级到2.0.2版本后,您可以使用新版的全链路灰度能力,本文介绍从各种不同场景切换到新版全链路灰度的迁移路径。

背景

在云原生网关2.0.2版本上线前,您使用云原生网关作为入口进行全链路灰度时,必须使用指向单版本的标签路由作为基线路由。

在云原生网关升级到2.0.2版本后,您可以使用新版的全链路灰度能力,无需创建灰度路由,在大规模入口路由的场景下可以获得更好的性能与体验。

限制条件

  • 云原生网关版本大于等于2.0.2。

  • 需要将原有的标签路由改为完全条件一致的单服务路由。

环境准备

本文以下图中的微服务应用作为例子进行演示。应用中包含A、B、C三个应用,调用链路为 A -> B -> C,云原生网关访问入口应用A。

image

迁移路径

本文描述对于当前存在的泳道,如何平滑迁移到新的全链路灰度实现。

按内容

泳道迁移

老的泳道中,各泳道的分流规则如下:当请求Headercolor=gray时指向gray环境;color=blue时指向blue环境。

步骤一:创建新的单服务路由

创建一条和原有路由匹配条件完全一致的单服务路由。根据当前的路由匹配规则,当匹配条件一致时,创建时间早的路由会生效,因此保持原有的请求条件会匹配到老的标签路由。

为了临时测试该单服务路由,为其额外增加一个匹配条件:请求Headermigrate=true

其中路由名称为a-single,路径前缀为/a,后端服务为sc-a(HTTP协议、端口20001),保持与原标签路由匹配条件一致。

步骤二:验证原有灰度链路不受影响
  • 请求基线

    发送不带任何请求头的GET请求至/a,响应链路为A → B → C(均为基线版本)。

  • 请求gray泳道

    添加请求头color=gray后,响应链路为Agray → B → Cgray,命中gray灰度环境。

  • 请求blue泳道

    添加请求头color=blue后,响应链路为Ablue → B → Cblue,命中blue灰度环境。

步骤三:创建新的全链路灰度泳道

完成网关升级,可以创建新的泳道,泳道规则和之前保持一致。

在路由的常规配置页面填写基本信息(路由名称、Path、Method、Header、后端服务等),泳道规则保持与原配置一致。

回到路由列表页,可以看到没有新的灰度路由被创建,作为基线的单服务路由有全链路灰度标记。

测试老的基线路由/灰度路由,可以正常生效。

其中带color=gray请求头的请求仍命中Agray → B → Cgray链路。

color=blue请求头的请求命中Ablue → B → Cblue链路。

测试新的基线路由,表现正常。

仅添加migrate=true请求头时,请求经由新基线路由,响应链路为A → B → C(均为基线版本)。

migrate=true基础上叠加color=gray请求头,响应链路为Agray → B → Cgray,灰度分流仍生效。

migrate=true基础上叠加color=blue请求头,响应链路为Ablue → B → Cblue,blue泳道分流同样符合预期。

步骤四:路由切流

调整单服务路由的匹配规则,去掉请求Headermigrate=true的条件,发布路由。

此时请求头列表已清空,保存配置后单击发布

下线原有基线标签路由。

原基线标签路由的状态变更为未发布

验证灰度,依然正常。

其中color=gray请求响应链路为Agray → B → Cgray

color=blue请求响应链路为Ablue → B → Cblue

重要

此时老的标签路由为下线状态,若切流过程中出现问题,可随时通过重新发布原有基线路由来执行回滚。

步骤五老泳道下线

若验证新的单服务路由正常,可以对老的泳道执行下线操作,彻底清除灰度路由。

回到全链路灰度,删除原有泳道。

在弹出的确认对话框中确认删除操作。

可以观察到灰度路由已被删除。

删除原有基线标签路由,迁移完成。

按比例

泳道迁移

老的按比例泳道中,各泳道的比例配置如下:gray环境分配30%流量,blue环境分配10%流量。

步骤一:创建新的单服务路由

创建一条和原有路由匹配条件完全一致的单服务路由。根据当前的路由匹配规则,当匹配条件一致时,创建时间早的路由会生效,因此保持原有的请求条件会匹配到老的标签路由。

为了临时测试该单服务,为其额外增加一个匹配条件:请求Headermigrate=true

其中路由名称为a-single,路径前缀为/a,后端服务为sc-a(HTTP协议、端口20001)。

步骤二:验证原有灰度链路不受影响

执行测试脚本,分流比例正常。

Total Request: 100
Traffic Distribution: {'gray': 27, 'base': 65, 'blue': 8}

查看网关访问日志,可以看到依然匹配到的是基线路由a。

步骤三:创建新的全链路灰度泳道

完成网关升级,可以创建新的泳道,泳道规则和之前保持一致。

在路由的常规配置页面填写基本信息,泳道规则保持与原按比例配置一致。

回到路由列表页,可以看到没有新的灰度路由被创建,作为基线的单服务路由有全链路灰度标记。

使用测试脚本测试,流量比例正常。

Total Request: 100
Traffic Distribution: {'base': 65, 'gray': 29, 'blue': 6}

调整测试脚本,在访问路由A时添加请求header migrate=true,使其指向新的单服务路由

执行测试,分流比例符合预期。

Ablue[10.0.23.37][config=base] -> B[10.0.10.21] -> C[10.0.23.34]
Ablue[10.0.23.37][config=base] -> B[10.0.10.21] -> Cblue[10.0.23.35]

Total Request: 100
Traffic Distribution: {'gray': 30, 'base': 58, 'blue': 12}
步骤四:路由切流

调整单服务路由的匹配规则,去掉请求Headermigrate=true的条件,发布路由。

此时请求头列表已清空,保存后单击发布使变更生效。

移除测试脚本中的请求header migrate=true,分流比例符合预期。

Total Request: 100
Traffic Distribution: {'base': 63, 'gray': 32, 'blue': 5}

下线老的基线标签路由,灰度路由一并被下线。

原标签路由及其关联的灰度路由均显示为未发布

重新执行测试脚本,分流比例依然符合预期。

Total Request: 100
Traffic Distribution: {'blue': 10, 'base': 64, 'gray': 26}
重要

此时老的标签路由为下线状态,若切流过程中出现问题,可随时通过重新发布原有基线路由来执行回滚。

步骤五:老泳道下线

若验证新的单服务路由正常,可以对老的泳道执行下线操作,彻底清除灰度路由

回到全链路灰度,删除原有泳道。

在弹出的确认对话框中确认删除操作。

可以观察到灰度路由已被删除。

删除原有基线标签路由,迁移完成。