MSE实现全链路灰度

更新时间: 2023-12-05 16:36:33

一键部署

60

https://www.aliyun.com/solution/tech-solution/iflgbomse

方案概览

微服务场景下,随着业务不断迭代,新功能上线时通常会涉及到多个应用需要同时发布新版本。在新版本正式上线之前,往往需要同时对多个应用进行灰度验证,确认无误后再将应用正式上线。MSE微服务治理提供全链路灰度能力,让您在不修改业务代码的情况下实现全链路流量控制,端到端构建从网关到多个后端服务的全链路灰度。

本技术解决方案以基于MSE实现ACK应用的全链路灰度为例,为您演示:

  • 如何创建ACK集群并创建应用。

  • 如何搭建业务应用的基线环境,包括部署后端业务应用的基线版本,将后端业务应用接入MSE微服务治理并通过MSE云原生网关暴露应用A。完成后,测试基线版本流量是否正常。

  • 如何搭建业务应用的灰度环境,包括后端业务应用的灰度版本并创建灰度环境泳道。完成后,测试灰度版本的流量路由链路是否正常。

方案架构

方案提供的默认设置(如地域、VPC、ACK集群、MSE网关实例、MSE Nacos等)完成部署后在阿里云上搭建的网站运行环境如下图所示。实际部署时您可以根据资源规划修改部分设置,但最终形成的运行环境与下图相似。image.png

本方案的技术架构包括以下基础设施和云服务:

  • 1个地域:ACK集群、微服务应用、MSE实例均部署在同一地域下。

  • 1个专有网络VPC:形成云上私有网络,确保核心云资源的网络环境,如容器服务ACK、微服务引擎MSE。

  • ACK集群:简单、低成本、高可用的Kubernetes集群,支持应用管理,无需您管理控制面板。

  • MSE云原生网关:提供可靠高效的符合K8s Ingress标准的下一代Gateway,将Ingress流量网关和微服务网关二合一。

  • MSE微服务治理:无侵入增强主流Spring Cloud、Apache Dubbo等开源微服务框架,提供丰富的服务治理和流量防护功能,将中间件与业务解耦。

  • MSE注册配置中心:全托管的注册配置中心,兼容NacosZooKeeperEureka,具备丰富完善的监控报警、控制台运维操作和引擎类型。您可以根据原有业务依赖进行选择,本方案将以MSE Nacos为例演示。

部署准备

10

开始部署前,请按以下指引完成账号申请、账号充值、RAM用户创建和授权。

