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

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

场景描述

本文将以 A、B、C 三个 SpringCloud 应用为例,展示如何通过阿里云云效 AppStack 来整合 MSE 全链路灰度的功能,实现将应用一键部署到灰度环境,并进行全链路灰度的测试。假设已有 A、B、C 三个应用的基线版本正在运行。整体上应用的调用链路是,客户端入口流量首先达到网关应用,而后按顺序经过 A、B、C 三个应用:

image

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

image

前提条件

开启 MSE 微服务治理

操作步骤

步骤一:创建应用,部署基线版本

在云效 应用交付AppStack 创建三个应用,用于部署应用的基线版本。应用的初始化可以使用应用模板批量配置(详见 应用模板)。

高的 - 2024-12-16T142315.562.png

以 spring-cloud-a 应用为例配置流程如下:

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

    高的 - 2024-12-16T142624.908.png

  2. 应用环境配置,应用通常可以划分开发环境、测试环境、预发环境、生产环境,可以关联不同的部署资源(如K8s集群),分别对不同阶段测试验证,并最终提供线上服务。

    高的 - 2024-12-16T143141.420.png

  3. 应用 Kubernetes 部署编排 YAML 配置。

    • 将容器镜像定义成占位符{{ .AppStack.image.backend }},由流水线运行时传入构建好的镜像。

    • 在应用配置的spec.template.metadata.labels下加入 MSE 基本配置及灰度相关。

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

    • {{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 内网域名

    高的 - 2024-12-16T143423.095.png

  4. 应用研发流程配置分为测试阶段、预发阶段、生产阶段。生产阶段包括镜像构建(也可以选择已有镜像发布)、发布审核、生产发布多个任务。

    • 镜像构建:选择镜像构建组件,配置需要推送到的镜像仓库、标签默认${DATETIME}、用于构建的 Dockerfile 路径本示例为mse-simple-demo/A/Dockerfile

    • 人工卡点:配置生产发布的审批人。

    • 生产环境部署:选择AppStack部署组件,应用自动填充当前应用、环境选择「生产环境-prod」,制品选择构建的镜像。

    高的 - 2024-12-16T143603.089.png

    高的 - 2024-12-16T143714.491.png

  5. 单击运行生产发布流程,触发应用镜像构建,镜像构建成功后推送到目标镜像仓库。人工审批通过后,触发部署正式环境,单击查看部署单详情,查看部署进度,部署单成功后即完成了正式(基线)环境的部署。进入环境详情可以查看 Deployment 资源状态和详细信息。

    高的 - 2024-12-16T144136.556.png

    高的 - 2024-12-16T144303.488.png

    高的 - 2024-12-16T144335.960.png

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

步骤二:配置灰度流程

  1. 创建 MSE 全链路灰度泳道。

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

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

高的 - 2024-12-16T145307.978.png

高的 - 2024-12-16T145447.440.png

  1. AppStack 应用增加灰度流程。

    进入云效应用交付AppStack应用,在设置 > 研发流程配置 > 生产阶段编辑流水线。

    1. 在发布阶段添加灰度环境部署任务,选择AppStack 部署组件,应用自动填充当前应用,环境选择灰度环境-gray,制品选择构建的镜像。

    高的 - 2024-12-16T150324.780.png

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

      高的 - 2024-12-16T150431.772.png

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

步骤三:新需求发布,部署灰度环境,灰度验证

  1. 灰度环境部署。

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

高的 - 2024-12-16T151028.992.png

  1. 开始灰度验证。

  • 发起带灰度标识的请求,则结果如下(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 控制台上看到刚刚发起的灰度请求。高的 - 2024-12-16T151519.183.png

步骤四:灰度验证通过,发布生产环境

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

高的 - 2024-12-16T151748.411.png

高的 - 2024-12-16T151829.620.png

步骤五:生产发布成功后,销毁灰度环境

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

高的 - 2024-12-16T151910.754.png

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