云效 AppStack + 阿里云 MSE 实现应用服务全链路灰度

作者:周静、吴宇奇、泮圣伟

在应用开发测试验证通过后、进行生产发布前,为了降低新版本发布带来的风险,期望能够先部署到灰度环境,用小部分业务流量进行全链路灰度验证,验证通过后再全量发布生产。本文主要介绍如何通过阿里云 MSE 微服务引擎和云效应用交付平台AppStack 实现灰度发布。

读完本文,你将了解到:

  • 以 SpringCloud 应用为例,了解全链路灰度场景及其工作原理;
  • 如何基于云效 Appstack 完成应用基线环境的部署,实时观测环境部署进度;
  • 如何平滑为存量应用添加灰度环境、灰度发布流程,不影响已有发布流程;
  • 如何基于 MSE 实现自定义多种灰度路由规则条件,精准测试灰度流量;
  • 如何实现应用灰度环境下线,及时清理无用资源。

场景描述

本文将以 A、B、C 三个 SpringCloud 应用为例,展示如何通过阿里云云效 AppStack 来整合 MSE 全链路灰度的功能,实现将应用一键部署到灰度环境,并进行全链路灰度的测试。

假设已有 A、B、C 三个应用的基线版本正在运行。整体上应用的调用链路是,客户端入口流量首先到达网关应用,而后按顺序经过 A、B、C 三个应用:

图片

一次需求发布窗口中,应用 A 和 C 进行了迭代,需要对 A 和 C 的新版本进行全链路灰度测试,调用链路如下:

图片

整体方案

通过云效 AppStack,在应用发布流程上增加一个灰度流程。每个应用走到生产环境部署前,都会先发布到灰度环境。通过灰度标识对灰度环境进行验证,等到开发/测试人员对灰度环境的应用测试没有问题时,再手工放行流水线走到真正的线上发布部署阶段。

图片

图片

操作实践

前提条件

1)开通云效高级版(可免费试用 1 个月),确保在云效应用交付 AppStack 内打开研发流程功能 [ 1] 了。

2)开通 MSE 微服务治理 [ 2]

3.1 开启 MSE 微服务治理

1)将 ACK 微服务应用接入 MSE 治理中心。具体操作,请参见 ACK 微服务应用接入 MSE 治理中心 [ 3]

2)创建 MSE nacos,并复制其内网域名。具体操作,请参见创建 Nacos 引擎 [ 4]

3)创建 MSE 云原生网关,并关联第一步创建的 Nacos。具体操作,请参见创建 MSE 云原生网关 [ 5] 和新建服务来源 [ 6]

3.2 在云效 AppStack 创建三个应用,部署应用基线版本

图片

在云效 AppStack 创建三个应用,部署应用基线版本。

我们以 spring-cloud-a 应用为例,详细介绍一个应用的配置流程:

第 1 步:应用关联代码仓库,可以在云效 Codeup 中导入示例代码:https://github.com/aliyun/alibabacloud-microservice-demo.git

图片

第 2 步:应用环境配置,一个应用通常可以划分为测试环境(test)、预发环境(pre)、灰度环境(gray)、生产环境(prod),环境关联不同的部署资源(如 K8s 集群),部署服务分别用于不同阶段进行测试验证,并最终提供线上服务。

图片

第 3 步:应用 Kubernetes 部署编排 YAML 配置。

图片

  • 将容器镜像定义成占位符 {{ .AppStack.image.backend }},由流水线运行时传入构建好的镜像。
  • 在应用配置的 spec.template.metadata.labels 下加入 MSE 基本配置及灰度相关。

🔔 说明:

  • msePilotCreateAppName 为 MSE 服务治理接入的应用名;msePilotAutoEnable 为是否接入 MSE 服务治理的开关 on 表示开启,off 表示关闭;alicloud.service.tag 则是 MSE 用于灰度发布的节点标签。您可以在 MSE 服务治理控制台,节点详情页面看到节点的标签情况。更多信息,请参见 ACK 微服务应用接入 MSE 治理中心微服务治理 [ 7] 、节点详情 [ 8]
  • {{if eq .AppStack.envName “gray” }} 是基于 GO template 的方式识别当前云效发布的应用环境。如果环境名称为 gray,则为灰度服务。更多信息,请参见 Kubernetes 部署编排 [ 9]
  • nacos-server 需要替换成上述创建的 Nacos 内网域名。
