基于MSE实现微服务的全链路灰度

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介: 本场景提供MSE Ingress网关集群和Kubernates集群,部署Demo服务。您将掌握支持Spring Cloud/Dubbo、云原生网关的全链路灰度方案。

基于MSE实现微服务的全链路灰度


1. 实验资源方式简介及开始实验

云起实验室实验资源方式介绍

云起实验室支持公共资源体验、领取免费试用额度、个人账户资源三种实验资源方式。

  • 公共资源体验
  • 平台提供临时资源及RAM子账号进行实验操作。
  • 资源归属于平台,仅供本次实验使用。
  • 实验结束后,实验资源及实验记录将被释放。
  • 资源创建过程需要3~5分钟(视资源不同开通时间有所差异,ACK等资源开通时间较长)。完成实验资源的创建后,在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如子用户名称、子用户密码、AK ID、AK Secret、资源中的项目名称等)。
  • 说明:实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。

  • 领取免费试用额度
  • 使用个人账号开通试用,平台仅提供手册参考。
  • 所有实验操作将保留至您的账号,请谨慎操作。
  • 在实验页面下方卡片会展示本实验支持的试用规格,可以选择你要试用的云产品资源进行开通。您在实验过程中,可以随时用右下角icon唤起试用卡片。阿里云支持试用的产品列表、权益及具体规则说明请参考开发者试用中心
  • 说明:试用云产品开通在您的个人账号下,并占用您的试用权益。如试用超出免费试用额度,可能会产生一定费用。

  • 个人账户资源
  • 使用您个人的云资源进行操作,资源归属于个人。
  • 所有实验操作将保留至您的账号,请谨慎操作。
  • 平台仅提供手册参考,不会对资源做任何操作。
  • 说明:使用个人账户资源,在创建资源时,可能会产生一定的费用,请您及时关注相关云产品资源的计费概述。

准备开始实验

在实验开始前,请您选择其中一种实验资源,单击确认开启实验

说明:每个实验所支持的实验资源方式都不相同,实验不一定能满足有三种实验资源方式,请根据实验的实际情况,进行选择。

2. 领取免费试用资源

实验前必看!

  • 本教程会使用到负载均衡SLB,会产生少量费用,具体计费详情,请参见负载均衡SLB费用计算器
  • 如果您的阿里云主账号符合开通容器服务Serverles版ACK Serverless免费试用的资格,建议您开通免费试用容器服务Serverles版ACK Serverless。ACK Serverless试用集群由计算资源弹性容器实例ECI和网络资源负载均衡CLB组成,可以免费试用1个月,ACK Serverless试用集群资源的免费额度请参见ACK Serverless试用集群减免的费用
  • 如果您的阿里云主账号符合开通微服务引擎服务治理MSE免费试用的资格,建议您开通免费试用微服务引擎服务治理MSE。微服务引擎服务治理MSE提供开通后30天,不限量免费使用无损上下线、全链路灰度、限流降级等微服务治理全部产品能力。
  • 如果您的阿里云主账号符合开通微服务引擎云原生网关MSE免费试用的资格,建议您开通免费试用微服务引擎云原生网关MSE。微服务引擎云原生网关MSE提供2核4GB、1节点、1个月时长的网关实例,试用额度不包含SLB费用,试用期结束后将自动转按量付费,若试用后不再使用,请及时删除实例。
  • 如果您的阿里云账号只能领取部分免费试用产品,请您领取符合免费试用资格的产品,然后进入实验,不满足免费试用资格的产品将会使用个人账户资源进行创建,并会产生一定的费用,请您及时关注账户扣费。
  • 为了避免资源浪费并造成账号扣费的情况,请严格按照本文提供的参数进行配置。在实验完成之后,请您及时删除或禁用压测任务。
  1. 在实验开始前,请您选择开通免费试用

  1. 开通容器服务Serverles版ACK Serverless免费试用。

2.1 在实验室页面下方,选择容器服务Serverles版ACK Serverless,单击立即试用

2.2 在容器服务Serverles版ACK Serverless面板,在服务协议右侧,单击已完成服务角色的授权链接,然后单击同意授权,完成ACK Serverless试用集群的授权操作。

2.3 返回容器服务Serverles版ACK Serverless开通面板,选择任一地域,本教程以华东1(杭州)地域为例,其他配置项保持默认。仔细阅读各服务协议,并选中服务协议选框,然后单击立即试用。试用申请成功通过后,系统将会为您自动创建ACK Serverless标准版集群。

2.4 前往容器服务控制台,集群创建大约需要3~5分钟,当集群状态为运行中时,即可正常使用,然后单击集群名称

