(譯)在 Istio 中使用 Opentracing Baggage 進行傳播和路由

現代服務網格架構提供了不少的新功能,基礎設施相關的依賴部分被逐步從代碼中移除,極大的下降了編碼工做量。除此以外,這一架構的智能路由功能還把金絲雀發佈以及相似功能大大的簡化了。git

接下來的內容會探討一下,Istio 路由規則是如何使用 Opentracing Baggage 的。github

想像一個場景,這個場景中咱們須要經過 User-Agent Header 來鑑別 Safari 用戶,並把它們重定向到服務的一個特定版本去。這是一個典型的金絲雀場景:新版本發佈時,首先開放給一部分用戶。然而很明顯只有第一個服務可以接收到 User-Agent 頭,若是路由規則中涉及到調用關係圖中位置較低(靠後)的服務,就不得不把這個 Header 信息傳播給全部途中通過的服務。這是一個分佈式上下文傳播的典型用例,不少跟蹤系統都有這個功能。咱們接下來會看看 Jaeger 的 OpenTracing 實現。api

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);url

這必須在第一個服務中完成。最後一個須要完成的任務就是定義一個識別 Baggage Header 的路由。下面的路由定義會查看請求是否包含了帶有 user-agent:Safari 條目的 Baggage,若是有,就進行轉發:spa

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 之後):.net

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 服務。

相關連接

  • OpenTracinghttp://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)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索