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

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

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


读完本文,你将了解到:

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


1. 场景描述


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

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

1.png

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

2.png


2. 操作实践

2.1 开启 MSE 微服务治理


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

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

3.png

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

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

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

第3步:应用 Kubernetes 部署编排 YAML 配置 6.png

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


说明

msePilotCreateAppName为 MSE 服务治理接入的应用名;

msePilotAutoEnable为是否接入MSE服务治理的开关 on 表示开启,off 表示关闭;alicloud.service.tag则是 MSE 用于灰度发布的节点标签。您可以在 MSE 服务治理控制台,节点详情页面看到节点的标签情况。更多信息,请参见ACK微服务应用接入MSE治理中心微服务治理、节点详情

{{if eq .AppStack.envName "gray" }}是基于 GO template 的方式识别当前云效发布的应用环境。如果环境名称为gray,则为灰度服务。更多信息,请参见Kubernetes 部署编排

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'
{{ if eq .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步:应用研发流程配置,通常一个应用的研发流程可以分为测试阶段、预发阶段、生产阶段。 生产阶段通常包括镜像构建(也可以选择已有镜像发布)、发布审核、生产发布多个任务。 7.png

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


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

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

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

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


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


2.3 配置灰度流程

2.3.1 创建 MSE 全链路灰度泳道

  • 创建全链路灰度泳道组:进入 MSE 治理中心 > 全链路灰度,单击+ 创建泳道组及泳道(如果您已经创建过泳道组,则单击+ 创建泳道组)。入口类型选择「MSE 云原生网关」,泳道组流量入口选择目标云原生网关,泳道组涉及应用选择 spring-cloud-a、spring-cloud-b、spring-cloud-c。 12.png
  • 创建分流泳道:泳道标签设置为 gray,路由规则条件列表添加 Parameter group=gray,则请求参数中携带 group=gray 的去往灰度泳道。 13.png


2.3.2 AppStack 应用增加灰度流程

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

  • 在人工卡点任务后添加「灰度环境部署」任务:选择「AppStack 部署」组件,应用自动填充当前应用,环境选择「灰度环境-gray」,制品选择构建的镜像。 14.png
  • 在生产发布任务后添加「灰度环境清理」任务:选择「AppStack清理环境」组件,应用自动填充当前应用,环境选择「灰度环境-gray」,选择「仅清理资源保留环境元数据」,下次发布时可以重新部署拉起灰度服务资源。 15.png

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


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

2.4.1 灰度环境部署

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

16.png


2.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=xxx
A[192.168.110.162][config=base] -> B[192.168.110.57] -> C[192.168.110.62]

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

17.png


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

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

18.png

19.png


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

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

20.png

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

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
SVN版本控制系统
SVN是现在软件开发之中的主流软件版本控制工具,在工作之中利用SVN可以有效的解决多人开发的代码管理问题,本课程将为读者讲解SVN服务器的配置以及基于MyEclipse的SVN客户端插件的配置与使用,并且在讲解之中着重讲解了冲突的产生于解决。
目录
相关文章
|
6天前
|
JSON 运维 Kubernetes
云效产品使用报错问题之流水线中配置了AppStack,构建时下载的制品内容为json字符串,如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
6天前
|
敏捷开发 Serverless 测试技术
云效产品使用常见问题之appstack部署单拿不到最新的镜像如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
11天前
|
API
阿里云微服务引擎及 API 网关 2024 年 3 月产品动态
阿里云微服务引擎及 API 网关 2024 年 3 月产品动态。
|
1月前
|
Kubernetes JavaScript API
云效常见问题之appstack连接自定义k8s连不上如何解决
云效(CloudEfficiency)是阿里云提供的一套软件研发效能平台,旨在通过工程效能、项目管理、质量保障等工具与服务,帮助企业提高软件研发的效率和质量。本合集是云效使用中可能遇到的一些常见问题及其答案的汇总。
262 1
|
1月前
|
Cloud Native 测试技术 Nacos
云效 AppStack + 阿里云 MSE 实现应用服务全链路灰度
本文介绍了如何通过阿里云 MSE 微服务引擎和云效应用交付平台 AppStack 实现灰度发布。
90822 3
|
7月前
|
安全 数据可视化 Devops
阿里云云原生 DevOps - 云效平台核心价值与优势
阿里云云原生 DevOps - 云效平台核心价值与优势
632 0
阿里云云原生 DevOps - 云效平台核心价值与优势
|
7月前
|
安全 Devops 测试技术
DevOps高效开发管理-云效实践初体验
本实验带您体验通过云效产品,实现快速持续交付。
2032 0
|
7月前
|
存储 安全 测试技术
阿里云云原生 DevOps-云效平台六大产品(2)
阿里云云原生 DevOps-云效平台六大产品(2)
1202 0
阿里云云原生 DevOps-云效平台六大产品(2)
|
10月前
|
Devops 容器
云效是一款企业级 DevOps 平台
云效是一款企业级 DevOps 平台
454 0
|
Devops
《云效平台连同飞天敏捷版,共同打造企业DevOps解决方案》电子版地址
云效平台连同飞天敏捷版,共同打造企业DevOps解决方案
327 0
《云效平台连同飞天敏捷版,共同打造企业DevOps解决方案》电子版地址

相关产品