流量标签路由 本章节介绍如何在服务网格中实现流量标签的打标及路由等 概述 在应用服务网格中可以通过自定义的资源(TrafficLabel)实现对请求流量的打标,进而可以基于流量的标签进行单服务及全链路的路由、策略控制等。本文介绍流量打标原理,流量标签管理,流量标签配置示例及详细说明。 流量打标原理 流量打标就是要给流量打上标签,进而可以对流量进行路由等策略配置。当前CSM服务网格支持从请求头部或者工作负载本身的标签中取值作为流量的标签;同时还支持在调用链中透传流量标签信息,用于实现全链路的标签路由策略。 流量标签配置实例 下面是一个流量标签的配置示例,定义了一个流量标签userdefinelabel1,会取当前pod的CSMTRAFFICTAG标签值作为userdefinelabel1的值添加到请求头部里面;同时还定义了另外一个userdefinelabel2标签,该标签定义优先从请求的xtraffictag头部取值,同时使用Envoy生成的xrequestid作为上下文key,在整个调用链路中透传该标签;如果打标失败了,会按照valueFrom数组中下一个定义继续取值,取到第一个非空值时停止。 plaintext apiVersion: istio.ctyun.cn/v1beta1 kind: TrafficLabel metadata: name: trafficlabelexample namespace: demo spec: rule: labels: name: userdefinelabel1 valueFrom: $getLabel(CSMTRAFFICTAG) name: userdefinelabel2 valueFrom: $getInboundRequestHeaderWithContext (xtraffictag, xrequestid) $getLabel(CSMTRAFFICTAG) 当前CSM服务网格支持的流量打标方式有以下几种: 函数 说明 示例 getInboundRequestHeader(headerName) 从Inbound方向的请求header中取值;只应用于istio ingress网关。 请求headerName:v1 打标后: userdefinelabel: v1 getInboundRequestHeaderWithContext(headerName, contextKey) 从Inbound方向的请求header取值,同时从contextKey头部取值作为流量标签在上下文透传的key; 该头部可以是用于实现链路追踪上下文透传的头部,比如xrequestid、xb3traceid或者您的业务中使用的自定义头部; 该函数只适用于sidecar。 请求: contextID: 1234abcd headerName: v1 打标后: contextID: 1234abcd headerName: v1 userdefinelabel: v1 getOutboundRequestHeader(headerName) 从outbound方向的请求头部取值,只适用于sidecar。 请求headerName:v1 打标后: userdefinelabel: v1 getLabel(labelName) 从pod的标签取值;适用于istio ingress网关和sidecar。 Pod标签: labelName: v1 打标后: userdefinelabel: v1