apiVersion:apps/v1
kind:Deployment
metadata:
name:spring-cloud-a-{{.AppStack.envName}}
labels:
run:spring-cloud-a-{{.AppStack.envName}}
namespace: {{ .Values.namespace }}
spec:
selector:
matchLabels:
app:spring-cloud-a-{{.AppStack.envName}}
template:
metadata:
labels:
app:spring-cloud-a-{{.AppStack.envName}}
# MSE 灰度相关配置
msePilotCreateAppName:spring-cloud-a
msePilotAutoEnable:'on'
{{ ifeq.AppStack.envName"gray" }}
alicloud.service.tag:gray
{{ end }}
spec:
containers:
-name:spring-cloud-a
image: {{ .AppStack.image.backend }} # 应用镜像占位符,由流水线运行时传入
imagePullPolicy:Always
ports:
-containerPort:20001
livenessProbe:
tcpSocket:
port:20001
initialDelaySeconds:30
periodSeconds:60
env:
-name:spring.cloud.nacos.discovery.server-addr
value:'nacos-server'# nacos-server 替换为上述创建的 Nacos 内网域名
-name:dubbo.registry.address
value:'nacos://nacos-server:8848'# nacos-server 替换为上述创建的 Nacos 内网域名

第 4 步:应用研发流程配置,通常一个应用的研发流程可以分为测试阶段、预发阶段、生产阶段。

生产阶段通常包括镜像构建(也可以选择已有镜像发布)、发布审核、生产发布多个任务。

图片

  • 镜像构建:选择「镜像构建」组件,配置需要推送到的镜像仓库、标签默认 ${DATETIME}、用于构建的 Dockerfile 路径本示例为 mse-simple-demo/A/Dockerfile。
  • 人工卡点:配置生产发布的审批人。
  • 生产环境部署:选择「AppStack 部署」组件,应用自动填充当前应用、环境选择「生产环境-prod」,制品选择构建的镜像。

图片

第 5 步:点击「运行」生产发布流程,触发应用镜像构建,镜像构建成功后推送到目标镜像仓库。

图片

人工审批通过后,触发部署正式环境。点击查看「部署单详情」,查看部署进度。部署单成功后即完成了正式(基线)环境的部署。

图片

进入环境详情可以查看 Deployment 资源状态和详细信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以上即完成了应用 spring-cloud-a 的代码、环境、编排 YAML、研发流程等配置,完成了 spring-cloud-a 基线环境的部署。spring-cloud-b、 spring-cloud-c 应用配置和上线流程相同。

🔔 注: 当应用较多时,推荐使用应用模板,来完成应用的批量初始化(详见应用模板 [ 10] )。

3.3 配置灰度流程

3.3.1 创建 MSE 全链路灰度泳道

创建全链路灰度泳道组:进入 MSE 治理中心 > 全链路灰度,单击+创建泳道组及泳道(如果您已经创建过泳道组,则单击+创建泳道组)。入口类型选择「MSE 云原生网关」,泳道组流量入口选择目标云原生网关,泳道组涉及应用选择 spring-cloud-a、spring-cloud-b、spring-cloud-c。

图片

创建分流泳道:泳道标签设置为 gray,路由规则条件列表添加 Parameter group=gray,则请求参数中携带 group=gray 的去往灰度泳道。

图片

3.3.2 AppStack 应用增加灰度流程

进入云效 AppStack 应用-设置-研发流程,编辑「生产阶段」流程:

在人工卡点任务后添加「灰度环境部署」任务:选择「AppStack 部署」组件,应用自动填充当前应用,环境选择「灰度环境-gray」,制品选择构建的镜像。

图片

在生产发布任务后添加「灰度环境清理」任务:选择「AppStack 清理环境」组件,应用自动填充当前应用,环境选择「灰度环境-gray」,选择「仅清理资源保留环境元数据」,下次发布时可以重新部署拉起灰度服务资源。

图片

配置完成后,保存生产阶段流程,即可进入下一步。

3.4 新需求发布,部署灰度环境,灰度验证

3.4.1 灰度环境部署

当接收到一个新的业务需求,涉及 spring-cloud-a 和 spring-cloud-c 两个应用的改动。A、C 两个应用各自完成代码开发、测试预发验证后,进入生产发布阶段。分别点击「运行」A、C 生产阶段研发流程,触发 A、C 灰度环境部署,点击查看「部署单详情」,部署单成功后即完成 A、C 灰度环境的部署。

图片

3.4.2 开始灰度验证

发起带灰度标识的请求,则结果如下(A 和 C 进行了灰度发布,B 没有进行灰度发布,所以请求去往了 B 的基线环境):

