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