阿里云 MSE + Zadig,面向开发者的全链路灰度发布解决方案
发布策略是企业软件开发和交付过程中的一项关键管理实践,有助于平衡创新、风险和业务需求,提高软件发布的成功率和效果。
在云原生的背景下,企业在选择和实施发布策略时,往往会面临以下困境:
- 云原生能力缺失: 企业由传统部署转变为云原生模式,需要拥有相关能力的人才。这使得企业在发布策略方面难以入手。
- 缺乏自动化平台支持: 即使找到适合产品现状的发布策略,仍然依赖手工逐步执行。这可能导致流程遗漏或人工操作失误,增加了生产事故的风险。
- 发布效率低下: 仅实现了服务级别的灰度能力,逐个发布服务耗时较长,导致发布过程缓慢,验证效果不佳。
为了解决这些问题,Zadig 借助阿里云 MSE 微服务引擎,推出 MSE 全链路灰度发布方案,助力企业高效、安全、平稳的发布。
在本文中,我们将详细探讨 Zadig 如何利用阿里云 MSE 实现的全链路灰度发布方案,包括方案原理的深入介绍、管理员配置的详细讲解以及工程师在日常使用中的实际操作等方面的细节。
01-工作原理介绍
工作原理图示:
工作流程描述:
MSE 灰度发布任务
- 复制一份基准环境中服务的 YAML
- 自动为 YAML 中的资源名称 metadata.name 添加后缀 -mse-<grayTag>
- 自动为 YAML 中的资源添加 MSE 全链路灰度发布所需的相关 label
- 用户可以设置灰度镜像、副本数,此外可以直接在渲染后的 YAML 中修改其他需要改动的字段(不可删除灰度过程中使用的 label)
- 根据最终的 YAML 生成灰度版本资源
下线 MSE 灰度服务
- 删除所有带灰度标的 Kubernetes 资源
02-前置操作
MSE 全链路灰度能力可以支持任意 K8S 集群,全链路灰度场景需基于网关能力建设,下面以 MSE 自带的云原生网关为例介绍场景,用户可以根据自身情况选择合适的网关。
安装 MSE 组件
在阿里云 ACK 集群中安装 MSE 组件,安装方式参考文档:安装 ack-onepilot 组件 [1]。
安装 MSE Ingress 云原生网关
安装方式参考文档
下面以 spring-a 、spring-b 、spring-c 、nacos 这几个服务为例,结合 MSE 云原生网关演示项目初始化和 MSE 灰度发布过程。
03-管理员做项目初始化
运维或者 DevOps 工程师在 Zadig 上进行项目的初始化,包括新建项目、新建服务、新建环境并启用 MSE、新建灰度发布工作流等步骤。以下操作是一次性操作,后续只需按需配置执行工作流即可。
步骤一:新建项目
在 Zadig 上新建项目,输入项目名称,项目类型选择 「K8s YAML」项目。
步骤二:新建服务
在 Zadig 服务-生产服务模块新建 nacos 、spring-a 、spring-b 、spring-c 服务并配置对应的 YAML。具体配置参考 示例项目 YAML 配置 [4]。
注意:在服务 deployment 中需添加以下 selector 和 template.metadata.labels:
zadigx-release-version: original
步骤三:新建环境并启用 MSE
1. 在 Zadig 上新建生产环境
2. 执行以下命令启用 MSE,对灰度过程涉及到的命名空间(上图中为:mse-prod) 打上 mse-enable 标签。
1 kubectl label namespacemse-enable=enabled
3. 在生产环境中添加服务 spring-a 、spring-b 、spring-c 、nacos 。
4. 检查服务是否成功接入 MSE。在 Zadig 环境中选择服务,比如 spring-a ,检查 Pod YAML 中是否成功注入 one-pilot-initcontainer ,如下图所示。
步骤四:配置 MSE 灰度发布工作流
1. 新建发布工作流 mse-gray-workflow,添加任务,配置如下。
- MSE 灰度发布:用于部署灰度服务
- [可选] 通用任务 :用于验证灰度后的新版本
- 下线 MSE 灰度:用于下线灰度服务
2. 新建发布工作流 prod-workflow ,添加 部署 任务,用于执行生产发布,配置如下图所示。
04-工程师执行 MSE 灰度发布
多个灰度服务部署
执行 mse-gray-workflow,选择服务组件 spring-cloud-a 和 spring-cloud-c ,设置灰度标,选择对应的灰度镜像、副本数量、修改灰度服务 YAML 配置,点击执行即可完成灰度服务部署。
此处 spring-cloud-a 为流量入口,因此需要在灰度服务 YAML 中手动添加/修改 Service 和 MSE Ingress 资源的一些相关字段:
1. 通过 MSE Ingress 的 annotations 设置灰度流量规则,并为灰度流量带上灰度标 Header。
MSE Ingress 云原生网关支持按请求头、Cookie、权重三个维度进行配置,三者可以只配置一种,若同时配置生效规则按请求头、Cookie、权重顺序匹配
- 按请求头:基于 Request Header 的流量切分,添加注解 nginx.ingress.kubernetes.io/canary-by-header、nginx.ingress.kubernetes.io/canary-by-header-value 或 nginx.ingress.kubernetes.io/canary-by-header-pattern。
- 按 Cookie:基于 Cookie 的流量切分,添加注解 nginx.ingress.kubernetes.io/canary-by-cookie。
- 按权重:设置请求到指定服务的百分比(值为0~100的整数),添加注解 nginx.ingress.kubernetes.io/canary-weight 。
2. 设置灰度路由规则的 backend.service.name 为其下的灰度 Service 名称。
具体改动内容如下:
部署完成后,可在生产环境中查看灰度服务的运行状态和基本信息。
灰度结果验证
灰度服务部署完成后,自动执行新版本功能验证或通过其他业务方法验证灰度结果。
正式发布生产服务
灰度服务验证没有问题后,执行 prod-workflow 工作流,选择更新的服务及对应的镜像,即可更新生产服务。
灰度服务清理与下线
生产发布成功后,执行 mse-gray-workflow 工作流,选择需要下线的灰度标,即可下线对应的灰度服务。
后续版本将持续优化用户体验,为发布人员提供更易懂、更方便的操作界面,敬请期待……
立即体验 Zadig V2.0 新架构,开启高效交付之旅!🚀
Zadig 开放,链接,专业
阅读原文 / Zadig 在 Github / Zadig 在 Gitee
推荐阅读 : 只有大厂才可以有 DevOps 平台? / 基于 Istio + Zadig,零负担实现云原生全链路灰度发布 / Zadig vs. Jenkins 详细比对:时代的选择与开发者之选 / ZADIG 专家版倾情上线:一键高效发布,119元/人月起,社区老友享年终福利!


