基于云原生网关实现微服务的多版本线上灰度

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 一起体验云原生网关开箱即用的微服务多样灰度能力,支持容器服务、Nacos、ZooKeeper、Edas等多种服务发现方式。

基于云原生网关实现微服务的多版本线上灰度


1. 创建资源

1、在体验实验室页面左侧,单击创建资源,创建所需资源(本场景默认会提供一个云原生网关集群和一个ACK集群)。

2、在页面左侧导航栏中,单击云产品资源列表,查看本次实验资源相关信息。

说明 :

资源创建过程需要10分钟左右(需要创建一个K8s集群,感谢您的耐心等待~)。完成实验资源的创建后,您可以在云产品资源列表查看已创建的资源信息,例如:K8s集群ID、网关ID、IP地址、用户名和密码等。

2. ACK部署微服务

本实验中通过浏览器发起测试请求,请求访问到云原生网关的入口地址,云原生网关会根据你配置的路由策略再将请求转发到Kubernates集群上部署Demo服务的Pod,所以现在需要ACK(托管版的Kubernates集群)部署我们的Demo服务。

1. 双击打开虚拟桌面的Firefox ESR浏览器,在RAM用户登录框中单击下一步,复制云产品资源列表中子用户密码,按CTRL+V把密码粘贴到密码输区,登录子账户(后续在远程桌面里的粘贴操作均使用CTRL + V快捷键)。

2. 复制容器服务控制台地址,在FireFox浏览器打开新页签,粘贴并访问容器服务控制台。

https://cs.console.aliyun.com/#/k8s/cluster/list

3. 在集群列表页面,根据集群ID找到具体ACK集群,单击详情。

4. 进入详情页面,在集群信息页选择点击集群资源,找到安全组信息。

5. 点开安全组右侧ID连接,在打开的安全组规则页,点击手动添加填写如下优先级1、协议类型全部、端口范围-1/-1、授权对象0.0.0.0/0保存。这里是设置安全组规则允许网关访问(因为演示直接设置了0.0.0.0/0)。

6. 切回容器服务的详情页面,在左侧栏展开工作负载,选择点击无状态Tab。

7. 复制以下yaml内容(v1版本的Demo),再点击当前页面点击使用YAML创建资源,清空模版将内容粘贴进去,点击创建

apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-v1
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: go-httpbin
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: go-httpbin
        version: v1
    spec:
      containers:
        - args:
            - '--version=v1'
          image: 'registry.cn-hangzhou.aliyuncs.com/mse-ingress/httpbin:v1'
          imagePullPolicy: Always
          name: go-httpbin

8. 确认创建成功后,再次点击无状态,即可查看到已经部署的版本v1的Demo服务(pod带有version=v1标签)。

9. 同样操作我们再复制以下yaml内容部署v2版本的Demo(pod带有version=v2标签)。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-httpbin-v2
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: go-httpbin
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: go-httpbin
        version: v2
    spec:
      containers:
        - args:
            - '--version=v2'
          image: 'registry.cn-hangzhou.aliyuncs.com/mse-ingress/httpbin:v1'
          imagePullPolicy: Always
          name: go-httpbin

10. 完成无状态资源的创建后,在左侧栏展开网络,选择点击服务,接下来我们需要创建3个服务资源。

11. 服务资源的创建类似无状态资源,我们依次复制三个yaml内容,点击使用YAML创建资源完成创建。

包含v1和v2两个版本Demo的服务go-httpbin-all:

apiVersion: v1
kind: Service
metadata:
  name: go-httpbin-all
spec:
  ports:
    - port: 80
      targetPort: 8080
      protocol: TCP
  selector:
    app: go-httpbin

只包含v1版本Demo的服务go-httpbin-v1:

apiVersion: v1
kind: Service
metadata:
  name: go-httpbin-v1
spec:
  ports:
    - port: 80
      targetPort: 8080
      protocol: TCP
  selector:
    app: go-httpbin
    version: v1

只包含v2版本Demo的服务go-httpbin-v2:

apiVersion: v1
kind: Service
metadata:
  name: go-httpbin-v2
spec:
  ports:
    - port: 80
      targetPort: 8080
      protocol: TCP
  selector:
    app: go-httpbin
    version: v2

至此,我们完成了所有需要的Demo无状态和服务资源的创建工作,本次主题使用Kubernates容器服务作为我们微服务的服务发现来源,云原生网关其实还支持Nacos注册中心等多种服务发现方式,此处时间有限暂不展开。

3. 网关订阅微服务

1. 在FireFox浏览器打开新页签,复制云原生网关控制台地址,粘贴并访问云原生网关控制台。

https://mse.console.aliyun.com/#/microgw