准备账号

  1. 如果您还没有阿里云账号,请访问阿里云账号注册页面,根据页面提示完成注册。阿里云账号是您使用云资源的付费实体,因此是部署方案的必要前提。

  2. 为阿里云账号充值

    • 本方案的云资源支持按量付费,且默认设置均采用按量付费引导操作。请确保您的账户余额大于等于100元。

    • 完成本方案的部署及体验,预计产生费用约为13元(假设您配置ACK集群和MSE实例时选择本文指导的规格资源,且资源运行时间不超过1个小时。实际情况可能会因您操作过程中使用的资源规格和流量差异,导致费用有所变化,请以控制台显示的实际报价以及最终账单为准)。

      产品

      费用来源

      规格

      预估费用参考

      容器服务 Kubernetes 版

      CLB Ingress费用

      标准型I(slb.s2.small)

      实例费用:0.34/小时

      流量费用:0.8/GB

      CLB API Server费用

      标准型I(slb.s2.small)

      0.320元/时

      NAT费用

      公网NAT网关

      • 实例费:0.195元/时

      • 容量单位CU费:0.195元/CU

      EIP费用

      不涉及

      • EIP配置费:0.02元/小时

      • 流量费用:0.8元/GB

      ECS费用

      3个通用型g6 4vCPU 16GiB的实例;系统盘为云盘ESSD,40GiB,PL0。

      3.126元/小时

      集群管理费用

      不涉及

      0.64元/小时

      微服务引擎 MSE

      MSE微服务治理

      专业版

      约为3元/时

      MSE注册配置中心

      专业版,2核4G

      2.31/时

      MSE云原生网关

      2核4G

      1.68元/时

      按量费用:11.631元/时待确认

      CU容量费用产品:1个

      流量费用产品:2个

  3. 阿里云账号拥有操作资源的最高权限,从云资源安全角度考虑,建议您创建RAM用户。RAM用户需要获得相关云服务的访问权限才能完成方案部署,详情如下:

    1. 访问RAM控制台-用户页面,单击创建用户,填写相关信息,勾选控制台访问OpenAPI 调用访问,自定义密码并选择无需重置密码,创建一个RAM用户。

    2. 在RAM用户列表的操作列,单击目标RAM用户对应的添加权限。在添加权限面板,在选择权限策略的系统策略区域,搜索并新增如下权限,然后单击确定

      涉及的云服务:资源编排 ROS、容器服务 Kubernetes 版、微服务引擎 MSE、专有网络 VPC、云服务器 ECS、访问控制RAM、费用中心 BSS。

      每次支持最多绑定5条策略,请分2次操作添加如下权限。

      云服务

      需要的权限

      描述

      资源编排 ROS

      AliyunROSFullAccess

      管理资源编排服务 ROS的权限。

      容器服务 ACK

      AliyunCSFullAccess

      管理容器服务 ACK的权限。

      微服务引擎 MSE

      AliyunMSEFullAccess

      管理微服务引擎 MSE的权限。

      专有网络 VPC

      AliyunVPCFullAccess

      管理专有网络 VPC的权限。

      云服务器 ECS

      AliyunECSFullAccess

      管理云服务器服务 ECS的权限。

      访问控制 RAM

      AliyunRAMFullAccess

      管理访问控制 RAM的权限,即管理用户以及授权的权限

      费用中心 BSS

      AliyunBSSReadOnlyAccess

      只读访问费用中心 BSS的权限。

      创建RAM用户后,您可以使用RAM用户登录阿里云控制台,开始本方案的部署和体验。

      RAM用户的使用请参见创建RAM用户创建自定义权限策略为RAM用户授权

    3. 单击云资源访问权限,然后单击同意授权

      此页权限为可供容器服务 ACK使用的角色。授权后,ACK拥有对您云资源相应的访问权限。

一键部署

15

您可以通过下方提供的ROS一键部署链接,来自动化地完成以下资源的创建和配置。部署完成后,您可以参见教程实现并体验如何通过MSE微服务治理完成ACK应用的全链路灰度。

  • 创建一个ACK Pro版集群

  • 开通MSE云原生网关并创建MSE网关实例

  • 开通MSE注册配置中心并创建MSE Nacos实例

  • 关联MSE Nacos与MSE云原生网关

1、ROS部署前置资源

  1. 打开一键配置模板链接前往ROS控制台,系统自动打开并停留在配置模板参数页面,请在配置资源栈前在页面上方选择地域。本方案示例地域为华东1(杭州)。

  2. 配置模板参数页面,配置基础信息,确认无误后单击创建

    配置项

    说明

    示例

    资源栈名称

    本资源栈的名称。保持默认即可。

    保持默认

    ACK托管版集群名称

    ACK托管版集群的名称。本方案中的ACK集群名称默认为testcluster。如您的账号下已存在同名ACK集群,请更改该名称,避免集群名称重复导致的资源栈创建失败。

    testcluster

    可用区

    在规划的地域内选择主、备可用区(选择备可用区以实现多可用区容灾)。

    可用区I、可用区H

    ACK配置

    • Worker节点规格:支持选择多个实例规格。可通过vCPU内存筛选实例规格,也可选择架构分类。本方案选择通用型实例规格即可。关于ECS选型的最佳实践请参见选型最佳实践

    • Worker节点系统盘磁盘类型:系统盘可选的类型与选择的实例规格相关。查询实例规格支持的云盘类型,请参见实例规格族。本方案保持默认即可。

    • Worker节点系统盘大小(GB):保持默认即可。

    • 通用型 g6 4 vCPU 16GiB

    • cloud_essd

    • 120

    MSE配置

    注册配置中心实例MSE Nacos的名称。本方案中的MSE Nacos名称默认为test。如您的账号下已存在同名MSE Nacos实例,请更改该名称,避免名称重复导致的资源栈创建失败。

    test

  3. 资源栈信息页面的状态显示为创建成功时表示一键配置完成。

