ASM通过流量泳道组(ASMSwimLaneGroup)和流量泳道(ASMSwimLane)两种资源实现针对服务调用链路的流量泳道能力。流量泳道能够将应用的相关版本(或者其他特征)隔离成一个独立的运行环境(即泳道),然后通过设置泳道引流规则,将满足规则的请求流量路由到目标版本(或者其他特征)的应用上。
配置示例
以下配置表示为Kubernetes集群中default命名空间下的服务mocka、mockb、mockc建立一个名为mock的泳道组。泳道组中包含v1和v2两条流量泳道,分别对应这些服务的v1和v2版本(通过Pod上的version标签区分版本)。当mocka、mockb、mockc相互发送请求时,将只会调用相同版本的服务,保证v1和v2版本的隔离。同时,基于istio-system下名为ingressgateway的网关规则创建虚拟服务,为两条泳道进行引流。
ASMSwimLaneGroup字段说明
ASMSwimLaneGroup定义了一个流量泳道组。流量泳道组主要定义多条流量泳道需要共享的信息,包括需要为哪些服务创建流量泳道隔离环境、泳道引流的虚拟服务规则需要基于哪个网关规则创建等。一个流量泳道组可以与多个流量泳道建立关联,流量泳道可以通过swimlane-group: {ASMSwimLaneGroup名称}
的方式关联泳道组。
ASMSwimLaneGroupSpec
ASMSwimLaneGroupSpec是ASMSwimLaneGroup的核心配置,即spec字段的部分。
字段 | 类型 | 是否必选 | 说明 |
services | 是 | 指定需要为K8s集群中的哪些服务创建泳道隔离环境。通过K8s Service的名称、命名空间、所在K8s集群ID与集群名称来引用K8s集群中的服务。 | |
ingress | 是 | 指定流量泳道组的入口网关的相关配置。入口网关的主要作用是为泳道组中的多个版本服务进行引流。 | |
isPermissive | bool | 否 | 指定流量泳道组的模式。取值如下:
关于严格模式和宽松模式的流量泳道的详情,请参见流量泳道概述。 |
permissiveModeConfiguration | 否 | 宽松模式下泳道组的相关配置,当泳道组模式为宽松模式时必须配置。 | |
defaultTrafficPolicyPatch | 否 | 应用到泳道组内所有服务的目的地流量策略。使用此字段时,泳道组将为所有泳道组内的所有服务的目标规则(DestinationRule)中增加指定的流量策略声明。 说明 使用此字段需要ASM实例版本在1.21.6.104及以上。 | |
defaultHttpRoutePatch | 否 | 应用到泳道组内所有服务的HTTP路由操作。泳道组将为泳道组内的所有服务声明虚拟服务(VirtualService),使用此字段时,泳道组将会向泳道组内每个服务的虚拟服务中增加指定的流量路由操作字段(如rewrite、timeout等)。注意,为防止破坏泳道流量规则,您无法指定match、name、route、delegate字段。 说明 使用此字段需要服务网格实例版本在1.21.6.104及以上。 |
ClusterServiceRef
每个ClusterServiceRef引用一个部署在K8s集群中的Service。流量泳道通过这些引用决定为哪些服务创建流量隔离环境。
字段 | 类型 | 是否必选 | 说明 |
name | string | 是 | K8s Service的名称。 |
namespace | string | 是 | K8s Service所在的命名空间。 |
cluster | 否 | K8s集群的引用信息。 | |
trafficPolicyPatch | 否 | 应用到具体泳道组内服务上的目的地流量策略。如果被指定,此字段将覆盖ASMSwimLaneGroupSpec下的defaultTrafficPolicyPatch。 说明 使用此字段需要服务网格实例版本在1.21.6.104及以上。 | |
httpRoutePatch | 否 | 应用到具体泳道组内服务的HTTP路由操作。如果被指定,此字段将覆盖ASMSwimLaneGroupSpec下的defaultHttpRoutePatch。 说明 使用此字段需要服务网格实例版本在1.21.6.104及以上。 |
ClusterRef
ClusterRef提供一个添加到ASM实例中的K8s集群的引用信息。
字段 | 类型 | 是否必选 | 说明 |
name | string | 否 | K8s集群的显示名称。 |
id | string | 否 | K8s集群的集群ID。 |
SwimLaneGroupIngressConfiguration
SwimLaneGroupIngressConfiguration定义了为泳道组内服务进行引流的入口网关的相关信息。
字段 | 类型 | 是否必选 | 说明 |
gateway | 是 | 与入口网关关联的网关规则(Gateway)的相关信息。 | |
ingressRouting | 否 | 对泳道组内服务进行引流的引流规则相关配置。 说明 使用此字段需要网格实例版本在1.21.6.92及以上。 |
SwimLaneGatewayConfiguration
SwimLaneGatewayConfiguration定义了与入口网关相关联的网关规则(Gateway)的相关信息。
字段 | 类型 | 是否必选 | 说明 |
name | string | 是 | 网关规则的名称。 |
namespace | string | 是 | 网关规则所在命名空间。 |
type | string | 是 | 网关规则的类型,必须填写为 |
SwimLaneGroupIngressRouteConfiguration
SwimLaneGroupIngressRouteConfiguration定义了对泳道组内服务进行引流的引流规则相关配置。
字段 | 类型 | 是否必填 | 说明 |
ingressRoutingStrategy | string | 否 | 对泳道组内服务进行引流的策略,可以指定两个选项:
|
weightedRoutingRule | 否 | 在基于权重的引流策略下,匹配所有请求时使用的统一匹配规则。仅在ingressRoutingStrategy值为weighted时起效。 |
WeightedSwimLaneIngressConfiguration
WeightedSwimLaneIngressConfiguration指定了基于权重的引流策略下匹配所有请求时使用的统一匹配规则。
字段 | 类型 | 是否必填 | 说明 |
hosts | []string | 是 | 匹配请求的域名,该域名必须声明在泳道组关联的网关规则(Gateway)中。 |
requestMatches | 否 | 对请求URI及请求头进行匹配的匹配条件。 |
PermissiveSwimLaneGroupConfiguration
PermissiveSwimLaneGroupConfiguration定义了在宽松模式下,流量泳道组需要指定的参数。
字段 | 类型 | 是否必选 | 说明 |
routeHeader | string | 是 | 宽松模式下,流量泳道的引流请求头名称。 引流请求头用于请求在请求调用链路中传递时确定请求所处泳道。 在宽松模式下,请求经入口网关转发到达上游服务时,必须携带引流请求头,以确定请求所处泳道。 |
traceHeader | string | 是 | 宽松模式下,流量泳道使用的链路透传请求头名称。 链路透传请求头必须具有以下性质:
|
fallbackTarget | string | 否 | 宽松模式下的基线泳道名称。当路由到泳道对应版本的服务失败时,流量将回退到服务的基线版本。 |
ASMSwimLane字段说明
ASMSwimLane定义一条流量泳道。流量泳道定义主要包含与服务的具体版本(或其他特征)相关的信息。一条流量泳道通过打上swimlane-group: {ASMSwimLaneGroup名称}
标签的方式与一个泳道组建立关联。
ASMSwimLaneSpec
ASMSwimLaneSpec是ASMSwimLane的核心配置,即spec的部分。
字段 | 类型 | 是否必选 | 说明 |
labelSelector | map<string, string> | 是 | 一个或多个标签,用来匹配属于此泳道的服务Pod。一般使用带有版本信息的标签对泳道内的Pod进行匹配,如 |
services | 否 | 指定泳道内部署了哪些服务。和ASMSwimLaneGroupSpec中的services字段相同,通过K8s Service的名称、命名空间、所在K8s集群ID与集群名称来引用K8s集群中的服务。
| |
ingressRules | 否 | 泳道对应的引流规则定义。该引流规则定义将转化为泳道组关联的入口网关上的虚拟服务资源,负责将请求从网关上路由到泳道中的服务。 如果不填写ingressRules字段,也可以手动创建网关上的虚拟服务资源为泳道内的服务引流。 | |
ingressWeight | 否 | 当泳道组使用基于权重的引流策略时,使用此字段指定每条泳道对应的引流权重比例。泳道组将依据不同泳道声明的引流权重向该条泳道的入口服务转发一定比例的请求。仅当ingressRoutingStrategy值为weighted时起效。 |
SwimLaneIngressRule
SwimLaneIngressRule指定了网关为一条泳道内服务进行引流的路由规则,该规则将转化为网关上的虚拟服务。
字段 | 类型 | 是否必选 | 说明 |
online | bool | 是 | 指定引流规则是否生效。当online为true时,网关上的虚拟服务才会对应被创建。 |
hosts | string[] | 是 | 引流规则匹配的域名。对应虚拟服务中的hosts字段。 |
name | string | 否 | 引流规则名称。对应虚拟服务中HTTP路由的名称。 |
match | 否 | 引流规则的请求匹配条件,将对应转化为虚拟服务中HTTP路由的match字段。 | |
route | 是 | 引流规则的引流目的服务,将对应转化为虚拟服务中HTTP路由的route字段。 |
SwimLaneIngressWeight
字段 | 类型 | 是否必选 | 说明 |
weight | int | 否 | 泳道的引流权重数值,不指定则为0。该数值将通过与其它泳道的引流权重比较来确定最终的引流比例。 |
destination | 是 | 在基于权重的引流策略下,指定应将请求转发到的服务实例。 |
SwimLaneIngressRequestMatch
SwimLaneIngressRequestMatch是引流规则的请求匹配条件。
字段 | 类型 | 是否必选 | 说明 |
uri | 否 | 请求URI匹配条件。示例如下:
| |
headers | map<string, StringMatch> | 否 | 请求Header匹配条件。Map的键必须小写并使用短划线(-),代表Header的名称,例如x-request-id。Map的值同为StringMatch类型,示例如下:
|
StringMatch
StringMatch指定一个字符串匹配条件,用于指定如何匹配请求的URI和Header。
字段 | 类型 | 是否必选 | 说明 | |
任选其一 | exact | string | 否 | 精确的字符串匹配。 |
prefix | string | 否 | 基于前缀的匹配。 | |
regex | string | 否 | RE2风格的基于正则表达式的匹配。更多信息,请参见wiki。 |
SwimLaneIngressRoute
SwimLaneIngressRoute指定了引流规则的引流目的服务。
字段 | 类型 | 是否必选 | 说明 |
destination | 是 | 指定应将请求转发到的服务实例。 |
RouteDestination
字段 | 类型 | 是否必选 | 说明 |
host | string | 是 | K8s服务域名,例如 |
portNum | int | 否 | k8s服务端口。如 说明 使用此字段需要网格实例版本在1.21.4.104及以上。 |
相关文档
关于流量泳道的概念、使用场景,以及严格与宽松两种模式的流量泳道对比,请参见流量泳道概述。
关于如何使用严格模式流量泳道实现全链路流量管理,请参见使用严格模式流量泳道。
关于如何使用宽松模式流量泳道实现全链路流量管理,请参见使用宽松模式流量泳道。