[10.14 workshop] 微服务治理全链路金丝雀发布

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 当新版本发布的时候,我们希望能够控制一部分用户来使用新的版本,待验证通过后再发布给所有的用户进行使用。其中部分用户使用新版本的过程我们叫做“金丝雀发布”。在微服务体系中如果一次只有部分应用发布,需要保证有且仅有目标用户访问新版本。下面我们介绍基于MSE的全链路金丝雀发布。

当新版本发布的时候,我们希望能够控制一部分用户来使用新的版本,待验证通过后再发布给所有的用户进行使用。其中部分用户使用新版本的过程我们叫做“金丝雀发布”。
在微服务体系中如果一次只有部分应用发布,需要保证有且仅有目标用户访问新版本。下面我们介绍基于MSE的全链路金丝雀发布。

前提条件

  1. 创建 ACK 集群,请参见创建Kubernetes托管版集群

操作步骤

步骤一: 接入 MSE 微服务治理

  1. 安装 mse-ack-pilot

    1. 登录容器服务控制台
    2. 在左侧导航栏单击市场 > 应用目录
    3. 在应用目录页面点击阿里云应用,选择微服务,并单击 ack-mse-pilot
    4. 在ack-mse-pilot页面右侧集群列表中选择集群,然后单击创建。

1.png

安装MSE微服务治理组件大约需要2分钟,请耐心等待。
创建成功后,会自动跳转到目标集群的Helm页面,检查安装结果。如果出现以下页面,展示相关资源,则说明安装成功。

2.png

  1. 为ACK命名空间中的应用开启MSE微服务治理

    1. 登录MSE治理中心控制台,如果您尚未开通 MSE 微服务治理,请根据提示开通。
    2. 在左侧导航栏选择微服务治理中心 > K8s集群列表
    3. 在K8s集群列表页面搜索框列表中选择集群名称或集群ID,然后输入相应的关键字,单击搜索图标。
    4. 单击目标集群操作列的管理
    5. 在集群详情页面命名空间列表区域,单击目标命名空间操作列下的开启微服务治理
    6. 在开启微服务治理对话框中单击确认。
      3.png

步骤二:还原线上场景

首先,我们将分别部署 spring-cloud-zuul、spring-cloud-a、spring-cloud-b、spring-cloud-c 这四个业务应用,以及注册中心 Nacos Server,模拟出一个真实的调用链路。

Demo 应用的结构图下图,应用之间的调用,既包含了 Spring Cloud 的调用,也包含了 Dubbo 的调用,覆盖了当前市面上最常用的两种微服务框架。这些应用都是最简单的 Spring Cloud 和 Dubbo 的标准用法,您也可以直接在 https://github.com/aliyun/alibabacloud-microservice-demo/tree/master/mse-simple-demo 项目上查看源码。

4.png

您可以使用 kubectl 或者直接使用 ACK 控制台来部署应用。部署所使用的 yaml 文件如下,您同样可以直接在 https://github.com/aliyun/alibabacloud-microservice-demo/tree/master/mse-simple-demo 上获取对应的源码。

部署 Nacos Server
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nacos-server
spec:
  selector:
    matchLabels:
      app: nacos-server
  template:
    metadata:
      annotations:
      labels:
        app: nacos-server
    spec:
      containers:
        - env:
            - name: MODE
              value: "standalone"
          image: registry-vpc.cn-shanghai.aliyuncs.com/yizhan/nacos-server:latest
          imagePullPolicy: IfNotPresent
          name: nacos-server
          ports:
            - containerPort: 8848

---
apiVersion: v1
kind: Service
metadata:
  name: nacos-server
spec:
  type: ClusterIP
  selector:
    app: nacos-server
  ports:
    - name: http
      port: 8848
      targetPort: 8848
部署业务应用
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-zuul
spec:
  selector:
    matchLabels:
      app: spring-cloud-zuul
  template:
    metadata:
      annotations:
        msePilotCreateAppName: spring-cloud-zuul
      labels:
        app: spring-cloud-zuul
    spec:
      containers:
        - env:
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
          image: registry-vpc.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-zuul:1.0.0
          imagePullPolicy: Always
          name: spring-cloud-zuul
          ports:
            - containerPort: 20000

---
apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.small
    service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet
  name: zuul-slb
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 20000
  selector:
    app: spring-cloud-zuul
  type: LoadBalancer