curl -X GET http://47.96.XX.XXX/A/a?group=gray
Agray[192.168.110.161][config=base] -> B[192.168.110.14] -> Cgray[192.168.110.160]

如果请求不带灰度标识,则去往 A、B、C 的基线环境:

curl -X GET http://47.96.XX.XXX/A/a?group=gray
Agray[192.168.110.161][config=base] -> B[192.168.110.14] -> Cgray[192.168.110.160]

可以在 MSE 控制台上看到刚刚发起的灰度请求:

图片

3.5 灰度验证通过,发布生产环境

上述灰度验证通过后,即可继续发布生产环境。点击手动触发生产环境发布,查看生产发布批次,观测新老版本号,部署完成后观测生产监控日志。

图片

图片

3.6 生产发布成功后,销毁灰度环境

生产发布成功后,销毁灰度环境资源,所有流量都进入生产环境。

图片

至此即完成了应用基线环境的准备、灰度流程配置、灰度发布验证、生产发布、灰度销毁完整流程。

相关链接:

[1] 确保在云效应用交付 AppStack 内打开研发流程功能

https://help.aliyun.com/document_detail/2399732.html

[2] 开通 MSE 微服务治理

https://help.aliyun.com/zh/mse/getting-started/activate-microservices-governance#task-2140253

[3] ACK 微服务应用接入 MSE 治理中心

https://help.aliyun.com/zh/mse/getting-started/enable-microservices-governance-for-microservice-applications-in-an-ack-cluster

[4] 创建 Nacos 引擎

https://help.aliyun.com/zh/mse/getting-started/create-a-nacos-engine#task-2261346

[5] 创建 MSE 云原生网关

https://help.aliyun.com/zh/mse/getting-started/create-a-cloud-native-gateway#task-2140895

[6] 新建服务来源

https://help.aliyun.com/zh/mse/user-guide/add-a-service-source#task-2081169

[7] ACK 微服务应用接入 MSE 治理中心微服务治理

https://help.aliyun.com/zh/mse/user-guide/enable-microservices-governance-for-microservice-applications-in-an-ack-cluster-1

[8] 节点详情

https://help.aliyun.com/zh/mse/user-guide/node-details

[9] Kubernetes 部署编排

https://help.aliyun.com/document_detail/461384.html

[10] 应用模板

https://help.aliyun.com/document_detail/2674996.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/475199.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

九.pandas绘图基础

目录 九.pandas绘图基础 1-柱状图 --参数stackedTrue堆积 --参数figsize(宽,高) --自定义横坐标 --设置字体&显示负号 2.箱型图 3. 折线图 九.pandas绘图基础 Pandas的DataFrame和Series,在matplotlib基础上封装了一个简易的绘图函数, 使得我们在数据处…

刷题训练之滑动窗口

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟练掌握滑动窗口算法,并且能把下面的…

使用SourceTree获取git代码

1、在浏览器打开git的地址,并且使用用户名和密码登录; 2、输入你的git账号密码; 3、打开SourceTree,地址是自动带过来的,点击第二个“浏览”选择你在D盘或其它盘自己创建的文件夹; 4、正在拉代码&#…

GIT共享 跨仓库操作 子模块

初级代码游戏的专栏介绍与文章目录-CSDN博客 有些文件想在多个项目共享,但是又不能放在一个GIT仓库里,这要用到子模块(submodule),说难不难,就是有些细节要注意。 不过说真的,共享向来不是个好主…

并发编程所需的底层基础

一、计算机运行的底层原理 1.多级层次的存储结构 ①:辅存 固态盘不是主要的应用对象,因为固态盘的使用次数是有限的,无法支撑高并发场景 磁盘存储的最基本原理是电生磁。 磁盘的磁道里边有很多的磁颗粒,磁颗粒上边有一层薄膜为了防止磁点氧…

Android VPN TLV协议场景使用

TLV协议格式是一种可变格式, TLV的意思就是:Type类型, Lenght长度,Value值; Type和Length的长度固定,一般那是2、4个字节; Value的长度有Length指定; 解析方法: 1.读取t…

C++ list详解及模拟实现

目录 本节目标 1. list的介绍及使用 1.2 list的使用 2.list的模拟实现 1.对list进行初步的实现 2.头插和任意位置的插入 3.pos节点的删除,头删,尾删 4.销毁list和析构函数 5.const迭代器 6.拷贝构造和赋值操作 3.完整代码 本节目标 1. list的…

Zookeeper的ZAB协议原理详解

