专栏首页伪架构师(译)在 Istio 中使用 Opentracing Baggage 进行传播和路由

(译)在 Istio 中使用 Opentracing Baggage 进行传播和路由

现代服务网格架构提供了很多的新功能,基础设施相关的依赖部分被逐步从代码中移除,极大的降低了编码工作量。除此之外,这一架构的智能路由功能还把金丝雀发布以及类似功能大大的简化了。

接下来的内容会探讨一下,Istio 路由规则是如何使用 Opentracing Baggage 的。

想像一个场景,这个场景中我们需要通过 User-Agent Header 来鉴别 Safari 用户,并把它们重定向到服务的一个特定版本去。这是一个典型的金丝雀场景:新版本发布时,首先开放给一部分用户。然而很明显只有第一个服务能够接收到 User-Agent 头,如果路由规则中涉及到调用关系图中位置较低(靠后)的服务,就不得不把这个 Header 信息传播给所有途中经过的服务。这是一个分布式上下文传播的典型用例,很多跟踪系统都有这个功能。我们接下来会看看 Jaeger 的 OpenTracing 实现。

Baggage 条目是字符串组成的键值对,和 Span/SpanContext 互相关联,在一个 Trace 的范围内,会在所有的下游 Span 中进行传播。

如果你的网格中使用的是 OpenTracing,那么就已经有这个功能了;如果不是,那就有点不幸了:需要通过其他的 跟踪 Header 来传递 User-Agent 值了,这样就需要修途经的所有服务。

Istio 缺省使用的 B3 传播是没有提供 Baggage 头的。但是可以用 Brave(Zipkin 的 Java 客户端)来配置 Baggage 支持。一般会使用 baggage-key:value 的格式。Jaeger 实现了一个 B3 解码器,也用同样的格式来处理 Baggage。可以在这里查看 B3 Baggage 实现的进度。

Demo

可以在当前的活动 Span 中这样设置 Baggage:

tracer.activeSpan().setBaggageItem(“user-agent”, userAgent);

这必须在第一个服务中完成。最后一个需要完成的任务就是定义一个识别 Baggage Header 的路由。下面的路由定义会查看请求是否包含了带有 user-agent:Safari 条目的 Baggage,如果有,就进行转发:

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
name: recommendation-safari
spec:
destination:
namespace: tutorial
name: recommendation
precedence: 2
match:
request:
headers:
baggage-user-agent:
regex: ".*Safari.*"  
route:
- labels:
version: v2

如果是新版本的 Istio(0.8.0 以后):

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: recommendation-safari
spec:
hosts:
- recommendation
http:
- match:
- headers:
baggage-user-agent:
regex: ".*Safari.*"
route:
- destination:
host: recommendation
subset: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: recommendation-destination
spec:
host: recommendation
subsets:
- name: v2
labels:
version: v2

现在所有的配置都已经完成,Safari 用户会被重定向到推荐的 v2 服务。

相关链接

  • OpenTracing:http://opentracing.io/
  • OpenTracing baggage 规范:https://github.com/opentracing/specification/blob/master/specification.md#set-a-baggage-item
  • Jaeger 客户端的 B3 Baggage 支持:https://github.com/jaegertracing/jaeger/issues/755#issuecomment-393929718
  • OpenShift 的 Istio 教程:https://github.com/redhat-developer-demos/istio-tutorial
  • Kiali: https://kiali.org/

本文分享自微信公众号 - 伪架构师(fake-architect)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用 Gitlab 的镜像仓库

    Kubernetes 已经是事实标准,很多应用都会以容器镜像作为交付物。Gitlab 自然是不甘人后,也集成了容器镜像仓库的功能。

    崔秀龙
  • 在 Linkerd2 中进行流量拆分

    安装最新版本之后,可以看到这个流量拆分功能所使用的 API 资源并非来自 Linkerd,而是 SMI 规范的一部分。

    崔秀龙
  • (译)Kubernetes 存活检测的危险性

    Kubernetes 的 livenessProbe 是有一定危险性的。建议在用例清晰,并且理解足够深刻的情况下才使用这个功能。本文会涉及到存活检测以及就绪检测...

    崔秀龙
  • 大数据革新银行按揭贷款业务

    Tomes撰写了一篇关于2008年金融危机的文章(全球金融危机 - 在金融界如此称呼)。无论是什么样的金融工具机制导致了金融崩溃 - 每个人都普遍同意的一点是,...

    eru
  • spark 将DataFrame所有的列类型改为double

    转载请务必注明原创地址为:http://dongkelun.com/2018/04/27/dfChangeAllColDatatypes/

    董可伦
  • caffe学习笔记2-caffe命令行训练与测试

    Train训练(用cmdcaffe命令行) (solver.prototxt) 在使用cmdcaffe时,需要默认切换到Caffe_Root文件夹下,需要...

    用户1148525
  • df 和 ls 命令执行夯主

    其实他说第二点问题的时候我就已经猜到问题所在了,那不就是远程挂载的磁盘非正常的掉了,然后就会造成这个问题。但是他说 ISCSI 这个玩意的时候我不知道是啥,于是...

    张琳兮
  • Linux 命令(137)—— strace 命令

    strace 命令是一个集诊断、调试、统计于一体的工具,我们可以使用 strace 对程序的系统调用和信号传递的跟踪结果来对程序进行分析,以达到解决问题或者是了...

    Dabelv
  • AI情绪识别技术背后:一场悄然来袭的“暴政”

    不可否认,情绪检测的技术在AI时代不断飞速发展。然而,这些情绪监控技术都基于了一种过时的科学概念:所有人都有同样的六种基本情感。

    大数据文摘
  • 为什么要给运营商员工多发年终奖?

    紧张而有序的2014年就要结束,新的一年即将开始,在圆满完成各级“大神”下达的KPI任务之后,小伙伴们每到这个时候,就寻思着....今年的年终奖到底发不发呢,能...

    用户1756920

扫码关注云+社区

领取腾讯云代金券