status:
  loadBalancer: {}

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-a
spec:
  selector:
    matchLabels:
      app: spring-cloud-a
  template:
    metadata:
      annotations:
        msePilotCreateAppName: spring-cloud-a
      labels:
        app: spring-cloud-a
    spec:
      containers:
        - env:
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
          image: registry-vpc.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:1.0.0
          imagePullPolicy: Always
          name: spring-cloud-a
          ports:
            - containerPort: 20001
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-b
spec:
  selector:
    matchLabels:
      app: spring-cloud-b
  template:
    metadata:
      annotations:
        msePilotCreateAppName: spring-cloud-b
      labels:
        app: spring-cloud-b
    spec:
      containers:
        - env:
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
          image: registry-vpc.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:1.0.0
          imagePullPolicy: Always
          name: spring-cloud-b
          ports:
            - containerPort: 20002
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-c
spec:
  selector:
    matchLabels:
      app: spring-cloud-c
  template:
    metadata:
      annotations:
        msePilotCreateAppName: spring-cloud-c
      labels:
        app: spring-cloud-c
    spec:
      containers:
        - env:
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
          image: registry-vpc.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:1.0.0
          imagePullPolicy: Always
          name: spring-cloud-c
          ports:
            - containerPort: 20003

安装成功后,示例如下:

~ kubectl get svc,deploy
NAME                   TYPE           CLUSTER-IP        EXTERNAL-IP     PORT(S)        AGE
service/kubernetes     ClusterIP      192.168.0.1       <none>          443/TCP        4h40m
service/nacos-server   ClusterIP      192.168.152.138   <none>          8848/TCP       99m
service/zuul-slb       LoadBalancer   192.168.75.144    47.100.193.91   80:30767/TCP   25m

NAME                                READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nacos-server        1/1     1            1           99m
deployment.apps/spring-cloud-a      1/1     1            1           26m
deployment.apps/spring-cloud-b      1/1     1            1           25m
deployment.apps/spring-cloud-c      1/1     1            1           25m
deployment.apps/spring-cloud-zuul   1/1     1            1           25m

步骤三:部署新版本的 spring-cloud-a 应用

  1. 现在我们部署一个新版本的 spring-cloud-a 应用,对应的 yaml 文件如下
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-a-gray
spec:
  selector:
    matchLabels:
      app: spring-cloud-a-gray
  template:
    metadata:
      annotations:
        alicloud.service.tag: gray
        msePilotCreateAppName: spring-cloud-a
      labels:
        app: spring-cloud-a-gray
    spec:
      containers:
        - env:
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
          image: registry-vpc.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:1.0.0
          imagePullPolicy: Always
          name: spring-cloud-a-gray
          ports:
            - containerPort: 20001
  1. 部署完成之后,登录MSE治理中心控制台,选择应用列表
  2. 单击应用 spring-cloud-a 应用详情 菜单,此时可以看到,所有的流量请求都是去往 spring-cloud-a 应用未打标的版本,即稳定版本。

5.png

步骤四:配置应用 spring-cloud-a 的灰度规则并验证

  1. 点击页面下方的 标签路由 中的 添加 按钮,为 spring-cloud-a 应用的 gray 版本设置灰度规则。

6.png

参数 描述
框架类型 即springcloud还是dubbo
服务方法 具体的接口类和方法名
条件模式 下面条件列表里多个条件间是“与”还是“或”的关系
条件列表 具体的条件,该例子中为参数 name 等于 xiaoming 字符串
是否链路传递 是否把当前应用里识别出的灰度流量的标签传递下去,本例中选择继续传递下去完成全链路的金丝雀能力的验证

更多信息请参见标签路由

  1. 验证规则生效:访问 zuul-slb 对应的 ip 和 port,并在 Demo 的地址栏中输入 /A/a?name=xiaoming 并点击 开始调用

7.png

8.png

步骤五:部署新版本 的 spring-cloud-b ,验证全链路金丝雀发布

  1. 现在我们部署一个新版本的 spring-cloud-b 应用,对应的 yaml 文件如下
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-b-gray
spec:
  selector:
    matchLabels:
      app: spring-cloud-b-gray
  template:
    metadata:
      annotations:
        alicloud.service.tag: gray
        msePilotCreateAppName: spring-cloud-b
      labels:
        app: spring-cloud-b-gray
    spec:
      containers:
        - env:
            - name: JAVA_HOME
              value: /usr/lib/jvm/java-1.8-openjdk/jre
          image: registry-vpc.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:1.0.0
          imagePullPolicy: Always
          name: spring-cloud-b-gray
          ports:
            - containerPort: 20002
  1. 单击应用 spring-cloud-b 应用详情 菜单,此时可以看到,所有的流量请求都是去往 spring-cloud-b 的未打标版本,即稳定版本。

9.png

  1. 为了让 name=xiaoming 的灰度流量能在全链路里进行透传,且无需重复地配置规则,需在修改一下之前配置的应用 A 的灰度规则,打开链路透传的开关。

10.png

  1. 观察发现,全链路金丝雀发布已经生效。

11.png

12.png

步骤六:验证通过后,完成发布

  1. 新版本的镜像验证通过之后,将 spring-cloud-a 和 spring-cloud-b 这两个 deployment 的镜像版本更新成最新的镜像版本。
  2. 将 spring-cloud-a-gray 和 spring-cloud-b-gray 这两个 deployment 的副本数量改成 0 ,灰度规则可以保留下来,这样就不用反复地配置规则。因为当找不到对应的 tag 节点时,兜底的逻辑会请求到未打标的版本,即稳定版本。

