流量标签的工作原理
流量标签TrafficLabel是CSM中的自定义CRD,CSM网格实例中可通过yaml模板创建流量标签,yalm中关键字段说明如下:
字段 |
说明 |
rule |
标签规则 |
labels |
作用于工作负载的标签,支持一个或者多个 |
valueFrom |
标签值,标签值可以有多个,优先级取自然顺序,当获取不到第一个时,才会尝试获取第二个,以此类推 |
当前CSM服务网格支持从请求头部或者工作负载本身的标签中取值作为流量的标签;同时还支持在调用链中透传流量标签信息,用于实现全链路的标签路由策略。该流量标签yaml的例子中定义了两个标签,userdefinelabel1取当前pod的CSM_TRAFFIC_TAG标签值添加到请求的头部里面,userdefinelabel2优先从请求的x-traffic-tag头部取值,同时使用Envoy生成的x-request-id作为上下文key,在整个调用链路中透传该标签;如果打标失败了,会按照valueFrom数组中下一个定义继续取值,取到第一个非空值时停止。
流量标签的使用示例
本文中给出流量标签的使用实例,包括三种打标函数的使用:
函数 |
说明 |
getInboundRequestHeaderWithContext(headerName, contextKey) |
从Inbound方向的请求header取值,同时从contextKey头部取值作为流量标签在上下文透传的key,该头部可以用于实现链路追踪上下文透传的头部,比如x-request-id、x-b3-traceid或者您的业务中使用的自定义头部;该函数只适用于sidecar |
getOutboundRequestHeader(headerName) |
从outbound方向的请求头部取值,只适用于sidecar |
getLabel(labelName) |
从pod的标签取值;适用于istio ingress网关和sidecar |
具体使用方法:
Step1: CCSE集群创建命名空间traffic-tag(命名空间打上标签istio-injection: enabled),命名空间中创建无状态应用app1-base和app2-base(外部请求app-base1时,流量会从app-base1流入app2-base),应用中添加pod标签CSM_TRAFFIC_TAG:base
Step2:为应用app1-base和app2-base添加ClusterIp类型TCP服务
Step3: 服务网格中创建流量标签,流量打标函数使用 $getLabel(CSM_TRAFFIC_TAG)
Step4: CCSE节点上访问应用app1-base对应服务, 查看应用app2 pod日志, 则app2应用日志中带有流量标签[userdefinelabel1]=>[[base]]
Step5: 将流量打标函数修改为getInboundRequestHeaderWithContext(x-csm-traffic-tag, trace-ctx-id)
Step6: CCSE节点上访问应用app1-base对应服务, 请求中加上header,查看应用app1-base和app2-base的 pod日志, app1-base 和app2-base中带流量标签
Step7: 将流量打标函数修改为getOutboundRequestHeader(trace-ctx-id)
Step8:CCSE节点上访问应用app1-base对应服务, 请求中加上header,查看应用app1-base和app2-base的 pod日志, app1-base 和app2-base中带流量标签
本文介绍了流量标签的三种打标函数的基本使用方法,可作为流量标签的入门使用参考,服务网格下个版本会支持适用于istio ingress网关的打标函数,后面再做说明。