基于阿里云服务网格流量泳道的全链路流量管理(一):严格模式流量泳道

作者:尹航

概述

灰度发布是一种常见的对新版本应用服务的发布手段,其特点在于能够将流量在服务的稳定版本和灰度版本之间时刻切换,以帮助我们用更加可靠的方式实现服务的升级。在流量比例切换的过程中,我们可以逐步验证新版本服务的功能特性、可靠性等特性,一旦新版本服务不满足需求,还可以时刻将流量切回老版本,因此灰度发布也是一种在软件工程领域中得到广泛应用的发布方案。

当前,服务网格的无侵入式灰度发布已经是一个非常成熟的特性:我们可以同时部署服务的多个版本,使用 DestinationRule 来制定工作负载的版本定义,并使用 VirtualService 的流量比例分割的能力将不同比例的服务流量发往不同版本的工作负载,直至所有流量都直接发往新版本服务。

然而,在云原生应用广泛采用的大背景下,应用程序往往不再以单体服务的形式存在,而是被分解为一系列云原生服务部署在 Kubernetes 集群中,服务之间存在调用链路、共同对外提供服务。

图片

当服务之间存在调用链路时,对服务的灰度发布往往不局限于单个服务,而是需要对服务的整条请求链路进行环境隔离与流量控制,即:保证灰度流量只发往调用链路中服务的灰度版本,实现调用链路之间相互隔离的隔离环境。针对整个调用链路的流量管理需求为服务网格的无侵入式流量管理方案带来了新的挑战:

  • 流量规则复杂度高

    基于 Istio 社区的 VirtualService 和 DestinationRule 规则需要针对每个服务进行单独定制,在全链路流量管理的场景下会提高配置出错的几率与服务流量的维护成本。

  • 流量管理灵活度低

    针对不同的全链路流量管理需求,难以通过简单调整流量规则实现全部需求(例如:针对一条灰度链路,仅发布链路中部分服务的新版本)。

服务网格 ASM 支持将应用的相关版本(或者其他特征)隔离成一个独立的运行环境(即泳道),然后通过设置泳道规则,将满足规则的请求流量路由到目标版本(或者其他特征)的应用上。ASM 流量泳道具有以下特点:

  • 配置简单

    通过使用 ASM 流量泳道功能,您仅需制定少量的治理规则,便可构建从网关到整个后端服务的多个流量隔离环境,有效保障多个服务顺利安全发布以及服务多版本并行开发,进一步促进业务的快速发展。

  • 支持不同维度的全链路流量管理需求

    ASM 流量泳道支持严格模式与宽松模式,两种模式各自有着自己的优势、限制以及适配使用场景,适配更多样的流量治理需求。

流量泳道的严格模式与宽松模式

1. 严格模式的流量泳道

在严格模式下,每条流量泳道中包含调用链路上的全部服务。该模式对于您的应用程序无任何要求,只需配置流量泳道即可实现。如下图所示:

图片

2. 宽松模式的流量泳道

在宽松模式下,您只需要确保创建一条包含调用链路中所有服务的泳道:基线泳道。其它泳道可以不包含调用链路上的全部服务。当一个泳道中的服务进行相互调用时,若目标服务在当前泳道中不存在,则请求将被转发到基线泳道中的相同服务,并在请求目标存在当前泳道中存在时将请求重新转发回当前泳道。使用宽松模式的流量泳道时,您的应用程序必须包含一个能够在整条调用链路中透传的请求头(链路透传请求头),并另外使用一个引流请求头用来根据请求头内容将流量路由到不同的流量泳道上。如下图所示:

图片

本文接下来主要演示严格模式泳道在服务网格 ASM 中的应用。

演示:使用严格模式的 流量泳道实现全链路灰度管理

在本文的示例场景下,将使用上图所示的三个服务 mocka、mockb、mockc 创建代表服务调用链三个版本的三个泳道:s1、s2、s3。

1. 前提条件

  • 已创建 ASM 企业版或旗舰版实例,且版本为 1.18.2.111 及以上。具体操作,请参见创建 ASM 实例 [ 1]
  • 已添加 ACK 集群到 ASM 实例。具体操作,请参见添加集群到 ASM 实例 [ 2]
  • 已创建名称为 ingressgateway 的 ASM 网关。具体操作,请参见创建入口网关服务 [ 3]
  • 已创建名称为 ingressgateway 且命名空间为 istio-system 的网关规则。具体操作,请参见管理网关规则 [ 4]
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:name: ingressgatewaynamespace: istio-system
spec:selector:istio: ingressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- '*'

2. 部署示例服务

首先在 ACK 集群中部署示例中的应用服务,以实现全链路灰度场景。为 default 命名空间启用 Sidecar 网格代理自动注入(具体操作,请参见启用自动注入 [ 5] ),接下来在 ACK 集群中执行以下命令,部署示例服务。

kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v1/mock-v1.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v2/mock-v2.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v3/mock-v3.yaml

3. 创建泳道组和对应泳道

在示例中,我们将 mocka->mockb->mockc 服务调用链路的 v1、v2、v3 三个版本分隔成 s1、s2、s3 三条泳道,三条泳道组成的集合称为泳道组。在服务网格 ASM 中,可以通过简单的配置完成泳道组和泳道的创建。

  • 登录 ASM 控制台 [ 6] ,在左侧导航栏,选择服务网格 > 网格管理。
  • 在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择流量管理中心 > 流量泳道。
  • 在流量泳道页面,单击创建泳道组,在创建泳道组面板,配置相关信息,然后单击确定。
配置项说明
泳道组名称本示例配置为test。
入口网关选择ingressgateway。
泳道模式选择严格模式
泳道服务选择目标Kubernetes集群和default命名空间,在下方列表中选中mocka、mockb和mockc服务,单击图标,添加目标服务到已选择区域。

图片

接下来在泳道组内创建 s1、s2、s3 泳道,分别对应服务调用链路的 v1、v2、v3 版本。

  • 在流量泳道页面的流量规则定义区域,单击创建泳道。
  • 在创建泳道对话框,配置相关信息,然后单击确定。

图片

三个泳道创建完成后,示例效果如下:

图片

每创建一个泳道,流量泳道会自动创建出泳道对应的目标规则 DestinationRule。例如所有泳道创建完成后,会针对 mocka 服务自动创建如下目标规则 DestinationRule。

kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v1/mock-v1.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v2/mock-v2.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v3/mock-v3.yaml

三个泳道创建完成后,针对泳道组中的每个服务都将生成泳道规则对应的虚拟服务 VirtualService。例如,针对 mocka 服务会自动创建如下虚拟服务 VirtualService。

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:labels:asm-system: 'true'provider: asmswimlane-group: testname: trafficlabel-vs-test-default-mockanamespace: istio-system
spec:hosts:- mocka.default.svc.cluster.localhttp:- match:- sourceLabels:ASM_TRAFFIC_TAG: v1route:- destination:host: mocka.default.svc.cluster.localsubset: s1- match:- sourceLabels:ASM_TRAFFIC_TAG: v2route:- destination:host: mocka.default.svc.cluster.localsubset: s2- match:- sourceLabels:ASM_TRAFFIC_TAG: v3route:- destination:host: mocka.default.svc.cluster.localsubset: s3

最后创建各个泳道对应的引流规则。通过不同的引流规则,ASM 网关可以将不同特征的请求路由到不同的泳道隔离环境之内,实现泳道内服务调用链路之间的完全隔离。下文以创建 s1 泳道的引流规则为例进行说明,请参照以下步骤创建 s2 和 s3 泳道的引流规则。

  • 在流量泳道页面的流量规则定义区域,单击目标泳道右侧操作列下的引流规则。
  • 在添加引流规则对话框,配置相关信息,然后单击确定。本文以泳道服务对应入口 API 均为 /mock 为例,为每个泳道配置相同的引流规则。
配置项说明
入口服务选择mocka.default.svc.cluster.local。
引流规则配置名称为r1,域名为*。
匹配请求的URI配置匹配方式为精确,匹配内容为/mock。
添加Header匹配规则单击添加Header匹配规则,在添加的Header匹配规则中,填写名称为x-asm-prefer-tag,匹配方式为精确,匹配内容为s1。

图片

三个泳道的引流规则创建成功后,示例效果如下:

图片

创建成功后,会自动生成每条泳道的引流规则,即虚拟服务 VirtualService。例如,针对泳道 s1 会生成如下的虚拟服务 VirtualService:


apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:labels:asm-system: 'true'provider: asmswimlane-group: testname: swimlane-ingress-vs-test-s1namespace: istio-system
spec:gateways:- istio-system/ingressgatewayhosts:- '*'http:- match:- headers:x-asm-prefer-tag:exact: s1uri:exact: /mockname: r1route:- destination:host: mocka.default.svc.cluster.localsubset: s1

4. 验证全链路灰度功能是否生效

通过以上的规则配置,ASM 流量泳道已经自动创建好了用于维护不同调用链路间相互隔离的流量规则。可以通过简单的访问验证通过流量泳道实现的全链路灰度是否生效。

1)获取 ASM 网关的 IP 地址(参考获取 ASM 网关地址 [ 7] )。

2)执行以下命令设置环境变量。xxx.xxx.xxx.xxx 为上一步获取的 IP。

export ASM_GATEWAY_IP=xxx.xxx.xxx.xxx

3)验证全灰度链路功能是否生效。

  • 执行以下命令,查看 s1 泳道的访问效果。x-asm-prefer-tag 对应的值 s1 为步骤二创建 s1 泳道时配置的泳道名称。