操作总结

  1. 整个过程是不需要修改任何代码和配置的。
  2. 只需要在入口应用设置规则,该流量的标签是可以“传递”下去。
  3. 在每个应用的调用过程中,符合金丝雀条件的流量会优先调用对应的“金丝雀”版本,如果没有“金丝雀”版本则会自动切换回“生产”版本。
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
监控 Kubernetes Cloud Native
云原生架构下的微服务治理之道
【7月更文挑战第30天】在数字化转型的浪潮中,企业级应用正迅速向云原生架构迁移。本文将深入探讨云原生环境下微服务治理的最佳实践,包括服务发现、配置管理、流量控制等关键策略,并结合实例分析如何在保障系统弹性、可维护性的同时,优化资源利用效率和加快业务创新速度。
38 2
|
2月前
|
运维 Kubernetes Cloud Native
云原生架构下的微服务治理之道
【7月更文挑战第20天】在数字化转型的浪潮中,企业纷纷拥抱云原生,以期实现更高效的资源利用、更快的业务迭代和更强的系统稳定性。本文将深入探讨如何通过云原生架构优化微服务的治理,确保系统的高可用性和可维护性,同时提升开发效率和运维灵活性。我们将从微服务治理的核心原则出发,结合具体案例,分析在云环境中实施微服务治理的策略与挑战。
39 2
|
2月前
|
监控 Cloud Native 安全
云原生架构下的微服务治理实践
在数字化转型的浪潮中,云原生技术以其灵活性和可扩展性成为现代软件工程的基石。本文将深入探讨云原生架构下微服务治理的实践路径,从微服务的拆分、容器化部署、服务网格的应用到最终的监控与故障排除,提供一套全面的方法论。文章旨在为读者呈现一个清晰的云原生环境下,如何高效管理和维护微服务系统的全景图。
44 2
|
2月前
|
负载均衡 Cloud Native 云计算
云原生架构下的微服务治理与挑战
随着云计算技术的不断演进,云原生架构已成为现代应用开发的首选模式。本文将深入探讨在云原生环境下,微服务治理的重要性、实现方法及所面临的挑战。通过分析微服务治理的关键要素如服务发现、配置管理、负载均衡和故障转移等,揭示如何在高度动态的云环境中保持服务的高可用性和灵活性。同时,本文也将指出在实施微服务治理过程中可能遇到的技术难题和应对策略,为构建健壮的云原生应用提供指导。
|
2月前
|
监控 负载均衡 Java
Spring Boot与微服务治理框架的集成
Spring Boot与微服务治理框架的集成
|
2月前
|
负载均衡 Java Nacos
Spring Boot与微服务治理框架的集成策略
Spring Boot与微服务治理框架的集成策略
|
3月前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【6月更文挑战第30天】Spring Cloud是Java微服务治理明星框架,整合Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(断路器)、Zuul(API网关)和Config Server(配置中心),提供完整服务治理解决方案。通过Eureka实现服务注册与发现,Ribbon进行负载均衡,Hystrix确保服务容错,Config Server集中管理配置,Zuul则作为API入口统一处理请求。理解和使用Spring Cloud是现代Java开发者的关键技能。
118 2
|
3月前
|
Kubernetes 监控 Cloud Native
云原生架构下的微服务治理实践
【6月更文挑战第23天】在云计算的浪潮中,云原生架构以其弹性、可扩展性和高效性成为企业数字化转型的重要推手。本文将深入探讨如何利用云原生技术实现微服务的治理与优化,确保系统的稳定性和高可用性。我们将从微服务的基本概念出发,通过具体案例分析,揭示云原生环境下微服务治理的关键策略,并分享实践经验,旨在为读者提供一套完整的微服务治理解决方案。
|
3月前
|
运维 负载均衡 Cloud Native
云原生架构下的微服务治理实践
【6月更文挑战第24天】在云原生的浪潮下,微服务治理成为确保系统弹性、可维护性和可观测性的关键。本文通过深入分析微服务治理的核心要素与挑战,结合前沿技术和工具,提出一套实用的微服务治理策略,旨在帮助开发者和架构师构建更加稳定、高效且易于管理的分布式系统。
|
2月前
|
存储 Kubernetes Cloud Native
云原生架构下的微服务治理之道
【7月更文挑战第15天】本文将深入探讨在云原生架构下,如何高效地进行微服务的治理。我们将从微服务治理的基本原则出发,详细分析服务发现、配置管理、容错设计等关键实践,并结合具体案例,展示如何在云平台上构建和管理健壮、可扩展的微服务系统。文章旨在为开发者和架构师提供一套实用的方法论,以应对快速变化的市场需求和技术挑战。
30 0