2、开通MSE微服务治理

  1. 访问MSE微服务治理开通页面,单击微服务治理页签,配置商品类型为按量付费、版本为专业版,然后在服务协议区域,仔细阅读并勾选服务协议,然后单击立即开通,开通微服务治理专业版。详细信息,请参见开通MSE微服务治理

  2. 开通成功后,单击管理控制台,在欢迎访问页面单击立即授权,然后单击确定

  3. 单击下一步,然后单击立即体验微服务引擎MSE

搭建基线环境

20

1、部署后端业务应用的基线版本

本小节提供YAML示例,展示如何部署后端应用A、B、C的基线版本。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 在页面上方,选择集群的命名空间,本示例使用默认的default命名空间,然后单击右上角的使用YAML创建资源,选择示例模板为自定义,然后在模板区域复制以下YAML文件内容,部署A、B、C三个应用的基线版本,然后单击创建

    以下示例代码中的{nacos server address}需要替换为MSE Nacos的内网域名,并删去大括号{}。您可以登录MSE网关管理控制台,在左侧导航栏,选择注册配置中心>实例列表,然后在访问方式列,获取MSE Nacos的内网域名。

    # 应用A的基线版本
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-a
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-a
      template:
        metadata:
          labels:
            app: spring-cloud-a
            msePilotCreateAppName: spring-cloud-a
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-a
            image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:1.0.0
            imagePullPolicy: Always
            ports:
              - containerPort: 20001
            livenessProbe:
              tcpSocket:
                port: 20001
              initialDelaySeconds: 30
              periodSeconds: 60
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: {nacos server address}
            - name: dubbo.registry.address
              value: 'nacos://{nacos server address}:8848'
    ---
    # 应用B的基线版本
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-b
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-b
      template:
        metadata:
          labels:
            app: spring-cloud-b
            msePilotCreateAppName: spring-cloud-b
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-b
            image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:1.0.0
            imagePullPolicy: Always
            ports:
              - containerPort: 20002
            livenessProbe:
              tcpSocket:
                port: 20002
              initialDelaySeconds: 30
              periodSeconds: 60
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: {nacos server address}
            - name: dubbo.registry.address
              value: 'nacos://{nacos server address}:8848'
    ---
    # 应用C的基线版本
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-c
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-c
      template:
        metadata:
          labels:
            app: spring-cloud-c
            msePilotCreateAppName: spring-cloud-c
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-c
            image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:1.0.0
            imagePullPolicy: Always
            ports:
              - containerPort: 20003
            livenessProbe:
              tcpSocket:
                port: 20003
              initialDelaySeconds: 30
              periodSeconds: 60
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: {nacos server address}
            - name: dubbo.registry.address
              value: 'nacos://{nacos server address}:8848'

    创建成功后,您可以在无状态页面的应用列表中查看创建成功的应用A、B、C的基线版本。

2、将后端业务应用接入MSE微服务治理

ACK应用部署成功后,您需要在MSE微服务治理控制台接入该应用。

  1. 登录MSE治理中心控制台,在顶部菜单栏选择地域,在左侧导航栏,选择治理中心>应用治理

  2. 单击ACK应用接入,参照下文完成配置后,单击确定

    1. 安装ack-onepilot:在ack-onepilot区域,单击点击安装

      安装成功后,此区域显示已安装版本。

    2. 配置ACK集群和命名空间信息:

      • 接入类型:命名空间接入

      • 集群类型:ACK集群

      • 集群名称/ID:testcluster

      • 集群命名空间:应用所在的命名空间,default

      • 接入治理命名空间:default

  3. 在接入成功提示对话框,阅读提示,然后单击去重启,跳转至容器服务管理控制台的集群列表,单击目标集群testcluster,然后在左侧导航栏单击工作负载>无状态,勾选应用列表的spring-cloud-a、spring-cloud-b、spring-cloud-c,然后单击下方的重新部署

  4. 返回MSE治理中心控制台,单击接入成功提示对话框的我已知晓

    此时,应用列表区域将显示spring-cloud-a、spring-cloud-b、spring-cloud-c对应的应用概览卡片,表明ACK应用接入成功。

3、通过MSE云原生网关暴露应用A