2.5 在集群资源页签,查看ACK Serverless集群所在的的虚拟专有网络VPC节点虚拟交换机

说明:本实验需要ACK Serverless集群和服务引擎云原生网关MSE在同一VPC下。

  1. 开通微服务引擎服务治理MSE免费试用。

3.1 开通微服务引擎服务治理MSE免费试用前,您需要为MSE创建关联角色AliyunServiceRoleForMSE,开通微服务引擎服务。前往MSE微服务引擎控制台

3.2 在欢迎访问微服务引擎MSE 2.0页面,单击立即授权

说明:开通微服务引擎不收费。

3.3 在确认授权对话框中,单击确认,然后单击下一步

3.4 单击立即体验微服务引擎MSE

3.5 在实验室页面下方,选择微服务引擎服务治理MSE,单击立即试用

3.6 在微服务引擎服务治理MSE面板,勾选服务协议后,单击立即试用

  1. 开通微服务引擎云原生网关MSE免费试用。

4.1 在实验室页面下方,选择服务引擎云原生网关MSE,单击立即试用

4.2 在微服务引擎云原生网关MSE面板,完成参数信息配置。本试用教程以表格中的参数信息为例,未提及参数保持默认值,勾选服务协议后,单击立即试用,并根据页面提示完成试用申请。

参数

示例值

地域

华东1(杭州)

网关名称

自定义网关名称

资源组

默认资源组

专有网络

选择与ACK Serverless集群同一个VPC。

可用区

选择与ACK Serverless集群同一个交换机

公网SLB规格

简约型(slb.s1.small)

4.3 在网关列表页面,等待状态变为运行正常,即可正常使用。

  1. 领取完免费试用后,返回资源领取界面,单击我已开通,进入实验

说明:如果您的阿里云账号只能领取部分免费试用产品,请您领取符合免费试用资格的产品,然后进入实验,不满足免费试用资格的产品将会使用个人账户资源进行创建,并会产生一定的费用,请您及时关注账户扣费。

3. 创建实验资源

  1. 创建容器服务Serverles版ACK Serverless集群。

说明:

  • 如果您选择的免费试用,并且在上一步骤中领取了容器服务Serverles版ACK Serverless的免费试用,后台会自动为您创建容器服务Serverles版ACK Serverless集群,请您跳过本步骤,直接进行下一小节操作。
  • 如果您选择的免费试用,但是您的阿里云主账号没有资格领取容器服务Serverles版ACK Serverless的免费试用,请您根据如下操作,创建容器服务Serverles版ACK Serverless集群,并且会产生一定的费用,详情请参考云产品资源计费
  • 如果您选择的个人资源,请您根据如下操作,创建容器服务Serverles版ACK Serverless集群,并且会产生一定的费用,详情请参考云产品资源计费

1.1 前往容器服务ACK Serverless控制台,在集群列表页面,单击创建集群

1.2 在集群配置页面,根据如下说明配置参数,未提及的参数保持默认,然后单击下一步:组件配置

说明:本试用教程以下列的配置信息为例,实际操作时,建议根据您的实际业务体量和需求选择。

参数说明:

配置项

教程示例

集群类型

ACK Serverless集群

集群规格

标准版

集群名称

test

地域

华东1(杭州)

Kubernetes版本

1.26.3-aliyun.1

专有网络

选择使用已有,单击下方的创建专有网络,创建完成后,返回ACK Serverless创建页面选择创建完成的专有网络。

本教程不需要配置SNAT。

虚拟交换机

单击下方的创建虚拟交换机,创建完成后,返回ACK Serverless创建页面选择创建完成的虚拟交换机。

1.3 在组件配置页面,关取消和Knative的默认勾选,单击下一步:确认配置

1.4 在确认配置页面,选中服务协议,单击创建集群

1.4 在日志页面,单击集群列表

1.5 在集群列表页面,等待大约3~5分钟。状态变为运行中后,表示ACK Serverless集群创建完成,即可正常使用,然后单击集群名称

1.6 在集群资源页签,查看ACK Serverless集群所在的的虚拟专有网络VPC节点虚拟交换机

说明:本实验需要ACK Serverless集群和服务引擎云原生网关MSE在同一VPC下。

  1. 开通微服务引擎服务治理MSE。

