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

在运用开发测验验证通往后、进行出产发布前,为了降低新版别发布带来的危险,期望能够先布置到灰度环境,用小部分事务流量进行全链路灰度验证,验证通往后再全量发布出产。本文主要介绍怎么经过阿里云 MSE 微服务引擎和云效运用交给平台AppStack 完结灰度发布。

读完本文,你将了解到:

  • 以 SpringCloud 运用为例,了解全链路灰度场景及其工作原理;
  • 怎么根据云效 Appstack 完结运用基线环境的布置,实时观测环境布置进展;
  • 怎么滑润为存量运用增加灰度环境、灰度发布流程,不影响已有发布流程;
  • 怎么根据 MSE 完结自定义多种灰度路由规矩条件,精准测验灰度流量;
  • 怎么完结运用灰度环境下线,及时整理无用资源。

场景描绘

本文将以 A、B、C 三个 SpringCloud 运用为例,展示怎么经过阿里如此效 AppStack 来整合 MSE 全链路灰度的功用,完结将运用一键布置到灰度环境,并进行全链路灰度的测验。

假定已有 A、B、C 三个运用的基线版别正在运转。全体上运用的调用链路是,客户端进口流量首先抵达网关运用,然后按顺序经过 A、B、C 三个运用:

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

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

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

全体计划

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

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

操作实践

前提条件

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 + 阿里云 MSE 完结运用服务全链路灰度

在云效 AppStack 创立三个运用,布置运用基线版别。

我们以 spring-cloud-a 运用为例,详细介绍一个运用的装备流程:

第 1 步:运用相关代码仓库,能够在云效 Codeup 中导入示例代码:github.com/aliyun/alib…

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

第 2 步:运用环境装备,一个运用一般能够划分为测验环境(test)、预发环境(pre)、灰度环境(gray)、出产环境(prod),环境相关不同的布置资源(如 K8s 集群),布置服务别离用于不同阶段进行测验验证,并终究提供线上服务。

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

第 3 步:运用 Kubernetes 布置编列 YAML 装备。

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

  • 将容器镜像定义成占位符 {{ .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 步:运用研制流程装备,一般一个运用的研制流程能够分为测验阶段、预发阶段、出产阶段。

出产阶段一般包含镜像构建(也能够挑选已有镜像发布)、发布审核、出产发布多个使命。

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

  • 镜像构建:挑选「镜像构建」组件,装备需求推送到的镜像仓库、标签默许 ${DATETIME}、用于构建的 Dockerfile 路径本示例为 mse-simple-demo/A/Dockerfile。
  • 人工卡点:装备出产发布的批阅人。
  • 出产环境布置:挑选「AppStack 布置」组件,运用主动填充当时运用、环境挑选「出产环境-prod」,制品挑选构建的镜像。

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

第 5 步:点击「运转」出产发布流程,触发运用镜像构建,镜像构建成功后推送到方针镜像仓库。

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

人工批阅通往后,触发布置正式环境。点击检查「布置单概况」,检查布置进展。布置单成功后即完结了正式(基线)环境的布置。

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

进入环境概况能够检查 Deployment 资源状态和详细信息。

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

以上即完结了运用 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。

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

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

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

3.3.2 AppStack 运用增加灰度流程

进入云效 AppStack 运用-设置-研制流程,编辑「出产阶段」流程:

在人工卡点使命后增加「灰度环境布置」使命:挑选「AppStack 布置」组件,运用主动填充当时运用,环境挑选「灰度环境-gray」,制品挑选构建的镜像。

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

在出产发布使命后增加「灰度环境整理」使命:挑选「AppStack 整理环境」组件,运用主动填充当时运用,环境挑选「灰度环境-gray」,挑选「仅整理资源保留环境元数据」,下次发布时能够重新布置拉起灰度服务资源。

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

装备完结后,保存出产阶段流程,即可进入下一步。

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

3.4.1 灰度环境布置

当接收到一个新的事务需求,涉及 spring-cloud-a 和 spring-cloud-c 两个运用的改动。A、C 两个运用各自完结代码开发、测验预发验证后,进入出产发布阶段。别离点击「运转」A、C 出产阶段研制流程,触发 A、C 灰度环境布置,点击检查「布置单概况」,布置单成功后即完结 A、C 灰度环境的布置。

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

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 操控台上看到刚刚建议的灰度恳求:

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

3.5 灰度验证经过,发布出产环境

上述灰度验证通往后,即可继续发布出产环境。点击手动触发出产环境发布,检查出产发布批次,观测新老版别号,布置完结后观测出产监控日志。

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

3.6 出产发布成功后,毁掉灰度环境

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

云效 AppStack + 阿里云 MSE 完结运用服务全链路灰度

至此即完结了运用基线环境的准备、灰度流程装备、灰度发布验证、出产发布、灰度毁掉完整流程。

相关链接:

[1]保证在云效运用交给 AppStack 内翻开研制流程功用

help.aliyun.com/document_de…

[2]注册 MSE 微服务管理

help.aliyun.com/zh/mse/gett…

[3]ACK 微服务运用接入 MSE 管理中心

help.aliyun.com/zh/mse/gett…

[4]创立 Nacos 引擎

help.aliyun.com/zh/mse/gett…

[5]创立 MSE 云原生网关

help.aliyun.com/zh/mse/gett…

[6]新建服务来历

help.aliyun.com/zh/mse/user…

[7]ACK 微服务运用接入 MSE 管理中心微服务管理

help.aliyun.com/zh/mse/user…

[8]节点概况

help.aliyun.com/zh/mse/user…

[9]Kubernetes 布置编列

help.aliyun.com/document_de…

[10]运用模板

help.aliyun.com/document_de…