应用基线版本部署成功后,您需要通过MSE云原生网关添加并暴露应用A。

  1. 登录MSE网关管理控制台,在左侧导航栏,选择云原生网关>网关列表,然后在顶部菜单栏选择地域。

  2. 网关列表页面,单击目标网关名称test,然后在左侧导航栏,选择服务管理>服务列表,然后单击创建服务

  3. 创建服务面板,选择服务来源MSE Nacos,选择对应命名空间,并在服务列表选择sc-A,单击image..png将sc-A移动到右侧已选择区域,然后单击确定

    关于创建服务的更多信息,请参见添加服务

  4. 在服务列表的操作列,单击sc-A对应的策略配置,在服务版本区域,确认如下配置信息。

    • 版本名称base

    • 标签名opensergo.io/canary

    • 标签值为空。

      image.png

      正常情况下,云原生网关默认为导入的Nacos的服务添加以上base版本,且base版本的实例数大于0。

      如果base版本实例数显示为0,表明您安装的MSE Java Agent版本太低。请卸载原有的ack-onepliot,重新安装ack-onepliot,并确保ack-onepliot的版本为2.8.0及以上,然后重新部署应用A,部署完毕之后确认实例数是否大于0。关于的操作步骤,请参见为ACK命名空间中的应用开启MSE微服务治理

  5. 查看完成后,单击页面左上角的image..png返回服务列表页面,然后在左侧导航栏单击路由管理>路由配置,然后单击创建路由

  6. 创建路由面板,配置请求信息目标服务,配置完成后单击保存并上线

    1. 请求信息:配置路由名称(本示例配置为test)和关联域名(本示例配置为*),匹配规则选择前缀匹配(本示例配置为/a),其他配置选择默认,然后单击下一步

    2. 目标服务目标服务选择标签路由,添加服务并选择服务sc-A,服务的版本选择base,勾选设置fallback服务,选择服务sc-A,并将其版本设置为不限制,使sc-A达到高可用的目的。

4、测试基线版本流量

应用暴露完成后,您可以使用curl命令测试基线版本的流量路由链路。

  1. 登录MSE网关管理控制台,在左侧导航栏,选择云原生网关>网关列表,然后在顶部菜单栏选择地域。

  2. 网关列表页面,单击目标网关名称,在左侧导航栏,单击基本概览,然后单击网关入口页签,查看并记录SLB的入口地址(ip)用于下一步的流量测试。

  3. 用curl命令,测试基线版本流量,发现流量经过了A、B和C的基线版本。如下所示。

    # 测试命令
    curl x.x.1.1/a
    
    # 测试结果
    A[10.0.3.178] -> B[10.0.3.195] -> C[10.0.3.201]%

搭建灰度环境

20

1、部署后端业务应用的灰度版本

如果业务应用要发布新功能,新功能要求应用A和应用C同时发版,此时需要借助全链路灰度来同时验证不同应用的灰度版本。基线版本准备完成后,您需要搭建业务应用的灰度环境。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 在页面上方,选择集群的命名空间,然后单击右上角的使用YAML创建资源,选择示例模板为自定义,然后在模板区域复制以下YAML文件内容,部署A、C两个应用的灰度版本。

    以下示例代码中的{nacos server address}需要替换为MSE Nacos的内网域名,并删去大括号{}。

    # 应用A的灰度版本
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-a-gray
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-a-gray
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            app: spring-cloud-a-gray
            msePilotCreateAppName: spring-cloud-a
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-a
            image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:1.0.0
            imagePullPolicy: Always
            ports:
              - containerPort: 20001
            livenessProbe:
              tcpSocket:
                port: 20001
              initialDelaySeconds: 30
              periodSeconds: 60
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: {nacos server address}
            - name: dubbo.registry.address
              value: 'nacos://{nacos server address}:8848'
    ---
    # 应用C的灰度版本
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-cloud-c-gray
      namespace: default
    spec:
      selector:
        matchLabels:
          app: spring-cloud-c-gray
      template:
        metadata:
          labels:
            alicloud.service.tag: gray
            app: spring-cloud-c-gray
            msePilotCreateAppName: spring-cloud-c
            msePilotAutoEnable: 'on'
        spec:
          containers:
          - name: spring-cloud-c
            image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:1.0.0
            imagePullPolicy: Always
            ports:
              - containerPort: 20003
            livenessProbe:
              tcpSocket:
                port: 20003
              initialDelaySeconds: 30
              periodSeconds: 60
            env:
            - name: spring.cloud.nacos.discovery.server-addr
              value: {nacos server address}
            - name: dubbo.registry.address
              value: 'nacos://{nacos server address}:8848'

