云原生全链路灰度发布:阿里云 MSE + ZadigX 解决方案
01、企业发布现状痛点
目前企业在选择和实施发布策略时面临以下困境:
-
缺乏云原生能力:由于从传统部署转变为云原生模式后,技术架构改造需要具备相关能力的人才。这使得企业在发布策略方面难以入手。
-
缺乏自动化平台支持:即使找到适合产品现状的发布策略,仍然依赖手工逐步执行。这可能导致流程遗漏或人工操作失误,造成生产事故的风险。
-
发布效率低下:仅实现了服务级别的灰度能力,逐个发布服务耗时长,导致发布过程缓慢,验证效果不佳。
针对以上问题,ZadigX 与阿里云 MSE 联合发布「面向开发者的全链路灰度发布解决方案」,帮助企业应对这些痛点。阿里云 MSE 为 Java 应用提供了便捷实现全链路灰度的能力。MSE 微服务引擎是基于 Java Agent 实现的无侵入式企业生产级服务治理产品,不需要修改任何一行业务代码,即可拥有不限于全链路灰度的治理能力,并且支持近 5 年内所有的 Spring Boot、Spring Cloud 和 Dubbo。使用 MSE 进行灰度发布的过程中,ZadigX 可以便捷地创建灰度环境和灰度 K8S 资源,结合发布工作流编排能力,自动为 K8S 资源设置 MSE 所需的资源标记,并集成了 MSE API 以降低重复工作量。开发无需切换平台,管理员一次配置即可。开发可以基于 ZadigX 与日常工作平滑结合,完成高效、安全、快捷的发布。
02、工作原理介绍
工作原理图示:
工作流程描述:
MSE 灰度发布任务
-
复制一份基于基准环境中服务的 YAML
-
自动为 YAML 中的资源名称<metadata.name>添加后缀 <-mse-grayTag>>
-
自动为 YAML 中的资源添加 MSE 全链路灰度发布所需的相关 label
-
用户可以设置灰度镜像、副本数,此外可以直接在渲染后的 YAML 中修改其他需要改动的字段(不可删除灰度过程中使用的 label)
-
根据最终的 YAML 生成灰度版本资源
下线 MSE 灰度服务
-
通过灰度资源被设置的相关 label ,找到并删除它们
03、前置操作
MSE 全链路灰度能力可以支持任意 K8S 集群,全链路灰度场景需基于网关能力建设,下面以 MSE 自带的云原生网关为例介绍场景,用户可以根据自身情况选择合适的网关。
安装 MSE 组件
在阿里云 ACK 集群中安装 MSE 组件,安装方式参考文档:安装 ack-onepilot 组件[1]。
安装 MSE Ingress 云原生网关
安装方式参考文档
-
创建 MSE 云原生网关[2]
-
通过 MSE Ingress 访问容器服务[3]
下面以<spring-a>、<spring-b>、<spring-c>、<nacos>这几个服务结合 MSE 云原生网关组成的项目为例演示项目初始化和 MSE 灰度发布过程。
04、管理员做项目初始化
运维或者 DevOps 工程师在 ZadigX 上进行项目的初始化,包括新建项目、新建服务、新建环境并启用 MSE、新建灰度发布工作流等步骤。以下操作是一次性操作,后续只需按需配置执行工作流即可。
步骤一:新建项目
在 ZadigX 上新建项目,输入项目名称,项目类型选择 「K8s YAML」项目。
步骤二:新建服务
在 ZadigX 服务-生产服务模块新建<nacos>、<spring-a>、<spring-b>、<spring-c>服务并配置对应的 YAML。
注意:在服务 deployment 中需添加以下 selector 和 template.metadata.labels:
<zadigx-release-version: original>
服务 YAML 如下所示:
-
<nacos>服务 YAML 配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nacos-server
spec:
replicas: 1
selector:
matchLabels:
app: nacos-server
template:
metadata:
labels:
app: nacos-server
spec:
containers:
- env:
- name: MODE
value: standalone
image: nacos/nacos-server:v2.2.0
imagePullPolicy: Always
name: nacos-server
dnsPolicy: ClusterFirst
restartPolicy: Always
# Nacos Server Service配置
---
apiVersion: v1
kind: Service
metadata:
name: nacos-server
spec:
ports:
- port: 8848
protocol: TCP
targetPort: 8848
selector:
app: nacos-server
type: ClusterIP
-
<spring-a>服务 YAML 配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-a
spec:
replicas: 1
selector:
matchLabels:
app: spring-cloud-a
zadigx-release-version: original
template:
metadata:
labels:
msePilotCreateAppName: spring-cloud-a
app: spring-cloud-a
zadigx-release-version: original
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:0.1-SNAPSHOT
imagePullPolicy: Always
name: spring-cloud-a
ports:
- containerPort: 20001
livenessProbe:
tcpSocket:
port: 20001
initialDelaySeconds: 10
periodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
name: spring-cloud-a-base
spec:
ports:
- name: http
port: 20001
protocol: TCP
targetPort: 20001
selector:
app: spring-cloud-a
zadigx-release-version: original
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: spring-cloud-a
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: spring-cloud-a-base
port:
number: 20001
path: /
pathType: Prefix
-
<spring-b>服务 YAML 配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-b
spec:
replicas: 1
selector:
matchLabels:
app: spring-cloud-b
zadigx-release-version: original
strategy:
template:
metadata:
labels:
msePilotCreateAppName: spring-cloud-b
app: spring-cloud-b
zadigx-release-version: original
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:0.1-SNAPSHOT
imagePullPolicy: Always
name: spring-cloud-b
ports:
- containerPort: 8080
livenessProbe:
tcpSocket:
port: 20002
initialDelaySeconds: 10
periodSeconds: 30
-
<spring-c>服务 YAML 配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-c
spec:
replicas: 1
selector:
matchLabels:
app: spring-cloud-c
zadigx-release-version: original
template:
metadata:
labels:
msePilotCreateAppName: spring-cloud-c
app: spring-cloud-c
zadigx-release-version: original
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:0.1-SNAPSHOT
imagePullPolicy: Always
name: spring-cloud-c
ports:
- containerPort: 8080
livenessProbe:
tcpSocket:
port: 20003
initialDelaySeconds: 10
periodSeconds: 30
步骤三:新建环境并启用 MSE
1.在 ZadigX 上新建生产环境
2.执行以下命令启用 MSE,对灰度过程所有涉及到的命名空间(上图中为:mse-customer) 打上<mse-enable>标签。
kubectl label namespace <NAMESPACE> mse-enable=enabled
3.在生产环境中添加服务<spring-a>、<spring-b>、<spring-c>、<nacos>。
4.检查服务是否成功接入 MSE。在 ZadigX 环境中选择服务,比如<spring-a>,检查 Pod YAML 中是否成功注入<one-pilot-initcontainer>,如下图所示。
步骤四:配置 MSE 灰度发布工作流
1.新建发布工作流 mse-gray-workflow,添加任务,配置如下:
-
<MSE 灰度发布>:用于部署灰度服务
-
[可选]通用任务 :用于验证灰度后的新版本
-
<下线 MSE 灰度>:用于下线灰度服务
2.新建发布工作流 prod-workflow ,添加<部署>任务,用于执行生产发布,配置如下图所示。
05、工程师执行 MSE 灰度发布
多个灰度服务部署
执行 mse-gray-workflow,选择服务组件<spring-cloud-a>和<spring-cloud-c>,设置灰度标,选择对应的灰度镜像、副本数量、修改灰度服务 YAML 配置,点击执行即可完成灰度服务部署。
此处<spring-cloud-a>为流量入口,因此需要在灰度服务 YAML 中手动添加/修改 Service 和 MSE Ingress 资源的一些相关字段:
-
通过 MSE Ingress 的 annotations 设置灰度流量规则,并为灰度流量带上灰度标 Header
-
设置灰度路由规则的<backend.service.name>为其下的灰度 Service 名称
具体改动内容如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
mse.ingress.kubernetes.io/request-header-control-update: x-mse-tag gray
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: x-user-id
nginx.ingress.kubernetes.io/canary-by-header-value: "100"
nginx.ingress.kubernetes.io/canary-weight: "0"
creationTimestamp: null
labels:
zadigx-release-service-name: spring-a
zadigx-release-type: mse-gray
zadigx-release-version: gray
name: spring-cloud-a-mse-gray
spec:
ingressClassName: mse
rules:
- host: example.com
http:
paths:
- backend:
service:
name: spring-cloud-a-mse-gray
port:
number: 20001
path: /
pathType: Prefix
status:
loadBalancer: {}
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
zadigx-release-service-name: spring-a
zadigx-release-type: mse-gray
zadigx-release-version: gray
name: spring-cloud-a-mse-gray
spec:
ports:
- name: http
port: 20001
protocol: TCP
targetPort: 20001
selector:
app: spring-cloud-a
zadigx-release-service-name: spring-a
zadigx-release-type: mse-gray
zadigx-release-version: gray
status:
loadBalancer: {}
部署完成后,可在生产环境中查看灰度服务的运行状态和基本信息。
灰度结果验证
灰度服务部署完成后,自动执行新版本功能验证或通过其他业务方法验证灰度结果。
正式发布生产服务
灰度服务验证没有问题后,执行 prod-workflow 工作流,选择更新的服务及对应的镜像,即可更新生产服务。
灰度服务清理与下线
生产发布成功后,执行 mse-gray-workflow 工作流,选择需要下线的灰度标,即可下线对应的灰度服务。
06、总结
面向开发者的全链路灰度发布解决方案通过与阿里云 MSE 的联合,为企业提供云原生能力、自动化平台支持,显著提高发布效率和软件交付质量,为用户带来卓越体验。更多关于灰度发布、 Istio 发布、全链路发布方案感兴趣同学,欢迎添加 ZadigX 交流群一同探讨。
参考链接
[1]ACK 微服务接入 MSE :https://help.aliyun.com/document_detail/2360531.html?spm=a2c4g.2359474.0.0.33a34ca1nN0X0c
[2]创建 MSE 云原生网关:https://help.aliyun.com/document_detail/347638.html
[3]MSE Ingress 访问容器服务:https://help.aliyun.com/document_detail/438003.html

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
直击运维痛点,大数据计算引擎 EasyMR 的监控告警设计优化之路
当企业的业务发展到一定的阶段时,在系统中引入监控告警系统来对系统/业务进行监控是必备的流程。没有监控或者没有一个好的监控,会导致开发人员无法快速判断系统是否健康;告警的实质则是“把人当服务用”,用告警通知人的方式去干预系统达到修正的目的。 监控告警在企业保障系统的稳定性和事故快速恢复的全周期链路中都是至关重要的一环。在新版本的 EasyMR 中袋鼠云开发团队也对监控告警功能进行了全新的优化,通过本文和大家分享一下监控告警功能的设计思路以及碰到各类问题痛点的解决方法。 EasyMR 监控告警设计 对于 EasyMR 的监控告警设计思路,考虑到 Zabbix 后端数据库使用 MySQL 对监控数据进行存储,无法满足多维度化的告警。而 openfalcon 整体架构上吸取了 Zabbix 的经验,解决了 Zabbix 的不足之处,但是社区活跃度不高。 所以我们选择了集成 Prometheus+Grafana 的解决方案搭建 EasyMR 的监控系统,这套解决方案是目前主流的方案,使用的人群较多,在推广使用上会降低门槛而且容易维护,也适合袋鼠云平台的容器化部署。整体架构图如下: 首先我们在这套...
- 下一篇
GPTCache 悬赏令!寻找最佳捉虫猎手,豪华赏格等你来拿!
号外号外!GPTCache 全宇宙寻找最佳捉虫猎手!捉虫数量越多,奖品越丰厚! GPTCache 是为 AIGC 应用搭建的全新缓存,典型的应用场景是大模型,它采用语义缓存技术,能够存储 LLM 响应,从而显著减少检索数据所需的时间、降低 API 调用开销、提升应用可扩展性。不仅如此,用户还可以通过定制个性化缓存规则并监控缓存性能,进一步优化 GPTCache 并提升效率。 GPTCache 一经推出便吸引了全球各地的开发者前来申请和试用,Weaviate 的联合创始人也下场点赞介绍 CPTCache 功能的文章,而 GPTCache 也凭借其出色的能力,短短 3 个多月的时间 Star 数量就冲到了 4.8k。 最近,我们发布了 GPTCache 的新版本,本次新增了对 Redis、Qdrant 和 MongoDB 数据库的支持,以及更多的相似评估,例如:SBERT CrossEncoder/Cohere rerank/Multi-round dialog similarity 等。 当然,作为一个新的开源项目,GPTCache 仍有很大提升的空间,我们很希望能听到广大开发者的声音。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7设置SWAP分区,小内存服务器的救世主
- Hadoop3单机部署,实现最简伪集群
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题