通过云效 CI/CD 实现微服务全链路灰度
作者:卜比
在发布过程中,为了产品整体稳定性,我们总是希望能够用小部分特定流量来验证下新版本应用是否能正常工作。
即使新版本有问题,也能及时发现,控制影响面,保障了整体的稳定性。
整体架构
我们以如下 Demo 为例:
为了保证稳定,我们约定如下上线流程:
其中,在灰度验证中,有几种不同的策略:
- 直接使用线上小部分流量来测试(按照百分比放量)
- 从线上按照特定规则选择流量(比如特定的 header、特定的 cookie 等)
- 在客户端或浏览器上标识出流量是否灰度(比如通过 header 传递)
部署应用&创建泳道
按照参考文档在 Kubernetes 集群中部署应用后,我们首先要区分线上流量和灰度流量。
部署文档:
创建泳道组,选择入口应用以及整个链路涉及到的应用:
然后创建泳道,将符合规则的流量划入 gray 泳道:
注:没有匹配的流量,会走到基线环境,也就是没有打标的应用节点上。
配置完成后,访问网关,如果不符合灰度规则,走基线环境:
如何符合灰度规则,走灰度环境:
配置云效流水线
在本例中,使用“其他 · 空模板”创建云效流水线,创建后,需要进行四部分配置:
流水线源
配置好流水线的来源,比如代码仓库等。
- 代码仓库:https://gitee.com/mse-group/alibabacloud-microservice-demo.git(为了避免网络延迟,所以采用 gitee 仓库)
- 默认分支:master
- 服务连接:可以通过添加服务连接按钮添加,由于本例中代码仓库为公开代码仓库,所以只需要按照默认值创建即可。
配置完成后,添加到流水线中。
构建阶段配置
此阶段配置云效如何构建 docker 镜像。
删除原有的阶段和空任务,手动添加新任务“镜像构建”:
配置参数如下:
- 构建集群:就近选择,国内可以选择“北京构建集群”
- 服务连接:您可以按照提示添加 ACR 的服务连接,通过 RAM 授权的方式,让云效可以推送镜像到 ACR 中
- 仓库:选择您需要推送、部署的镜像仓库
- 标签:保留默认${DATETIME}即可。
- Dockerfile 路径:mse-simple-demo/A/Dockerfile
配置好后,添加即可。
部署 gray 阶段配置
本步骤指示云效如何部署 gray 节点。由于云效可以直接替换 Kubernetes 中的 workload 镜像,我们可以直接使用此机制来发布。
配置参数如下:
- 集群连接:用来授权云效修改 ACK 集群中 workload 配置。按照授权添加对应 ACK 集群连接即可
- Kubectl 版本:选择相近版本即可
- 命名空间:按照实际情况选择
- Workloads 类型:本例中是 Deployment
- Workloads 名称:本例中是 spring-cloud-a-gray
- 容器名称:本例中是 spring-cloud-a-gray
- 镜像:选择上一步构建的结果,可以选择“镜像公网地址”
部署线上阶段配置
类似上一阶段的配置:
- Workloads 名称:和上一步不同,这儿是基线环境的 workloads,值为 spring-cloud-a
- 容器名称:spring-cloud-a
最后,将部署 gray 阶段和部署线上阶段的的触发模式改为“手动触发”。
完整配置好后的效果如图:
流水线运行
配置好流水线后,我们可以按照发布流程来一步步运行流水线:
打包构建
我们手动运行刚刚的创建好的流水线,观察构建状态。
运行成功效果如下:
您也可以查看日志来确定运行状态、排查问题等:
完成镜像构建后,接着就开始开始部署 gray 了。
部署 gray 并验证
点击部署 gray 阶段的手动触发按钮,开始部署 gray:
部署结束后,可以在 Kubernetes 控制台确认下部署后容器镜像是不是符合预期:
如上图,可以看到对应镜像已经部署到 gray 了。
我们可以尝试用小流量进行验证,按照之前在 MSE 全链路灰度上的配置,访问只需要带上参数 name=xiaoming 即可访问到 gray 节点:
可以看到请求到达了 Agray 节点,同时新的代码也生效了。
我们不妨观察下此时线上的流量:
没有带灰度参数的流量,走基线环境,同时新版本的修改也还未生效。
在验证完 gray 环境后,我们就可以开始发布线上了。
如果此时验证不通过,我们可以中止流水线运行,排查问题后重新运行流水线。
部署线上
点击部署线上阶段的手动触发按钮,开始部署线上:
线上部署成功后,也可以在容器控制台查看,看下是否符合预期:
此时我们开始观察线上流量,看下修改是否生效:
可以看到,新版本的修改此时就完全发布到线上了。
总结
在微服务治理架构中,MSE 全链路灰度提供了虚拟泳道能力,极大的方便了测试、发布时的快速验证,能够帮助 Devops 同学减少保障半径、提升线上稳定性。
同时,阿里云微服务引擎(MSE)也能给您带来全生命周期的、全方位的微服务治理、流量防护能力,保障您的线上稳定性,提升开发、运维效率。