通过Jenkins构建CI/CD实现微服务全链路灰度
本文介绍如何通过Jenkins构建流水线的方式实现全链路灰度功能。
前提条件
已在ACK集群中安装Jenkins,请参见在ACK集群中部署Jenkins并完成应用构建和部署。
已开通MSE微服务治理专业版,请参见开通MSE微服务治理。
整体架构
以如下Demo为例:

灰度验证通常采用以下策略。
直接使用线上小部分流量来测试(按照百分比放量)。
从线上按照特定规则选择流量(比如特定的Header、特定的Cookie等)。
在客户端或浏览器上标识出流量是否灰度(比如通过Header传递)。
准备工作
开启MSE微服务治理
开通微服务治理专业版:
单击开通MSE微服务治理。
微服务治理版本选择专业版,选中服务协议,然后单击立即开通。
关于微服务治理的计费详情,请参见计费概述。
安装MSE微服务治理组件:
在容器服务控制台左侧导航栏,选择 。
在应用目录页面搜索框输入ack-onepilot,单击
图标,然后单击组件。
在详情页面开通该组件的集群,然后单击一键部署。
在创建面板中,选择集群和命名空间,然后单击下一步。
在参数配置页面,设置相应参数,然后单击确定。
为应用开启微服务治理:
登录MSE治理中心控制台。
在左侧导航栏选择
。在K8s集群列表页面搜索目标集群,单击
图标,然后单击目标集群操作列下方的管理。
在集群详情页面命名空间列表区域,单击目标命名空间操作列下方的开启微服务治理。
在开启微服务治理对话框中单击确认。
部署Demo应用程序
在容器服务控制台左侧导航栏,单击集群。
- 在集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情。
- 在集群管理页左侧导航栏,选择 。
在无状态页面单击使用YAML创建资源。
对模板进行相关配置,完成配置后单击创建。
本文示例部署A、B、C三个应用,以及注册中心Nacos Server,流量入口应用spring-cloud-zuul,流量调用链路为:spring-cloud-zuul->A->B->C。
spring-cloud-zuul应用默认有100 qps正常流量,而另外有10 qps带有
x-mse-tag: gray
特殊Header,这个Header是MSE内置的灰度Header,只要带上x-mse-tag: gray
这个Header,在开启MSE微服务治理并且安装Agent之后会自动路由到下游带有gray标签的节点上。根据需要,这个gray的值也可以替换成其他节点上打的标签。入口spring-cloud-zuul应用YAML。
A应用基线(base)版本YAML。
B应用基线(base)版本YAML:
C应用基线(base)版本YAML。
Nacos Server应用YAML。
应用部署成功后,在MSE治理中心控制台观察A应用的流量,确认流量都打到未打标的节点,并没有灰度节点的流量。
配置镜像仓库的推送权限
本文实践需要将源码打包后执行镜像推送,请确保Jenkins有权限推送到镜像仓库。具体操作,请参见在ACK集群中部署Jenkins并完成应用构建和部署。
创建泳道
登录MSE治理中心控制台,并在顶部菜单栏选择地域。
在左侧导航栏,选择 。
在全链路灰度页面,单击创建泳道组及泳道。如果您选择的微服务空间内已经创建过泳道组,则单击+创建泳道组。
在创建泳道组面板,选择入口应用以及整个链路涉及到的应用,然后单击确定。
配置项
描述
泳道组名称
自定义设置泳道组的名称。
入口类型
选择Java服务网关。
入口应用
根据实际情况选择。
泳道组涉及应用
选择您的入口应用或入口网关所涉及的所有相关服务。
开启消息灰度
开启消息灰度会打开泳道组所有应用的消息灰度开关。
客户端过滤:在消费端MSE Agent过滤,会拉取所有的消息,建议提前评估消息量。
服务端过滤:在服务端通过SQL-92方式过滤,需要RocketMQ服务端支持。
泳道组创建完成后,在全链路灰度页面的泳道组涉及应用区域出现您所创建的泳道组。请检查入口应用和所涉及的应用是否正确,如需变更泳道组信息,请单击右侧的
图标并修改相关信息。
在全链路灰度页面上方选择创建和泳道组时相同的微服务空间,然后底部单击点击创建第一个分流泳道。
如果您选择的微服务空间内已经创建过泳道,则单击创建泳道。
重要加入全链路流量控制的应用,将不再支持金丝雀发布、标签路由等功能。
在创建泳道面板设置流控泳道相关参数,将符合规则的应用划入gray泳道。然后单击确定。
配置项
描述
泳道名称
自定义设置流控泳道的名称。
配置应用标签
登录容器服务管理控制台,在应用YAML的
spec.template.metadata.annotations
下增加alicloud.service.tag:{tag}
。添加应用
当应用标签配置完成后,单击刷新按钮,下拉框中会出现相应的标签列表,选择对应的标签,就会自动添加相应的应用。
路由规则
Path:要匹配的路径,可以多选。如不填写,将匹配任意路径。
条件模式:路由条件之间的关系。
条件列表:
参数类型:表示参数的来源,可选值包括:Parameter(请求参数)、Header(请求头部)、Cookie、Body Content(JSON格式的请求body)。
参数:参数名称。
条件:匹配规则。
值:表示要匹配的参数值。
没有匹配的流量会分配到基线环境,也就是没有打标的应用节点上。
配置完成后,访问网关。
如果不符合灰度规则,走基线环境。
如果符合灰度规则,走灰度环境。
配置Jenkins流水线
本文实践需要将源码打包后执行镜像推送,请确保Jenkins有权限推送到镜像仓库。具体操作,请参见在ACK集群中部署Jenkins并完成应用构建和部署。
在Jenkins命名空间使用生成的config.json
文件创建名为jenkins-docker-cfg的Secret。
kubectl create secret generic jenkins-docker-cfg -n jenkins --from-file=/root/.docker/config.json
在Jenkins中创建全链路灰度发布流水线
基于Jenkins实现自动化发布的流水线,通过该流水线可以使应用发布具备可灰度、可观测、可回滚的安全生产三种能力。
在Jenkins控制台左侧导航栏,单击新建任务。
输入任务名称,选择流水线,然后单击确定。
在顶部菜单栏,单击流水线页签,在流水线区域配置相关参数,输入脚本路径,然后单击保存。
定义:Pipeline script from SCM。
SCM:Git。
Repository URL:输入Git仓库的URL。本文示例代码仓库的地址为https://gitee.com/ralf0131/mse-demo。
说明阿里云机器无法拉取Github的源码,暂时使用Gitee替代。
脚本路径:输入Jenkinsfile。
您可以参考以下文件填写指定参数,也可以根据需求编写Jenkinsfile,并上传至Git的指定路径(流水线中指定的脚本路径)。
构建Jenkins流水线
在Jenkins控制台,单击流水线右侧的
图标。
单击流水线的开始构建。
说明第一次构建时,需要从Git仓库拉取配置并初始化流水线,所以可能会报错。您可以再次执行Build with Parameters,生成相关的参数,填写相关的参数,再次执行构建。
结果验证
登录容器服务控制台,在控制台左侧导航栏,单击集群。
在集群列表页面,单击目标集群名称或者目标集群右侧操作列的详情。
在集群管理页面左侧导航栏选择 。
在无状态应用列表页面,spring-cloud-a-gray应用已经自动创建,并且它的镜像已经替换为
spring-cloud-a:gray
版本。在集群管理页面左侧导航栏选择 ,选择设置的命名空间,单击zuul-slb服务的外部端点,查看真实的调用情况。
不带灰度Header进行调用,发现路由到A的正常节点。
Curl命令:
curl http://182.92.XX.XX/A/a
执行结果:
A[10.4.XX.XX] -> B[10.4.XX.XX] -> C[10.4.XX.XX]%
带上符合条件的参数进行访问,路由到A的灰度节点中。
Curl命令:
curl http://182.92.XX.XX/A/a?name=xiaoming
执行结果:
Agray[10.4.XX.XX] -> B[10.4.XX.XX] -> C[10.4.XX.XX]%
登录MSE治理中心控制台,在应用详情页面,可以看到灰度流量已经进入到灰度的Pod。
全量发布应用
结果验证通过之后,确认全量发布。
在Jenkins控制台,单击目标流水线名称。
单击需要全量发布的阶段,在请确认是否全量发布对话框输入true,然后单击确认。
在容器服务控制台,发现spring-cloud-a-gray应用已经被删除,并且spring-cloud-a应用的镜像已经替换为
spring-cloud-a:gray
版本。在MSE治理中心控制台,发现灰度流量已经消失。
回滚应用
在验证结果不符合预期时回滚应用。
在Jenkins控制台,单击目标流水线名称。
单击需要全量发布的阶段,在请确认是否全量发布对话框输入false,然后单击确认。
在容器服务控制台,发现spring-cloud-a-gray应用已经被删除,并且spring-cloud-a应用的镜像仍然是老版本。
在MSE治理中心控制台,发现灰度流量已经消失。