for i in {1..100}; do curl   -H 'x-asm-prefer-tag: s1' http://${ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;

预期输出:

-> mocka(version: v1, ip: 172.17.0.54)-> mockb(version: v1, ip: 172.17.0.129)-> mockc(version: v1, ip: 172.17.0.130)

由预期输出得到,通过设置 HTTP 标头 x-asm-prefer-tag: s1 声明的流量流向 s1 泳道下的相关服务,符合预期。

  • 执行以下命令,查看 s2 泳道的访问效果。x-asm-prefer-tag 对应的值 s2 为步骤二创建 s2 泳道时配置的泳道名称。
for i in {1..100}; do curl   -H 'x-asm-prefer-tag: s2' http://${ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;

预期输出:

-> mocka(version: v2, ip: 172.17.0.9)-> mockb(version: v2, ip: 172.17.0.126)-> mockc(version: v2, ip: 172.17.0.128)

由预期输出得到,通过设置 HTTP 标头 x-asm-prefer-tag: s2 声明的流量流向 s2 泳道下的相关服务,符合预期。

  • 执行以下命令,查看 s3 泳道的访问效果。x-asm-prefer-tag 对应的值 s3 为步骤二创建 s3 泳道时配置的泳道名称。
for i in {1..100}; do curl   -H 'x-asm-prefer-tag: s3' http://${ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;

预期输出:

-> mocka(version: v3, ip: 172.17.0.132)-> mockb(version: v3, ip: 172.17.0.127)-> mockc(version: v3, ip: 172.17.0.69)

由预期输出得到,通过设置 HTTP 标头 x-asm-prefer-tag: s3 声明的流量流向 s3 泳道下的相关服务,符合预期。

总结

本文简要讨论了在使用服务网格治理云原生应用流量时,在全链路流量管理场景下的挑战与局限;并介绍了服务网格 ASM 中的流量泳道能力在服务网格全链路流量管理下的优势与特点。接下来针对 ASM 流量泳道的严格模式进行了详细演示与说明。接下来我们还会针对宽松模式下的 ASM 流量泳道进行进一步地深入介绍。

相关链接:

[1] 创建 ASM 实例

https://help.aliyun.com/document_detail/147793.html#task-2370657

[2] 添加集群到 ASM 实例https://help.aliyun.com/document_detail/148231.html#task-2372122[3] 创建入口网关服务

https://help.aliyun.com/document_detail/150510.html#task-2372970

[4] 管理网关规则

https://help.aliyun.com/document_detail/150504.html[5] 开启 Sidecar 自动注入

https://help.aliyun.com/document_detail/186136.html#task-1962690

[6] ASM 控制台

https://servicemesh.console.aliyun.com/

[7] 获取 ASM 网关地址

https://help.aliyun.com/document_detail/444079.html#section-ida-zt6-md7

点击此处了解服务网格 ASM 产品详情

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能时代AIGC绘画实战

系列文章目录 送书第一期 《用户画像:平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 …

编译WSL内核,用于操作usb读卡器

wsl2默认不能操作usb读卡器,但是对于嵌入式linux开发来说,需要经常对tf卡进行操作,随时都会使用到usb读卡器的访问。下面讲述如何开启wsl2的usb读卡器的访问,主要涉及到以下2个步骤: wsl2本质是一个虚拟机&#xff0c…

C++作业5

完成沙发床的多继承&#xff08;有指针成员&#xff09; 代码&#xff1a; #include <iostream>using namespace std;class Bed { private:double *money; public:Bed(){cout << "Bed::无参构造函数" << endl;}Bed(double money):money(new doub…

【Latex笔记】标题页

整体结构 模板结构如下&#xff1a; \documentclass{book} % 导言区&#xff0c;加载宏包和各项设置&#xff0c;包括参考文献、索引等 \usepackage{makeidx} % 调用makeidx 宏包&#xff0c;用来处理索引 \makeindex % 开启索引的收集 \bibliographystyle{plain} % 指定参考…

010 数据结构_红黑树

前言 本文将会向你介绍红黑树的概念、性质&#xff0c;以及如何手撕红黑树 1 文章重点 文本首先引入红黑树的概念和性质&#xff0c;性质非常重要对于后面的插入操作来说&#xff0c;文章的核心放在了插入部分&#xff0c;另外看插入部分之前记得看声名和节点的定义哦~ 2 引…

嵌入式门槛高吗?

今日话题&#xff0c;嵌入式门槛高吗&#xff1f;在嵌入式领域&#xff0c;门槛因公司和职位的不同而异。普通的嵌入式岗位门槛相对较低&#xff0c;通常要求掌握一些C语言编程和单片机相关知识&#xff0c;可以制作简单的电子产品&#xff0c;但相应的工资较低。然而&#xff…