说明:

  • 如果您选择的免费试用,并且在上一步骤中领取了微服务引擎服务治理MSE的免费试用,请您跳过本步骤,直接进行下一小节操作。
  • 如果您选择的免费试用,但是您的阿里云主账号没有资格领取微服务引擎服务治理MSE的免费试用,请您根据如下操作,开通微服务引擎服务治理MSE,并且会产生一定的费用,详情请参见计费概述
  • 如果您选择的个人资源,请您根据如下操作,开通微服务引擎服务治理MSE,并且会产生一定的费用,详情请参见计费概述

2.1 登录MSE微服务引擎控制台

说明:如果提示需要创建关联角色AliyunServiceRoleForMSE,请您单击立即授权

2.2 在概览页面右侧服务治理区域,根据页面提示,开通微服务治理。

  1. 创建微服务引擎云原生网关MSE。

说明:

  • 如果您选择的免费试用,并且在上一步骤中领取了微服务引擎云原生网关MSE的免费试用,请您跳过本步骤,直接进行下一小节操作。
  • 如果您选择的免费试用,但是您的阿里云主账号没有资格领取微服务引擎云原生网关MSE的免费试用,请您根据如下操作,创建微服务引擎云原生网关MSE,并且会产生一定的费用,详情请参见计费概述
  • 如果您选择的个人资源,请您根据如下操作,创建微服务引擎云原生网关MSE,并且会产生一定的费用,详情请参见计费概述

3.1 前往MSE网关管理控制台

3.2 在网关列表页面,单击创建网关

3.3 在云原生网关购买页面,完成参数信息配置。本试用教程以表格中的参数信息为例,未提及参数保持默认值,单击立即购买

参数

示例值

付费模式

本教程以按量付费为例

地域

华东1(杭州)

网关名称

自定义网关名称

网关实例规格

2核4G

资源组

默认资源组

专有网络

选择与ACK Serverless集群同一个VPC。

可用区

选择与ACK Serverless集群同一个交换。

公网SLB规格

简约型(slb.s1.small)

日志服务

开启日志服务,费用请参考费用详情

链路追踪

开启链路追踪,费用请参考费用详情

3.4 在确认订单页面,选中服务协议,单击立即开通

3.5 在购买完成页面,单击前往控制台

3.6 在实例列表页面,等待状态变为运行中,即可正常使用。

4. 修改容器服务集群名称

为了避免多用户之间实验资源冲突,需要对属于本帐号的容器服务集群名称进行重命名。

  1. 双击打开远程桌面的Chromium网页浏览器

说明:

如果远程桌面浏览器无法打开,可在本机浏览器上【打开新的无痕浏览器】,复制如下链接登录实验提供的RAM子用户。

https://signin.aliyun.com/login.htm?callback=https%3A%2F%2Fecs.console.aliyun.com%2Fserver%2Fregion%2Fcn-shanghai#/main

  1. 在RAM用户登录框中单击下一步,并复制粘贴页面左上角的子用户密码用户密码输入框,单击登录
  2. 复制下方地址,在Chromium网页浏览器打开新页签,粘贴并访问容器服务控制台。
https://cs.console.aliyun.com/#/k8s/cluster/list
  1. 找到属于本账号的ACK集群,根据左侧云产品资源下方的k8s实例ID找到对应的ACK集群

  1. 修改集群名称为K8s实例ID,保持与集群实例ID值一致

5. 开启MSE微服务治理

