云效 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot网站开发如何配置log4j日志插件

springboot网站开发如何配置log4j日志插件!为了便于服务器等环境下的错误情况的排查根源,还是很有必要使用日志插件的,它可以记录下我们提前埋下的锚点信息。 在遇到故障,查看这些锚点记录的日志信息,可以快速高效的解…

低压MOS在无人机上的应用-REASUNOS瑞森半导体

一、前言 无人机的结构由机身、动力系统、飞行控制系统、链路系统、任务载荷等几个方面组成的。 无人机动力系统中的电机,俗称“马达”,是无人机的动力来源,无人机通过改变电机的转速来改变无人机的飞行状态。即改变每个电机的速度&#xf…

【Django开发】前后端分离美多商城项目第3篇:用户部分,1. 后端接口设计:【附代码文档】

美多商城项目4.0文档完整教程(附代码资料)主要内容讲述:美多商城,项目准备1.B2B--企业对企业,2.C2C--个人对个人,3.B2C--企业对个人,4.C2B--个人对企业。项目准备,配置1. 修改settings/dev.py 文件中的路径信息,2. INS…

数据结构--二叉树(超详细)

目录 1. 树概念及结构 1.1树概念 1.2树的表示 2. 二叉树概念及结构 2.1概念 2.2数据结构中的二叉树 2.3特殊的二叉树 2.4二叉树的存储结构 2.4.1顺序存储 2.4.2链式存储 2.5二叉树的性质 3. 二叉树顺序结构及概念 3.1二叉树的顺序结构 3.2堆的概念及结构 3.3堆的…

uinapp开发-PHP语言-后端安装说明-适用于圈子-陪玩-交友-校园-团购-外卖-分销等多系统-APP小程序H5多端皆有!

后端安装说明 全新安装客户,按此安装调试步骤,请按顺序: ** 后台安装步骤及说明 ** 1、在服务器里安装宝塔。下载www.bt.cn。 宝塔安装完毕后,安装环境,Nginx或者Apache 请选择PHP7.3 数据库mysql5.6。 NGINX 1.22.1轻…

matlab ICP配准高阶用法——统计每次迭代的配准误差并可视化

目录 一、概述二、代码实现三、结果展示1、原始点云2、配准结果3、配准误差本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 在进行论文写作时,需要做对比实验,来分析改进算法的性能,期间用到了迭代误差分布统…

前端框架推荐 Arco Design

Arco Design - 企业级产品的完整设计和开发解决方案 预览地址:Arco Design Pro - 开箱即用的中台前端/设计解决方案 一 开发 有vue3、React版本。 文档地址:Arco Design - 企业级产品的完整设计和开发解决方案 还配有对应脚手架:GitHub -…

【网络安全】CobaltStrike 使用

本文章仅用于信息安全学习,请遵守相关法律法规,严禁用于非法途径。若读者因此作出任何危害网络安全的行为,后果自负,与作者无关。 Cobalt Strike是一款渗透测试神器,Cobalt Strike已经不再使用MSF而是作为单独的平台使…

ubuntu 22.04 安装驱动可能遇到的坑

1. 第一个坑 【gcc版本不匹配】 请确认你的gcc版本是不是12的,11是编译不通过的。 一般在最后编译时报错,在/var/log/nvidia-installer.log日志中可以看到以下字样 Warning: Compiler version check failed:The major and minor number of the compil…

Flink GateWay、HiveServer2 和 hive on spark

Flink SQL Gateway简介 从官网的资料可以知道Flink SQL Gateway是一个服务,这个服务支持多个客户端并发的从远程提交任务。Flink SQL Gateway使任务的提交、元数据的查询、在线数据分析变得更简单。 Flink SQL Gateway的架构如下图,它由插件化的Endpoi…

探秘开源隐语:架构深度剖析与隐私计算技术之旅

1.隐语架构 隐语(SecretFlow)作为蚂蚁集团开源的可信隐私计算框架,其架构设计具有多层次的特点,虽然具体分层名称可能会根据实际描述略有差异,但我们可以依据已有的技术和信息对其进行结构化的拆解: 硬件层…

如何使用Excel创建一个物品采购表

在企业的日常运营中,物品采购是一个常见且重要的活动。有效的采购管理不仅可以确保企业及时获得所需物资,还可以控制成本、提高效率。Microsoft Excel是一个功能强大的工具,它可以帮助我们创建和管理物品采购表。本文将详细介绍如何使用Excel…

Lua | 一篇文章讲清Lua语法及热更新

目录 一、环境搭建 二、Lua语法 1.输出print、单行注释、多行注释 2.变量 (1)nil (2)number (3)string (3.1)字符串长度 (3.2)字符串拼接 &#xf…

归并算法详细解析

归并排序 1945年,约翰冯诺依曼(John von Neumann)发明了归并排序,这是典型的分治算法的应用。归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di…

数学建模(Topsis python代码 案例)

目录 介绍: 模板: 案例: 极小型指标转化为极大型(正向化): 中间型指标转为极大型(正向化): 区间型指标转为极大型(正向化): 标…

RequestResponse使用

文章目录 一、Request&Response介绍二、Request 继承体系三、Request 获取请求数据1、获取请求数据方法(1)、请求行(2)、请求头(3)、请求体 2、通过方式获取请求参数3、IDEA模板创建Servlet4、请求参数…

WEB 表单练习题

任务如图&#xff1a; <html><head><meta charest"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head><body><table width"…

Google的MELON: 通过未定位图像重建精确3D模型的突破性算法

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

算法沉淀——贪心算法七(leetcode真题剖析)

算法沉淀——贪心算法七 01.整数替换02.俄罗斯套娃信封问题03.可被三整除的最大和04.距离相等的条形码05.重构字符串 01.整数替换 题目链接&#xff1a;https://leetcode.cn/problems/integer-replacement/ 给定一个正整数 n &#xff0c;你可以做如下操作&#xff1a; 如果…

数据结构:堆的创建和使用

上一期我们学习了树和二叉树的定义&#xff0c;其中我们了解到了两种特殊的二叉树&#xff1a;满二叉树和完全二叉树。 今天我们还要学习一种新的结构&#xff1a;堆 那这种结构和二叉树有什么联系呢&#xff1f;&#xff1f;&#xff1f; 通过观察我们可以发现&#xff0c;…