Linkerd 2-10-Step by Step-—使用 Linkerd 進行分佈式跟蹤

Linkerd 2.10 系列


Linkerd 2.10 中文手冊持續修正更新中:

在實踐中使用分佈式跟蹤可能很複雜, 爲了從高層次解釋您得到了什麼以及它是如何完成的, 我們整理了一個 list of myths。

本指南將引導您完成 emojivoto 的配置和啓用跟蹤。關於使用 Linkerd 使用分佈式跟蹤的最佳方式的一些建議,請跳到最後。

要使用分佈式跟蹤,您需要:

在 emojivoto 的情況下,一旦所有這些步驟都完成,就會有一個看起來像這樣的拓撲:

先決條件


安裝 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 使用,只要它:

如果使用 helm 安裝 ingress-nginx,您可以使用以下命令配置跟蹤:

controller:
  config:
    enable-opentracing: "true"
    zipkin-collector-host: linkerd-collector.linkerd

客戶端庫

雖然服務可以手動傳播跟蹤傳播標頭,但使用執行以下三件事的庫通常要容易得多:

我們建議在您的服務中使用 OpenCensus 並配置它:

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

如果您的應用程序注入了 LinkerdLinkerd 代理將參與跟蹤並將跟蹤數據發送到 OpenCensus 收集器。這豐富了跟蹤數據,並允許您準確查看請求在代理和線路上花費的時間。

雖然 Linkerd 只能主動參與使用 b3 傳播格式的 trace, 但 Linkerd 將始終透明地轉發未知的請求頭, 這意味着它永遠不會干擾使用其他傳播格式的 trace

我是爲少
微信:uuhells123
公衆號:黑客下午茶
加我微信(互相學習交流),關注公衆號(獲取更多學習資料~)
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/0s-hla_G4E0fELHhpWlNcA