本步骤指导您如何安装MSE微服务治理组件。

  1. 在容器服务控制台( https://cs.console.aliyun.com/ )左侧导航栏中,选择市场>应用市场
  2. 应用市场页面单击应用目录页签,然后搜索并单击ack-onepilot组件。
  3. ack-onepilot页面右上方单击一键部署,在创建面板中选择集群命名空间,设置组件发布名称,然后单击下一步

说明:推荐使用默认的命名空间ack-onepilot。

  1. 参数配置向导中确认组件参数信息,然后单击确定。安装完成后,在命名空间ack-onepilot中出现ack-onepilot应用,表示安装成功。

6. ACK Serverless部署微服务

结合如下架构图,依次部署注册中心、应用A、应用B、应用C。

  1. 在集群列表页面,根据集群ID找到具体ACK集群(需记忆下集群名称,后续操作将用到),单击详情

  1. 在左侧导航栏中,选择工作负载>无状态,在无状态页面,单击右上角的使用YAML创建资源部署应用A、应用B、应用C以及注册中心

  1. 创建页面,输入如下注册中心的YAML,单击创建,并等待注册中心启动(一般耗时30s)。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nacos-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nacos-server
  template:
    metadata:
      labels:
        app: nacos-server
    spec:
      containers:
      - env:
        - name: MODE
          value: standalone
        image: registry.cn-shanghai.aliyuncs.com/yizhan/nacos-server:v2.1.2
        imagePullPolicy: Always
        name: nacos-server
        livenessProbe:
          failureThreshold: 3
          initialDelaySeconds: 15
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: 8848
          timeoutSeconds: 3
        readinessProbe:
          failureThreshold: 3
          initialDelaySeconds: 15
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: 8848
          timeoutSeconds: 3
        resources:
          requests:
            cpu: 500m
            memory: 1Gi
      dnsPolicy: ClusterFirst
      restartPolicy: Always
# Nacos Server Service 配置
---
apiVersion: v1
kind: Service
metadata:
  name: nacos-server
spec:
  ports:
  - port: 8848
    protocol: TCP
    targetPort: 8848
  selector:
    app: nacos-server
  type: ClusterIP
  1. 创建页面,输入如下的应用A、应用B、应用C的YAML,单击创建
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-a
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-cloud-a
  template:
    metadata:
      labels:
        msePilotCreateAppName: spring-cloud-a
        msePilotAutoEnable: 'on'
        app: spring-cloud-a
    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: 10
          periodSeconds: 30
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-a-gray
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-cloud-a-gray
  strategy:
  template:
    metadata:
      labels:
        alicloud.service.tag: gray
        msePilotCreateAppName: spring-cloud-a
        msePilotAutoEnable: 'on'
        app: spring-cloud-a-gray
    spec:
      containers:
      - name: spring-cloud-a-new
        image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:1.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 20001
        livenessProbe:
          tcpSocket:
            port: 20001
          initialDelaySeconds: 10
          periodSeconds: 30
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-b
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-cloud-b
  strategy:
  template:
    metadata:
      labels:
        msePilotCreateAppName: spring-cloud-b
        msePilotAutoEnable: 'on'
        app: spring-cloud-b
    spec:
      containers:
      - name: spring-cloud-b
        image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:1.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        livenessProbe:
          tcpSocket:
            port: 20002
          initialDelaySeconds: 10
          periodSeconds: 30
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-c
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-cloud-c
  template:
    metadata:
      labels:
        msePilotCreateAppName: spring-cloud-c
        msePilotAutoEnable: 'on'
        app: spring-cloud-c
    spec:
      containers:
      - name: spring-cloud-c
        image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:1.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        livenessProbe:
          tcpSocket:
            port: 20003
          initialDelaySeconds: 10
          periodSeconds: 30
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-c-gray
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-cloud-c-gray
  template:
    metadata:
      labels:
        alicloud.service.tag: gray
        msePilotCreateAppName: spring-cloud-c
        msePilotAutoEnable: 'on'
        app: spring-cloud-c-gray
    spec:
      containers:
      - name: spring-cloud-c-gray
        image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:1.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        livenessProbe:
          tcpSocket:
            port: 20003
          initialDelaySeconds: 10
          periodSeconds: 30

本步骤部署了应用A、应用B、应用C以及注册中心,可以让内部流量按照业务逻辑进行调用。下一步我们将会配置MSE Ingress网关,引入外部流量。

7. 部署MSE Ingress网关

在容器服务中安装MSE Ingress Controller组件来管理云原生网关,并通过MSE Ingress来暴露集群中的容器服务,这一步我们来安装Controller。

  1. 我们复制以下链接打开浏览器新页面在应用市场开始安装操作。
https://cs.console.aliyun.com/?#/next/app-catalog/ack/incubator/ack-mse-ingress-controller
  1. 在打开的介绍页面,单击一键部署

  1. 创建面板中选择您的集群命名空间,设置组件发布名称,然后单击下一步

  1. 安装完成后,切回到ACK集群详情的无状态页面,将目标集群的命名空间切换到mse-ingress-controller,如果出现ack-mse-ingress-controller应用(命名空间出现可能有延迟,稍等一会尝试刷新),表示安装成功。

至此我们完成了MSE Ingress Controller组件的安装工作,接下来开始部署MSE Ingress网关实例。

  1. 复制以下配置文件MseIngressConfig用于部署MSE Ingress网关实例。
apiVersion: mse.alibabacloud.com/v1alpha1
kind: MseIngressConfig
metadata:
   name: test
spec:
   name: mse-ingress
   common:
      pay:
         payType: POSTPAY
      instance:
         spec: 2c4g
         replicas: 1
      network:
         publicSLBSpec: slb.s1.small
      securityGroupType: normal
   global:
     deleteSLB: true
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: mse
spec:
  controller: mse.alibabacloud.com/ingress
  parameters:
    apiGroup: mse.alibabacloud.com
    kind: MseIngressConfig
    name: test
  1. 切换到工作负载-自定义资源页面单击使用YAML创建资源,在打开的页面粘贴上面复制的内容,单击创建

  1. 创建完成后,按下图切换到资源对象浏览器,再API组中找到mse.alibabacloud.com下的MseIngressConfig资源,左侧列表操作栏单击YAML编辑确认当状态显示为Listening时(这个过程较慢,可能需要3到5分钟,可以尝试过几分钟查看),表示云原生网关创建成功并且处于运行状态。并自动监听集群中IngressClass为mse的Ingress资源。

到这里,我们的MSE Ingress网关实例已经成功创建,并自动监听集群中IngressClass为mse的Ingress资源

8. 配置MSE Ingress规则

  1. 针对入口应用A,配置两个K8s Service,复制以下配置,点击网络 > 服务 > 使用YAML创建资源
apiVersion: v1
kind: Service
metadata:
  name: spring-cloud-a-base
  namespace: default
spec:
  ports:
    - name: http
      port: 20001
      protocol: TCP
      targetPort: 20001
  selector:
    app: spring-cloud-a
---
apiVersion: v1
kind: Service
metadata:
  name: spring-cloud-a-gray
  namespace: default
spec:
  ports:
    - name: http
      port: 20001
      protocol: TCP
      targetPort: 20001
  selector:
    app: spring-cloud-a-gray
  1. 点击网络 > 路由 > 使用YAML创建资源,通过以下Ingress规则对外暴露应用A的正式版本spring-cloud-a-base。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: spring-cloud-a
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: spring-cloud-a-base
                port:
                  number: 20001
            path: /
            pathType: Prefix
  1. 假设这里基于URL的请求参数策略来区分线上正式流量和灰度流量,希望带有URL的请求参数为x-user-id: 100的请求流量,路由到灰度环境中,此时流量会优先访问链路中各个应用对应的灰度版本,若无灰度版本,则会容灾到基线版本。通过以下Ingress规则对外暴露应用A的灰度版本spring-cloud-a-gray。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: 'true'
    mse.ingress.kubernetes.io/canary-by-query: x-user-id
    mse.ingress.kubernetes.io/canary-by-query-value: '100'
    mse.ingress.kubernetes.io/request-header-control-update: x-mse-tag gray
  name: spring-cloud-a-gray
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: spring-cloud-a-gray
                port:
                  number: 20001
            path: /
            pathType: Prefix

9. 验证全链路灰度

  1. 查看您的MSE Ingress网关的IP地址,在集群>网络>路由,查看Ingress的端点信息。

  1. 验证正式环境的流量,在您的浏览器输入以下URL
http://{您的MSE Ingress网关IP地址}/a

返回内容如下,可以看到,应用A、B、C都访问到了基线版本。

A[10.1.0.29] -> B[10.1.0.28] -> C[10.1.0.27]
  1. 验证灰度环境的流量,在您的浏览器输入以下URL
http://{您的MSE Ingress网关IP地址}/a?x-user-id=100

返回的内容如下,可以看到,应用A、C访问到了灰度版本,应用B没有灰度版本,所以fallback到了基线版本。

Agray[10.1.0.13] -> B[10.1.0.11] -> Cgray[10.1.0.22]

10. 安装CoreDNS和MSE微服务治理ack-onepilot

  1. 前往容器服务控制台
  2. 集群列表页面,选择您的ACK Serverless集群,单击详情

  1. 在左侧导航栏,选择运维管理 > 组件管理
  2. 组件管理页面,单击网络页签,找到CoreDNS,然后单击卡片右下角的安装

  1. 安装组件 CoreDNS面板中,设置如下内存CPU配置项,其他配置项保持默认值,然后单击确定
  • MemoryRequest 内存需求:512M。
  • CpuRequest CPU需求:500m。

  1. 组件管理页面,单击网络页签,找到ack-onepilot,然后单击卡片右下角的安装

  1. 在安装组件 ack-onepilot面板中,配置项保持默认值,单击确定

11. 在容器集群中部署微服务

结合如下架构图,依次部署注册中心,应用A、应用B、应用C的正式版本,以及应用A、应用C的灰度版本。

  1. 在容器服务控制台的集群列表页面,选择您的ACK Serverless集群,单击详情

  1. 在左侧导航栏中,选择工作负载>无状态

  1. 无状态页面,单击右上角的使用YAML创建资源部署应用A、应用B、应用C以及注册中心。

  1. 创建页面,输入如下注册中心的YAML,单击创建,并等待注册中心启动(一般耗时30s)。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nacos-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nacos-server
  template:
    metadata:
      labels:
        app: nacos-server
    spec:
      containers:
      - env:
        - name: MODE
          value: standalone
        image: registry-vpc.cn-hangzhou.aliyuncs.com/mse/nacos-server:v2.1.2
        imagePullPolicy: Always
        name: nacos-server
        livenessProbe:
          failureThreshold: 3
          initialDelaySeconds: 15
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: 8848
          timeoutSeconds: 3
        readinessProbe:
          failureThreshold: 3
          initialDelaySeconds: 15
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: 8848
          timeoutSeconds: 3
        resources:
          requests:
            cpu: 1
            memory: 2Gi
      dnsPolicy: ClusterFirst
      restartPolicy: Always
# Nacos Server Service 配置
---
apiVersion: v1
kind: Service
metadata:
  name: nacos-server
spec:
  ports:
  - port: 8848
    protocol: TCP
    targetPort: 8848
  selector:
    app: nacos-server
  type: ClusterIP
  1. 创建页面,输入如下:应用A、应用B、应用C的正式版本YAML,应用A、应用C的灰度版本YAML,单击创建。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-a
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-cloud-a
  template:
    metadata:
      labels:
        msePilotCreateAppName: spring-cloud-a
        msePilotAutoEnable: 'on'
        app: spring-cloud-a
    spec:
      containers:
      - name: spring-cloud-a
        image: registry-vpc.cn-hangzhou.aliyuncs.com/mse/spring-cloud-a:1.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 20001
        livenessProbe:
          failureThreshold: 3
          initialDelaySeconds: 15
          periodSeconds: 30
          successThreshold: 1
          tcpSocket:
            port: 20001
          timeoutSeconds: 3
        resources:
          requests:
            cpu: 1
            memory: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-a-gray
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-cloud-a-gray
  strategy:
  template:
    metadata:
      labels:
        alicloud.service.tag: gray
        msePilotCreateAppName: spring-cloud-a
        msePilotAutoEnable: 'on'
        app: spring-cloud-a-gray
    spec:
      containers:
      - name: spring-cloud-a-new
        image: registry-vpc.cn-hangzhou.aliyuncs.com/mse/spring-cloud-a:1.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 20001
        livenessProbe:
          failureThreshold: 3
          initialDelaySeconds: 15
          periodSeconds: 30
          successThreshold: 1
          tcpSocket:
            port: 20001
          timeoutSeconds: 3
        resources:
          requests:
            cpu: 1
            memory: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-b
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-cloud-b
  strategy:
  template:
    metadata:
      labels:
        msePilotCreateAppName: spring-cloud-b
        msePilotAutoEnable: 'on'
        app: spring-cloud-b
    spec:
      containers:
      - name: spring-cloud-b
        image: registry-vpc.cn-hangzhou.aliyuncs.com/mse/spring-cloud-b:1.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 20002
        livenessProbe:
          failureThreshold: 3
          initialDelaySeconds: 15
          periodSeconds: 30
          successThreshold: 1
          tcpSocket:
            port: 20002
          timeoutSeconds: 3
        resources:
          requests:
            cpu: 1
            memory: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-c
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-cloud-c
  template:
    metadata:
      labels:
        msePilotCreateAppName: spring-cloud-c
        msePilotAutoEnable: 'on'
        app: spring-cloud-c
    spec:
      containers:
      - name: spring-cloud-c
        image: registry-vpc.cn-hangzhou.aliyuncs.com/mse/spring-cloud-c:1.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 20003
        livenessProbe:
          failureThreshold: 3
          initialDelaySeconds: 15
          periodSeconds: 30
          successThreshold: 1
          tcpSocket:
            port: 20003
          timeoutSeconds: 3
        resources:
          requests:
            cpu: 1
            memory: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-c-gray
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-cloud-c-gray
  template:
    metadata:
      labels:
        alicloud.service.tag: gray
        msePilotCreateAppName: spring-cloud-c
        msePilotAutoEnable: 'on'
        app: spring-cloud-c-gray
    spec:
      containers:
      - name: spring-cloud-c-gray
        image: registry-vpc.cn-hangzhou.aliyuncs.com/mse/spring-cloud-c:1.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 20003
        livenessProbe:
          failureThreshold: 3
          initialDelaySeconds: 15
          periodSeconds: 30
          successThreshold: 1
          tcpSocket:
            port: 20003
          timeoutSeconds: 3
        resources:
          requests:
            cpu: 1
            memory: 2Gi

本步骤部署了应用A、应用B、应用C以及注册中心,可以让内部流量按照业务逻辑进行调用。下一步我们将会配置MSE Ingress网关,引入外部流量。

12. MSE Ingress网关关联容器集群并监听Ingress

  1. 前往MSE云原生网关控制台
  2. 在网关列表页面,找到您的网关实例,单击实例ID

  1. 基本概览页面,单击安全组授权

说明:进行安全组授权,即授权MSE Ingress网关的安全组能够访问容器集群的安全组。

  1. 基本概览页面的安全组授权页签,单击立即创建

  1. 授权安全组面板,选择ACK Serverless集群所在的安全组端口范围输入1/65535,单击确定

  1. 在左侧导航栏中,选择服务管理->来源管理

  1. 来源管理页面,单击创建来源

  1. 创建来源面板,来源类型选择容器服务ACK/ACK Serverless集群选择您的ACK Serverless集群,并开启监听K8s Ingress,其中Ingress Class设置为mse,然后单击确定

到这里,我们的MSE Ingress网关实例已经成功关联ACK Serverless集群,并自动监听集群中IngressClass为mse的Ingress资源。

13. 配置MSE Ingress规则

  1. 返回到容器服务控制台的集群列表页面,选择您的ACK Serverless集群,单击详情

  1. 针对入口应用A的正式版本和灰度版本,分别配置对应的K8s Service,复制以下配置,选择网络 > 服务 > 使用YAML创建资源
apiVersion: v1
kind: Service
metadata:
  name: spring-cloud-a-base
  namespace: default
spec:
  ports:
    - name: http
      port: 20001
      protocol: TCP
      targetPort: 20001
  selector:
    app: spring-cloud-a
---
apiVersion: v1
kind: Service
metadata:
  name: spring-cloud-a-gray
  namespace: default
spec:
  ports:
    - name: http
      port: 20001
      protocol: TCP
      targetPort: 20001
  selector:
    app: spring-cloud-a-gray
  1. 选择网络 > 路由 > 使用YAML创建资源,通过以下Ingress规则对外暴露应用A的正式版本spring-cloud-a-base。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: spring-cloud-a
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: spring-cloud-a-base
                port:
                  number: 20001
            path: /
            pathType: Prefix
  1. 假设这里基于URL的请求参数策略来区分线上正式流量和灰度流量,希望带有URL的请求参数为x-user-id: 100的请求流量,路由到灰度环境中,此时流量会优先访问链路中各个应用对应的灰度版本,若无灰度版本,则会容灾到基线版本。选择网络 > 路由 > 使用YAML创建资源,通过以下Ingress规则对外暴露应用A的灰度版本spring-cloud-a-gray。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: 'true'
    mse.ingress.kubernetes.io/canary-by-query: x-user-id
    mse.ingress.kubernetes.io/canary-by-query-value: '100'
    mse.ingress.kubernetes.io/request-header-control-update: x-mse-tag gray
  name: spring-cloud-a-gray
  namespace: default
spec:
  ingressClassName: mse
  rules:
    - http:
        paths:
          - backend:
              service:
                name: spring-cloud-a-gray
                port:
                  number: 20001
            path: /
            pathType: Prefix

14. 验证全链路灰度

  1. 查看您的MSE Ingress网关的IP地址,在集群>网络>路由,查看Ingress的端点信息。

  1. 验证正式环境的流量,在您的浏览器输入以下URL
http://{您的MSE Ingress网关IP地址}/a

返回类似如下内容,您可以看到,应用A、B、C都访问到了基线版本。

A[172.16.1.196] -> B[172.16.1.194] -> C[172.16.1.197]

  1. 验证灰度环境的流量,在您的浏览器输入以下URL
http://{您的MSE Ingress网关IP地址}/a?x-user-id=100

返回的内容如下,可以看到,应用A、C访问到了灰度版本,应用B没有灰度版本,所以fallback到了基线版本。

Agray[172.16.1.193] -> B[172.16.1.194] -> Cgray[172.16.1.195]

15. 释放资源

实验完成后,建议及时删除资源,避免额外资损。

ACK Serverless集群

  • 删除已创建的应用和服务
  • 容器服务管理控制台集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态,找到已创建的应用,在页面右侧操作列,选择更多 > 删除
  • 确认面板中,选中移除关联的服务(Service),然后单击确定
  • 删除集群

ACK Serverless集群目前处于公测中,可免费试用。但是在使用ACK Serverless集群过程中用到的其他阿里云云产品资源,您需要按照各云产品规定的计费规则,为您使用的资源付费,费用由各云产品收取。完成教程后,请参考以下场景处理集群:

  • 如果无需继续使用集群,请登录容器服务管理控制台,在集群列表页面的操作列,单击目标集群对应的更多>删除。在删除集群页面,选中同时删除集群下的ALB资源、同时删除集群下的PrivateZone资源我已知晓以上信息并确认删除集群,然后单击确定。关于删除ACK Serverless集群的更多信息,请参见删除集群
  • 如果需要继续使用集群,请至少在试用期到期1小时前为阿里云账号充值,确保账户金额不小于100.00元人民币。在使用ACK Serverless Pro版集群过程中用到的其他阿里云云产品资源,相关计费说明,请参见云产品资源计费

微服务引擎云原生网关MSE

  • 如果无需继续使用微服务引擎云原生网关MSE,请前往MSE网关管理控制台,找到目标网关,选择右侧操作列中的图标>释放实例。在释放对话框中,选中是否同时删除网关创建时代购的SLB实例,单击确定
  • 如果仍需要继续使用微服务引擎云原生网关MSE,请随时关注账户扣费情况。

实验地址 :https://developer.aliyun.com/adc/scenario/28da193e442b42f39803a287126475f5

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
3月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
3月前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
5月前
|
Kubernetes 测试技术 数据库
详解微服务应用灰度发布最佳实践
相对于传统软件研发,微服务架构下典型的需求交付最大的区别在于有了能够小范围真实验证的机制,且交付单位较小,风险可控,灰度发布可以弥补线下测试的不足。本文从 DevOps 视角概述灰度发布实践,介绍如何将灰度发布与 DevOps 工作融合,快来了解吧~
31197 19
|
7月前
|
弹性计算 监控 Cloud Native
云原生最佳实践系列 4:基于 MSE 和 SAE 的微服务部署与压测
通过MSE(微服务引擎)、SAE(Serverless应用引擎)、ARMS(应用监控服务)、PTS(性能测试服务)等产品,实现微服务的无服务化部署、监控和弹性伸缩。
674 17
|
7月前
|
负载均衡 Java 测试技术
面试官:说说微服务灰度发布的底层实现?
面试官:说说微服务灰度发布的底层实现?
147 1
面试官:说说微服务灰度发布的底层实现?
|
7月前
|
Cloud Native 测试技术 Nacos
云效 AppStack + 阿里云 MSE 实现应用服务全链路灰度
本文介绍了如何通过阿里云 MSE 微服务引擎和云效应用交付平台 AppStack 实现灰度发布。
91200 4
|
7月前
|
Cloud Native 测试技术 Nacos
云效AppStack+阿里云MSE实现应用服务全链路灰度
在应用开发测试验证通过后、进行生产发布前,为了降低新版本发布带来的风险,期望能够先部署到灰度环境,用小部分业务流量进行全链路灰度验证,验证通过后再全量发布生产。本文主要介绍如何通过阿里云MSE 微服务引擎和云效应用交付平台AppStack 实现灰度发布。
121597 3
|
7月前
|
微服务
三个微服务注册中心eureka、consul、zookeeper之间的异同点以及CAP理论图
三个微服务注册中心eureka、consul、zookeeper之间的异同点以及CAP理论图
345 0
|
7月前
|
Java Go 数据库
OpenSergo/MSE & CloudWeGo 共同保障微服务运行时流量稳定性
微服务运行时稳定性的问题微服务的稳定性一直是开发者非常关注的话题。随着业务从单体架构向分布式架构演进以及部署方式的变化,服务之间的依赖关系变得越来越复杂,业务系统也面临着巨大的高可用挑战。大家可能都经历过以下的场景:演唱会抢票瞬间洪峰流量导致系统超出最大负载,load 飙高,用户无法正常下单;在线选...
166 0
OpenSergo/MSE & CloudWeGo 共同保障微服务运行时流量稳定性
|
7月前
|
移动开发 Kubernetes 测试技术
MSE服务治理最佳实践:基于Ingress-nginx网关实现全链路灰度
微服务架构下,有一些需求开发涉及到微服务调用链路上的多个微服务同时改动。通常每个微服务都会有灰度环境或分组来接受灰度流量。我们希望进入上游灰度环境的流量也能进入下游灰度的环境中,确保1个请求始终在灰度环境中传递。即使这个调用链路上有一些微服务应用不存在灰度环境,那么这些微服务应用在请求下游应用的时候依然能够回到下游应用的灰度环境中。我们通过 MSE 提供的全链路灰度能力,可以在不需要修改任何业务代码的情况下,轻松实现上述所说的全链路灰度能力。
MSE服务治理最佳实践:基于Ingress-nginx网关实现全链路灰度

相关产品

  • 微服务引擎