Linkerd 2.10(Step by Step)之使用 Linkerd 進行分布式跟蹤
Linkerd 2.10 中文手冊持續修正更新中:
https://linkerd.hacker-linner.com
在實踐中使用分布式跟蹤可能很復雜, 為了從高層次解釋您得到了什么以及它是如何完成的, 我們整理了一個list of myths。
本指南將引導您完成 emojivoto 的配置和啟用跟蹤。關于使用 Linkerd 使用分布式跟蹤的最佳方式的一些建議,請跳到最后。
要使用分布式跟蹤,您需要:
- 安裝 Linkerd-Jaeger 擴展。
- 修改您的應用程序以發出跨度。
在 emojivoto 的情況下,一旦所有這些步驟都完成,就會有一個看起來像這樣的拓撲:
先決條件
- 要使用本指南,您需要在集群上安裝 Linkerd。如果您還沒有這樣做,請按照安裝 Linkerd 指南進行操作。
安裝 Linkerd-Jaeger 擴展
獲取分布式跟蹤設置的第一步是將 Linkerd-Jaeger 擴展安裝到您的集群上。這個擴展由一個收集器(collector)、一個 Jaeger 后端和一個 Jaeger-injector 組成。收集器消耗從網格和您的應用程序發出的跨度, 并將它們發送到 Jaeger 后端,后者存儲它們并提供儀表板以查看它們。Jaeger-injector 負責配置 Linkerd 代理以發出 span。
要安裝 Linkerd-Jaeger 擴展,請運行以下命令:
- linkerd jaeger install | kubectl apply -f -
您可以通過運行以下命令來驗證 Linkerd-Jaeger 擴展是否已正確安裝:
- linkerd jaeger check
安裝 Emojivoto
將 emojivoto 添加到您的集群并使用 Linkerd 代理注入它:
- linkerd inject https://run.linkerd.io/emojivoto.yml | kubectl apply -f -
在進入下一步之前,請確保一切都已啟動并使用 kubectl 運行以下命令:
- kubectl -n emojivoto rollout status deploy/web
修改應用
與服務網格的大多數功能不同,分布式跟蹤需要修改應用程序的源。跟蹤需要某種方式將傳入的請求與您的應用程序與傳出的請求綁定到相關服務。為此,將向每個請求添加一些標頭,其中包含跟蹤的唯一 ID。Linkerd 使用 b3 propagation 傳播格式將這些東西聯系在一起。
我們已經修改了 emojivoto 以使用此信息檢測其請求,此 commit 顯示了這是如何完成的。對于大多數編程語言,它只需要添加一個客戶端庫來處理這個問題。Emojivoto 使用 OpenCensus 客戶端,但也可以使用其他客戶端。
要在 emojivoto 中啟用跟蹤,請運行:
- kubectl -n emojivoto set env --all deploy OC_AGENT_HOST=collector.linkerd-jaeger:55678
此命令將添加一個環境變量,使應用程序能夠傳播上下文并發出跨度。
探索 Jaeger
隨著 vote-bot 開始跟蹤每個請求,跨度現在應該出現在 Jaeger。要進入 UI,運行:
- linkerd jaeger dashboard
您可以在下拉列表中搜索任何服務,然后單擊 Find Traces。vote-bot 是一個很好的入門方式。
單擊特定跟蹤將提供所有詳細信息,您將能夠看到每個代理的跨度!
該輸出中肯定有很多 linkerd-proxy 跨度。在內部,代理具有服務器端和客戶端。當請求通過代理時,由服務器接收,然后由客戶端發出。對于在兩個網狀 Pod 之間傳遞的單個請求,總共會有 4 個跨度。當請求遍歷該代理時,兩個將在源端,當遠程代理接收到請求時,兩個將在目標端。
此外,由于代理添加了應用元數據作為跟蹤屬性,用戶可以通過單擊度量表中的 Jaeger 圖標, 直接從 linkerd-web 儀表板直接跳轉到相關資源跟蹤,如下所示
清理
要進行清理,請通過運行以下命令卸載 Linkerd-Jaeger 擴展和 emojivoto:
- linkerd jaeger uninstall | kubectl delete -f -
- kubectl delete ns emojivoto
帶上你自己的 Jaeger
如果您有一個現有的 Jaeger 安裝, 您可以配置 OpenCensus 收集器向它發送跟蹤, 而不是 Linkerd-Jaeger 擴展中內置的 Jaeger 實例。
- linkerd jaeger install --set collector.jaegerAddr='http://my-jaeger-collector.my-jaeger-ns:14268/api/traces' | kubectl apply -f -
也可以手動編輯 OpenCensus 配置以將其導出到它支持的任何后端。有關完整列表,請參閱 OpenCensus 文檔。
故障排除
我沒有看到代理的任何跨度
Linkerd 代理使用 b3 propagation 傳播格式。一些客戶端庫,例如 Jaeger,默認使用不同的格式。您需要將客戶端庫配置為使用 b3 格式讓代理參與跟蹤。
建議
Ingress
ingress 是分布式跟蹤的一個特別重要的組件,因為它創建每個跟蹤的根跨度, 并負責決定是否應該對該跟蹤進行采樣。讓 ingress 做出所有采樣決策可確保對整個軌跡進行采樣或不采樣, 并避免創建“部分軌跡(partial traces)”。
分布式跟蹤系統都依賴于服務來傳播有關從接收到的請求到發送的請求的當前跟蹤的元數據。這一元數據稱為跟蹤上下文,通常編碼在一個或多個請求標頭中。有許多不同的跟蹤上下文標頭格式,雖然我們希望生態系統最終會收斂于像 W3C tracecontext 跟蹤上下文這樣的開放標準, 但我們今天只使用 b3 format。作為最早廣泛使用的格式之一,它具有最廣泛的支持,尤其是在 Nginx 等入口中。
此參考架構包括一個簡單的 Nginx 配置,該配置對 50% 的跟蹤進行采樣并將跟蹤數據發送到 收集器(使用 Zipkin 協議)。任何入口控制器都可以在這里代替 Nginx 使用,只要它:
- 支持概率采樣
- 以 b3 格式編碼跟蹤上下文
- 在 OpenCensus 收集器支持的協議中發出 span
如果使用 helm 安裝 ingress-nginx,您可以使用以下命令配置跟蹤:
- controller:
- config:
- enable-opentracing: "true"
- zipkin-collector-host: linkerd-collector.linkerd
客戶端庫
雖然服務可以手動傳播跟蹤傳播標頭,但使用執行以下三件事的庫通常要容易得多:
- 將跟蹤上下文從傳入請求頭傳播到傳出請求頭
- 修改跟蹤上下文(即開始一個新的跨度)
- 將此數據傳輸到跟蹤收集器
我們建議在您的服務中使用 OpenCensus 并配置它:
- b3 propagation (這是默認設置)
- the OpenCensus agent exporter
OpenCensus agent exporter 將通過 gRPC API 將跟蹤數據導出到 OpenCensus 收集器。如何配置 OpenCensus 的詳細信息會因語言而異,但有許多流行語言的指南。您還可以使用我們的示例應用程序 Emojivoto 在 Go 中查看端到端示例。
您可能會注意到 OpenCensus 項目處于維護模式并將成為 OpenTelemetry 的一部分。不幸的是,OpenTelemetry 尚未準備好投入生產,因此 OpenCensus 仍然是我們目前的建議。
也可以使用許多其他跟蹤客戶端庫。只需確保正在使用 b3 傳播格式, 并且客戶端庫可以以收集器已配置為接收的格式導出其跨度。
收集器: OpenCensus
OpenCensus collector 從 OpenCensus agent exporter 接收跟蹤數據, 并可能在將該數據發送到 Jaeger 之前進行轉換和過濾。將 OpenCensus exporter 發送到 OpenCensus collector 為我們提供了很大的靈活性:我們可以切換到 OpenCensus 支持的任何后端,而無需中斷應用程序。
后端: Jaeger
Jaeger 是使用最廣泛的跟蹤后端之一,并且有充分的理由:它易于使用并且在可視化跟蹤方面做得很好。但是,可以改用 OpenCensus 支持的任何后端。
Linkerd
如果您的應用程序注入了 Linkerd,Linkerd 代理將參與跟蹤并將跟蹤數據發送到 OpenCensus 收集器。這豐富了跟蹤數據,并允許您準確查看請求在代理和線路上花費的時間。
雖然 Linkerd 只能主動參與使用 b3 傳播格式的trace, 但 Linkerd 將始終透明地轉發未知的請求頭, 這意味著它永遠不會干擾使用其他傳播格式的 trace。