2. 在网关列表页,根据ID找到具体网关集群,单击管理

3. 进入详情页,左侧栏展开服务管理,选择点击来源管理

4. 点击创建来源,选择容器服务来源类型,在下拉列表中选择已经部署Demo服务的ACK集群,点击确定完成来源的关联。

5. 左侧栏选择点击服务列表,点击创建服务,选择容器服务来源,选择default命名空间,勾选中部署好的3个Demo服务移到右侧,最后点击确定完成服务的导入订阅。

至此,我们完成了云原生网关关联订阅后端微服务的操作,下一步开始请求验证吧。

4. 配置路由并验证

1. 左侧栏选择点击路由配置,点击创建路由

2. 在创建路由表单中,如下填写点击下一步选择目标服务,最后点击保存并上线

  • 路由名称输入route-v1
  • 关联域名选择默认的*(本次主题不涉及域名及证书配置,选择*即可)
  • 匹配规则中只勾选路径(Path),选择精确匹配,填写/version(其余匹配规则暂不填写)
  • 目标服务选择单服务,在下拉列表中选择go-httpbin-v1

3. 在路由配置列表页,找到刚创建的route-v1路由,确认已正常发布。

4. 路由发布成功后,我们左侧栏点击基本概览,找到网关入口部分,复制一个公网类型入口地址IP。

5. 在FireFox浏览器打开新页签,粘贴刚复制的IP地址,再后面填写/version,回车访问网关验证。

至此,我们完成了网关一个简单的路由配置,并且使用浏览器顺利访问到了v1版本的Demo。

5. 多路由条件灰度

多路由条件灰度,顾名思义此方式是通过增加一条包含更多匹配条件的路由实现流量的灰度。

假设本次需求:url中包含test=true参数的请求访问到v2版本的Demo,即http://ip/version?test=true访问到v2版本服务。

1. 左侧栏选择点击路由配置,点击创建路由

2. 在创建路由表单中,如下填写,点击下一步选择目标服务,最后点击保存并上线

  • 路由名称输入route-test
  • 关联域名选择默认的*(本次主题不涉及域名及证书配置,选择*即可)
  • 匹配规则中勾选路径(Path),选择精确匹配,填写/version
  • 匹配规则中勾选请求参数(Query),添加请求参数,填写test 精确匹配 true
  • 目标服务选择单服务,在下拉列表中选择go-httpbin-v2

3. 路由创建成功后,同样确认发布生效。

4. 切到FireFox浏览器,在原来的地址栏继续填写?test=true,回车访问验证。

至此,我们实现了带test=true参数的请求访问到v2版本的Demo,不带参数的普通请求放到v1的Demo。

6. 多服务权重灰度

很多业务场景中我们的灰度需求并不依赖于具体请求的流量特征,只想要随机的权重将流量分配到不同的服务,用来观察迭代变更带来的稳定性变化。

假设本次需求:http://ip/version的访问流量80%转到v1版本的Demo,20%转到v2版本的Demo。

1. 左侧栏选择点击路由配置,因为切换了灰度场景,我们点击操作栏的下线route-test和route-v1避免干扰。

2. 再点击创建路由,表单中,如下填写,最后点击保存并上线

  • 路由名称输入route-multi
  • 关联域名选择默认的*(本次主题不涉及域名及证书配置,选择*即可)
  • 匹配规则中只勾选路径(Path),选择精确匹配,填写/version(其余匹配规则暂不填写)
  • 下一步目标服务选择多服务,点击添加目标服务,在下拉列表中选择go-httpbin-v1配置80的权重再点击添加目标服务,在下拉列表中选择go-httpbin-v2配置20的权重

3. 路由创建成功后,同确认已发布生效。

4. 切到FireFox浏览器,在地址栏填写http://你的网关入口IP/version,持续点击刷新或回车访问验证。

至此,我们会发现大部分请求返回version:v1,少部分请求返回version:v2,符合流量权重8:2的分配。

7. 单服务标签灰度

前面两种灰度方案都涉及到go-httpbin-v1和go-httpbin-v2两个K8s Service资源。但是有些部署场景只暴露了一个go-httpbin-all的情况下,我们怎么实现灰度,本章节简单演示通过标签机制实现这个需求,当然云原生网关标签机制不仅限于Kubernates服务发现机制,同时也兼容Nacos元信息的标签能力,此处篇幅有限暂不展开。

假设本次需求:在后端只暴露了一个go-httpbin-all微服务的情况下,http://ip/version的访问流量20%转到v1版本的Demo,80%转到v2版本的Demo。

1. 左侧栏展开服务管理,选择点击服务列表,列表页选择go-httpbin-all(这个服务包含有v1和v2两个版本Demo)并点击,进入服务详情页。

