使用Jenkins构建流水线,可以实现全链路灰度功能。通过Pipeline脚本,将构建、部署和测试等环节串联起来,根据灰度验证的结果,决策后续步骤。如果新版本稳定,则逐步调整路由规则,增大灰度流量,直至全量上线。如果发现问题,则立即回滚流量至旧版本,并进行问题排查。整个过程实现了从构建到灰度发布的全链路自动化管理,确保了服务更新的安全性和稳定性。本文介绍如何通过Jenkins构建流水线的方式实现全链路灰度功能。
整体架构
灰度验证通常采用以下策略:
直接使用线上小部分流量来测试(按照百分比放量)。
从线上按照特定规则选择流量(比如特定的Header、特定的Cookie等)。
在客户端或浏览器上标识出流量是否灰度(比如通过Header传递)。
以如下Demo为例:
准备工作
将ACK微服务应用接入MSE治理中心
将ACK微服务应用接入MSE治理中心。具体操作,请参见ACK微服务应用接入MSE治理中心。
部署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微服务治理并且安装探针之后会自动路由到下游带有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服务网关。
入口应用
根据实际情况选择。
泳道组涉及应用
选择您的入口应用或入口网关所涉及的所有相关服务。
泳道组创建完成后,在全链路灰度页面的泳道组涉及应用区域出现您所创建的泳道组。请检查入口应用和所涉及的应用是否正确,如需变更泳道组信息,请单击右侧的图标并修改相关信息。
在全链路灰度页面上方选择创建和泳道组时相同的微服务空间,然后底部单击点击创建第一个分流泳道。
如果您选择的微服务空间内已经创建过泳道,则单击创建泳道。
重要加入全链路流量控制的应用,将不再支持金丝雀发布、标签路由等功能。
在创建泳道面板设置流控泳道相关参数,将符合规则的应用划入gray泳道。然后单击确定。
配置项
描述
配置节点标签
需要您手工给您的灰度应用节点打上标签,用来和正常节点做区分。
填写泳道信息
泳道标签:该泳道内的匹配的流量去往的目标标签。
确认匹配关系:检查您配置了该标签的应用节点数是否符合预期。
路由和灰度规则
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治理中心控制台,在应用详情页面,可以看到灰度流量已经进入到灰度的节点。
全量发布应用
结果验证通过之后,确认全量发布。
在Jenkins控制台,单击目标流水线名称。
单击需要全量发布的阶段,在请确认是否全量发布对话框输入true,然后单击确认。
在容器服务控制台,发现spring-cloud-a-gray应用已经被删除,并且spring-cloud-a应用的镜像已经替换为
spring-cloud-a:gray
版本。在MSE治理中心控制台,发现灰度流量已经消失。
回滚应用
在验证结果不符合预期时,回滚应用。
在Jenkins控制台,单击目标流水线名称。
单击需要全量发布的阶段,在请确认是否全量发布对话框输入false,然后单击确认。
在容器服务控制台,发现spring-cloud-a-gray应用已经被删除,并且spring-cloud-a应用的镜像仍然是老版本。
在MSE治理中心控制台,发现灰度流量已经消失。