解决Flutter运行报错Could not run build/ios/iphoneos/Runner.app

错误场景 更新了IOS的系统版本为最新的17.0, 运行报以下错误 Launching lib/main.dart on iPhone in debug mode... Automatically signing iOS for device deployment using specified development team in Xcode project: GN3DCAF71C Running Xcode build... Xcode build d…

典型的ETL使用场景

典型的ETL使用场景 ETL( Extract&#xff0c;Transform&#xff0c;Load)是一种用于数据集成和数据转换的常用技术。它主要用于从多个数据源中提取数据&#xff0c;对数据进行清洗、转换和整合&#xff0c;最后加载到目标系统中。ETL 的使用场景非常广泛&#xff0c;下面将介绍…

Theamleaf导出pdf模版编写(原始th/td编写表格)

需求&#xff1a;简单的theamleaf编写表格就是简单的th/td&#xff0c;新需求是导出的模版是学员table表&#xff0c;每个项目的学员数量是不定的&#xff0c;所以用到 <tr th:each"item,start:${studentList}"> 所有代码&#xff1a; <!DOCTYPE html>…

python 实现 AIGC 大模型中的概率论:生日问题的基本推导

在上一节中&#xff0c;我们对生日问题进行了严谨的阐述&#xff1a;假设屋子里面每个人的生日相互独立&#xff0c;而且等可能的出现在一年 365 天中的任何一天&#xff0c;试问我们需要多少人才能让某两个人的生日在同一天的概率超过 50%。 处理抽象逻辑问题的一个入手点就是…

【bash指令全集合】最全教程-持续更新!

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于新西兰奥克兰大学攻读IT硕士学位。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。跨领域…

Centos7.4安装nginx1.24.0_安装详细步骤---Linux工作笔记066

以前安装的太模糊了,干脆重新写一个: 1.首先下载对应的nginx-1.24.0.tar.gz安装文件 2.然后: 去执行命令 安装依赖 yum install -y gcc yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel 3.然后:去解压 tar -zxvf ngi…

一文讲透Python机器学习决策树算法的基本概念与原理

1.决策树算法的基本特点与优势 决策树算法是一种有监督、非参数、简单、高效的机器学习算法。相对于非监督式学习方法&#xff0c;决策树算法由于充分利用了响应变量的信息&#xff0c;因此能够很好地克服噪声问题&#xff0c;在分类及预测方面效果更佳。决策树的决策边界为矩…

【MySQL】MySQL数据库基础

MySQL数据库基础 一、为什么要有数据库&#xff1f;二、 数据库软件的构成数据库服务器&#xff0c;数据库&#xff0c;表关系主流数据库 三、基本使用1、连接服务器2、服务器管理3、MySQL配置文件4、数据库的简单操作5、数据逻辑存储 四、MySQL架构SQL分类MySQL客户端存储引擎…

smartkit巡检E9000设备

https://support.huawei.com/enterprise/zh/doc/EDOC1100325140/f6eeacd6 打开链接&#xff0c;里面的内容很详细。

013 OpenCV copyMakeBorder(padding)

目录 一、环境 二、原理 三、完整代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、原理 cv.copyMakeBorder是OpenCV库中的一个函数&#xff0c;用于在图像周围添加边框&#xff08;padding&#xff09;。这个函数可以用于图…

C#中GDI+绘图应用(柱形图、折线图和饼形图)

目录 一、柱形图 1.示例源码 2.生成效果 二、折线图 1.示例源码 2.生成效果 三、饼形图 1.示例源码 2.生成效果 GDI绘制的一些常用的图形&#xff0c;其中包括柱形图、折线图和饼形图。 一、柱形图 柱形图也称为条形图&#xff0c;是程序开发中比较常用的一种图表技术…

掌握Python异步IO利器:深入解读Asyncio

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 异步 IO 与 Asyncio 在 Python 中的应用 在当今互联网时代&#xff0c;处理大量并发请求或I/O密集型任务对于软件应用程序至关重要。Python的异步IO框架——Asyncio成为了处理此类问题的有力工具。本文将深入介…

基于SpringBoot实现的电影院售票系统

一、 系统架构 前端&#xff1a;html | jquery | bootstrap 后端&#xff1a;springboot | thymeleaf | spring-data-jpa 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据库 三、功能介绍 01. 首页 02. 登录页 03. 管理端-电影列表 04. 管理端-添加电影 05. 管…

京东数据分析:2023年10月京东打印机行业品牌销售排行榜

鲸参谋监测的京东平台10月份打印机市场销售数据已出炉&#xff01; 10月份&#xff0c;打印机市场整体销售下滑。鲸参谋数据显示&#xff0c;今年10月份&#xff0c;京东平台打印机的销量将近60万&#xff0c;环比降低约2%&#xff0c;同比降低约5%&#xff1b;销售额为4.4亿&a…