2. 进入详情页后,点击添加新版本,版本名称填写v1、标签名选择version、标签值选择v1,点击对号保存后同样操作添加v2版本。因为Demo服务pod资源上有version标签,所有此处服务详情可以选取到相应的标签。

3. 左侧栏选择点击路由配置,同样切换了灰度场景,我们点击操作栏的下线route-multi避免干扰。

4. 再点击创建路由,表单中,如下填写,最后点击保存并上线

  • 路由名称输入route-single
  • 关联域名选择默认的*(本次主题不涉及域名及证书配置,选择*即可)
  • 匹配规则中只勾选路径(Path),选择精确匹配,填写/version(其余匹配规则暂不填写)
  • 下一步目标服务选择标签路由,点击添加目标服务,在下拉列表中选择go-httpbin-all版本选择v1配置20的权重再点击添加目标服务,在下拉列表中选择go-httpbin-all版本选择v2配置80的权重

5. 路由创建成功后,同样确认发布生效。

6. 切到FireFox浏览器,在地址栏填写http://你的网关入口IP/version,持续点击刷新或回车访问验证。

至此,我们通过单服务标签机制实现灰度得到验证少部分请求返回version:v1,大部分请求返回version:v2,符合流量权重2:8的分配。

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

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
10天前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
8天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
10天前
|
运维 Kubernetes Cloud Native
云原生技术:容器化与微服务架构的完美结合
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其灵活性和高效性成为企业的新宠。本文将深入探讨云原生的核心概念,包括容器化技术和微服务架构,以及它们如何共同推动现代应用的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务,揭示云原生技术的强大能力和未来潜力。
|
8天前
|
负载均衡 监控 API
dotnet微服务之API网关Ocelot
Ocelot 是一个基于 .NET 的 API 网关,适用于微服务架构。本文介绍了如何创建一个 Web API 项目并使用 Ocelot 进行 API 请求路由、负载均衡等。通过配置 `ocelot.json` 和修改 `Program.cs`,实现对 `GoodApi` 和 `OrderApi` 两个项目的路由管理。最终,通过访问 `https://localhost:7122/good/Hello` 和 `https://localhost:7122/order/Hello` 验证配置成功。
19 1
dotnet微服务之API网关Ocelot
|
8天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
32 5
|
9天前
|
Kubernetes 负载均衡 Cloud Native
云原生架构下的微服务治理策略
随着云原生技术的不断成熟,微服务架构已成为现代应用开发的主流选择。本文探讨了在云原生环境下实施微服务治理的策略和方法,重点分析了服务发现、负载均衡、故障恢复和配置管理等关键技术点,以及如何利用Kubernetes等容器编排工具来优化微服务的部署和管理。文章旨在为开发者提供一套实用的微服务治理框架,帮助其在复杂的云环境中构建高效、可靠的分布式系统。
26 5
|
9天前
|
负载均衡 监控 Cloud Native
云原生架构下的微服务治理策略与实践####
在数字化转型浪潮中,企业纷纷拥抱云计算,而云原生架构作为其核心技术支撑,正引领着一场深刻的技术变革。本文聚焦于云原生环境下微服务架构的治理策略与实践,探讨如何通过精细化的服务管理、动态的流量调度、高效的故障恢复机制以及持续的监控优化,构建弹性、可靠且易于维护的分布式系统。我们将深入剖析微服务治理的核心要素,结合具体案例,揭示其在提升系统稳定性、扩展性和敏捷性方面的关键作用,为读者提供一套切实可行的云原生微服务治理指南。 ####
|
8天前
|
Cloud Native API 持续交付
云原生之旅:从容器到微服务的演进之路
【10月更文挑战第39天】在这篇文章中,我们将一起探索云原生技术的奥秘。通过浅显易懂的语言和生动的比喻,我们将了解云原生技术如何改变软件开发的世界。文章将带领读者从容器的基本概念出发,逐步深入到微服务架构的实践,揭示这些技术如何助力现代应用的快速迭代与可靠部署。准备好,让我们启程进入云原生的精彩世界吧!
|
11天前
|
Kubernetes Cloud Native Docker
云原生技术探索:容器化与微服务的实践之道
【10月更文挑战第36天】在云计算的浪潮中,云原生技术以其高效、灵活和可靠的特性成为企业数字化转型的重要推手。本文将深入探讨云原生的两大核心概念——容器化与微服务架构,并通过实际代码示例,揭示如何通过Docker和Kubernetes实现服务的快速部署和管理。我们将从基础概念入手,逐步引导读者理解并实践云原生技术,最终掌握如何构建和维护一个高效、可扩展的云原生应用。
|
11天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 10 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
下一篇
无影云桌面