2、创建灰度环境泳道

  1. 登录MSE治理中心控制台,在顶部菜单栏选择地域,在左侧导航栏,选择治理中心>全链路灰度

  2. 在页面上方选择命名空间,然后单击创建泳道组及泳道,在创建泳道组面板,设置如下相关配置,然后单击确定

    配置项

    描述

    示例

    泳道组名称

    自定义泳道组的名称。

    demo

    入口类型

    网关入口类型。

    MSE 云原生网关

    泳道组流量入口

    流量入口网关。

    此前创建的MSE Nacos网关

    泳道组涉及应用

    泳道组中涉及的应用。

    spring-cloud-aspring-cloud-bspring-cloud-c

  3. 全链路灰度页面下方,单击点击创建第一个分流泳道,在创建泳道面板,设置流控泳道相关配置,然后单击确定

    配置项

    描述

    示例

    配置节点标签

    配置方式:登录容器服务管理控制台,在左侧导航栏单击集群,然后在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载>无状态。在操作列,依次单击应用对应的更多>查看Yaml,在YAML的spec.template.metadata.labels下增加alicloud.service.tag:{tag},然后单击更新

    修改示例可参照下图。image.png

    在应用A、B、C(spring-cloud-a、spring-cloud-b、spring-cloud-c)的YAML的spec.template.metadata.labels下增加alicloud.service.tag: gray

    添加应用

    选择或输入应用所属泳道标签后,将自动显示泳道名称。

    gray

    路由规则

    选择已在网关创建的基线路由:选择此前创建的路由。

    test

    条件模式:路由条件之间的关系。

    默认选中

    条件列表:单击下方的+ 添加新的规则条件,新增规则条件,配置参数类型参数条件

    • 参数类型:Header

    • 参数:canary

    • 条件:精确匹配

    • :gray

完成及清理

5

方案验证

应用暴露完成后,您可以使用curl命令测试灰度版本的流量路由链路。

  1. 登录MSE网关管理控制台,在左侧导航栏,选择云原生网关>网关列表,然后在顶部菜单栏选择地域。

  2. 网关列表页面,单击目标网关名称,在左侧导航栏,单击基本概览,然后单击网关入口页签,查看并记录SLB的入口地址(ip)用于下一步的流量测试。

  3. 用curl命令,测试灰度版本流量。

    # 测试命令
    curl -H "canary: gray" x.x.x.x/a
    
    # 测试结果
    Agray[10.0.3.177] -> B[10.0.3.195] -> Cgray[10.0.3.180]

    预期输出表明,流量经过了A、C的灰度环境,由于B没有gray环境,所以流量自动容灾到基线版本。

清理资源

完成本方案后,如您无需使用相关资源,请清理相关数据和资源。

  • ROS资源

    如果无需使用资源,可以资源栈下的资源,包括1个ACK集群、1个MSE Nacos实例、1个MSE网关云原生网关实例。

    1. 登录ROS控制台,然后在左侧导航栏,选择资源栈

    2. 资源栈页面的顶部选择部署的资源栈所在地域,找到资源栈,然后在其右侧操作列,单击删除

      本方案会自动创建两个资源栈,一个由您部署时创建,另一个以k8s-开头,由ACK创建集群时创建。请删除非k8s-开头的资源栈,删除此资源栈时将自动删除k8s-开头的资源栈。

    3. 删除资源栈对话框,选择删除方式释放资源,然后单击确定,根据提示完成资源释放。

  • MSE微服务治理

    1. 如果无需继续使用,请登录MSE治理中心控制台,在左侧导航栏单击治理中心>应用治理,找到目标应用,在目标应用卡片上单击image图标,然后单击移除。在弹出的删除对话框,单击确定。删除应用后,此应用对应的所有规则也将被清空。

    2. 然后,请删除泳道及其流量分配。在左侧导航栏单击治理中心>全链路灰度,单击创建泳道组右侧的image.png,然后单击泳道组页签的image.png,在对话框单击确定。在下方流量分配区域,单击操作列删除,然后在对话框单击确定