117:灰度发布

灰度发布是微服务场景下常见的发布操作。假设我们有一个服务,叫做ratings-v1;当我们有了新版本,比如ratings-v2。当升级的时候,首先部署v2服务,然后把v2服务添加到API上,然后选择灰度发布的时长、策略、步进等参数,然后看着流量一点一点的切换到v2就可以了。接下来我们在Flomesh里这个过程是怎样的。

曾经有一次一个做运维主管的朋友和我聊天,我问他:你觉得service mesh,比如istio,最能帮助你的实际需求是什么?他想了好一会,我提示了一下,你可以从“链路加密”,“负载均衡”,“熔断和灰度发布”中选择一个,选你认为最重要的。他回答的很干脆:链路加密其实对我们来说不是那么重要,毕竟如果环境本身的管控还是很严格的,被人sniffer和中间人攻击的可能不大;负载均衡有用,但是并不是那么紧急,因为kubernetes已有的负载均衡也够用(他们用的是全kubernetes环境);熔断其实也不是那么必要,甚至感觉有些风险,我们需要服务降级超过了熔断的需求,但是灰度发布对我们太重要了。

配置步骤1: 配置API

首先我们创建一个API,叫做“灰度发布演示”(可以参考这里:http://demo.flomesh.cn/apis/0f962731-1a3d-4cf2-ad1f-8770000349b1/info)。基本过程是:

  • 登录
  • 选择一个项目
  • 左侧菜单选择API
  • 单机创建
  • 填写名称,保存
  • 在列表里选择刚创建的API
  • 选择“生命周期”标签页,然后会看到如下的页面:

灰度发布1

配置步骤2:添加Provider

添加了API之后,我们添加这个服务的两个版本。一个是ratings-v1,一个是ratings-v2,(作为演示,我们用的实际是同一个服务的后台实例)。添加后,看起来是这样的:

灰度发布2

配置步骤3:添加End point

我们配置一个入口,当host=cr-demo.example.com并且path=/ratings的时候,就匹配到这个API。这个时候配置是这样的:

灰度发布3

配置步骤4:配置分区

这个API我们希望部署到"Default"这个分区上,配置后是这样的:

灰度发布4

配置步骤5:配置灰度发布

接下来我们配置灰度发布的策略,点击API编辑区中间的部分,然后选择“金丝雀发布”,类型选择Auto,变量选择toggled,Hash选择IP,Steps输入100,选择一个未来的开始时间,Duration选择600。这些细节的配置,可以参考具体的文档,作为演示,就用这些参数就可以了;其实这些参数都是望文生义的,不难理解。

注意配置窗口里“选择分区”的部分我们没有做任何配置。关于“选择分区”,我们会在专门的话题里介绍。保存配置,这个过程看起来是这样的:

灰度发布5

我们需要用到一点“code”来最后完成这个过程,在API编辑页面里,选择“脚本”,然后内容如下:

if ngx.ctx.toggled 
then
    "return ratings-v2"
end

就像这样: 灰度发布5

当编辑完以后,页面看起来是这样的:

灰度发布5

接下来我们发布这个API,选择“审核”(因为是超级用户,所以我们可以自己审核自己);然后选择“部署”。

点击部署之后,API的状态会短暂处在“Pending”状态,很快当部署完成之后,就进入“运行状态”了。

如果想知道部署的结果,可以选择“资源”标签页来查看部署的进度和细节。

流量切换

当设置的流量切换时间到了以后,观察“概要”标签页的流量图,就可以看到流量从v1到v2的切换过程了。看起来是这个样子的:

灰度发布6

在下边的“Branches”的图表里,我们可以看到v1的流量在逐渐递减,而v2的流量在增加,直到完全替换。