使用宽松模式流量泳道实现全链路流量管理
宽松模式流量泳道搭配定制化路由资源如虚拟服务、目标规则等,可以实现全链路的流量统一接入、细粒度的路由管理以及插件式的流量处理。本文介绍如何使用宽松模式流量泳道实现全链路流量管理。
功能介绍
您可以通过使用宽松模式的流量泳道灵活地实现应用版本隔离。基于链路透传请求头和引流请求头,将流量路由到不同泳道。泳道中服务相互调用时,若目标服务不存在当前泳道则转发至基线泳道,保障链路完整性,简化流量管理。
关于宽松模式的流量泳道,您需要了解以下内容。
调用链路上下文透传方式
调用链路上下文透传是应用程序可以使用宽松模式流量泳道的重要前提,这通常代表您的应用程序必须具备以下特征:对于同一调用链路上的所有请求来说,所有请求都具有一个相同的请求头。
宽松模式的流量泳道适配了常见的应用程序调用链路上下文透传方式,您需要根据您的应用程序实际情况,有针对的选择相对应的场景来配置宽松模式流量泳道。
场景一: 透传trace ID
trace ID是指具有以下特征的请求头:
请求头的内容能够在整条调用链路中透传。
请求头内容对于每条调用链路都各不相同。
trace ID一般用于独立标识一条完整调用链路,其内容多为随机字符串。如果应用程序已经接入链路追踪系统,您的应用程序可能已经具备了透传trace ID的能力,一些常见的链路追踪标准都有独特的trace ID请求头,如x-b3-trace-id、x-datadog-trace-id等。
场景二:透传自定义请求头
应用程序在代码实现阶段,可能已经做到了透传某些具有业务意义的请求头,如version、env等,这种请求头常用来标识调用链路版本和环境。基于这种场景使用宽松模式流量泳道时,您只能同时将透传的自定义请求头作为引流请求头使用。
场景三:透传Baggage请求头
Baggage是OpenTelemetry推出的一种标准化机制,旨在实现分布式系统调用链路中跨进程传递上下文信息。它通过在HTTP头部增加名为“Baggage”的字段实现,字段值为键值对格式,可传递租户ID、追踪ID、安全凭证等上下文数据,支持链路追踪、日志关联等功能而无需修改代码。例如:
baggage: userId=alice,serverNode=DF%2028,isProduction=false
Baggage是OpenTelemetry社区提出的调用链路上下文透传标准化机制,因此我们也推荐您基于这种方式来配置宽松模式的流量泳道。
对于场景一和场景三:如果您的应用程序未接入链路追踪系统或未通过代码透传baggage,可以参考自动插装,使用OpenTelemetry Operator为应用程序注入自动插装能力来实现对链路ID请求头的透传,而无需修改应用程序代码。要完成自动插装,您需要跟随上述社区文档完成OpenTelemetry Operator的安装、自动插装的配置,以及为应用Pod加入annotation的一系列步骤。OpenTelemetry自动插装支持多种常见的分布式链路上下文透传标准(如W3C Baggage、B3等),上述的自动插装社区文档提供了W3C TraceContext和W3C Baggage的透传示例。
引流请求头
通常情况下,宽松模式流量泳道使用引流请求头为请求链路进行“打标”,您可以任意的指定请求头,只要不与应用程序现有的业务相关请求头冲突即可。基于您选择的调用链路上下文透传方式,宽松模式流量泳道将保证在调用链路上的每个环节都包含值为泳道名称的引流请求头。例如,如果您指定x-asm-prefer-tag
为引流请求头,当请求发往名称为s1
的泳道中的服务时,调用链路中后续的请求将始终带有x-asm-prefer-tag: s1
的请求头。基于请求头中的泳道标签信息,流量泳道可以实现应用不同版本之间的隔离环境。
如果您的调用链路上下文透传方式选择了透传自定义请求头,则引流请求头必须指定为被透传的自定义请求头。
场景概述
基于宽松模式的流量泳道,您可以通过多种不同的方式来实现应用版本隔离。通过以下场景,您将了解如何通过三种不同的透传请求头方式将流量路由到泳道,以及如何配置、使用自定义虚拟服务为宽松模式的泳道引流。
相关文档
流量泳道分为严格与宽松两种模式。关于这两种模式的说明和差异,请参见流量泳道概述。
如果您需要同时将链路透传请求头指定为引流请求头,实现全链路流量管理,请参见场景二:在链路中透传自定义请求头。
您可以基于VirtualService和DestinationRule等流量规则实现流量泳道,同时通过配置流量降级,在某个版本(或者其他特征)的应用不可用时,将流量发往一个指定的降级版本(或其他特征)的应用。具体操作,请参见基于流量规则配置实现流量泳道和流量降级。
流量泳道的引流规则包含针对请求头以及请求路径的匹配规则,您可以通过自定义虚拟服务的方式来实现更复杂的匹配规则或者自定义请求路由的需求。具体配置方法,请参见通过自定义虚拟服务为宽松模式的泳道引流。
如果您需要详细了解虚拟服务的详细CRD定义,请参见虚拟服务(Virtual Service)CRD说明。