Zookeeper的ZAB协议原理详解 如何保证数据一致性。 Paxos, 吸收了主从。 zk 数据模型Watch机制 zab zookeeper原子广播协议。 ZAB概念 ZooKeeper是通过Zab协议来保证分布式事务的最终一致性。 Zab(ZooKeeper Atomic Broadcast,.ZooKeeper原子广播协议)支持…

8 款AI 绘画生成器:从文本创建 AI 艺术图像

人工智能正在影响各行各业,近年来它对创意产业的影响越来越大。由于AI绘画生成器的可操作性,许多人有机会用自己的想法进行艺术创作——即使他们没有接受过系统的专业艺术教育。 最先进的人工智能绘画生成器可能会改变我们未来创作艺术的方式。使用 AI …

pandas中DataFrame用法(python)

简介 DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以…

【火猫TV】LPL春季赛前瞻:Tabe迎战LNG OMG关键一战!

北京时间3月20日,LPL春季赛今天继续进行,今天将会迎来春季赛常规赛第八周第三个比赛日,今天的两场比赛是LNG战队对阵AL战队以及OMG战队对阵BLG战队,今天的两场比赛对于LNG、AL以及OMG战队都是比较重要的,目前三支战队都…

「Nginx」Nginx配置详解

「Nginx」Nginx配置详解 参考文章1、正向代理和方向代理2、指定域名允许跨域 参考文章 1、Nginx反向代理 2、nginx配置详解 3、Nginx服务器之负载均衡策略(6种) 1、正向代理和方向代理 2、指定域名允许跨域 map $http_origin $allow_cors {default 1;…

vmare17 安装不可启动的iso镜像系统

由于要测试一个软件,要安装一个Windows11_InsiderPreview_Client_x64_zh-cn_26058.iso 于是在虚拟机里捣鼓一下。但是这个iso好像不能直接启动 这样就无法直接安装了,怎么办呢,可以先用个pe系统引导进去,再在PE系统里安装这个iso…

河北库卡机器人KR500电源模块故障,该如何处理?

库卡机器人KR500电源模块常见故障类型及维修方法 1)电源模块故障指示灯亮 故障现象:库卡机器人KR500电源模块上的故障指示灯亮起,机器人不能正常工作。 维修方法:根据故障指示灯的闪烁频率或颜色判断具体的故障类型。然后&#xf…

计算机是如何工作的?CPU、内存、操作系统...

文章目录 前言一、冯诺依曼体系(Von Neumann Architecture)二、内存和硬盘区别三、CPU四、操作系统4.1计算机系统的分层视图4.2进程和线程4.3进程控制块(PCB)4.4进程管理 五、经典面试题 前言 计算的需求在⼈类的历史中是⼴泛存在…

用 ElementPlus的日历组件如何改为中文

文章目录 问题分析 问题 直接引入日历组件后&#xff0c;都是英文&#xff0c;应该如何把头部英文改为中文 <template><el-calendar><template #date-cell"{ data }"><p :class"data.isSelected ? is-selected : ">{{ data.da…

Web and HTTP

Web and HTTP First, a review… ▪ web page consists of objects ▪ object can be HTML file, JPEG image, Java applet, audio file,… ▪ web page consists of base HTML-file which includes several referenced objects ▪ each object is addressable by a URL, e.g.,…

java面向对象进阶---学习第一课

1.static学习&#xff1a; static&#xff0c;是java修饰符&#xff0c;可以修饰成员方法&#xff0c;成员变量。 注意&#xff1a;&#xff01;&#xff01;&#xff01;共享的情况&#xff0c;就是用static来修饰 类名&#xff1a;1.见名知意。2.私有化构造方法 3.方法定义…

发布 AUR 软件包 (ArchLinux)

首发日期 2024-03-09, 以下为原文内容: 理论上来说, 我们应该平等的对待每一个 GNU/Linux 发行版本. 但是, 因为窝日常使用 ArchLinux, 所以对 ArchLinux 有一些特别的优待, 比如自己做的软件优先为 ArchLinux 打包发布. 本文以软件包 librush-bin 为例, 介绍发布 AUR 软件包的…

LF-YOLO

LF-YOLO算法解读&#xff0c;针对x射线图像 1、EMF&#xff1a;网络结构的改变&#xff0c;enhanced multiscale feature(增强的多尺度特性)&#xff0c;多尺度融合模块。利用基于参数的方法和无参数的方法&#xff0c;可以同时结合X射线图像的局部和全局上下文&#xff0c;利用…