一文教你如何在生产环境中在Kubernetes上部署Jaeger
作者 |? Dotan Horovit
翻譯 | 火火醬~
責編 | 晉兆雨
出品 |?CSDN云計算
日志、指標和跟蹤是“可觀察性”領域的三大支柱。最近幾個月,隨著OpenTelemetry標準化以及Jaeger開源項目從CNCF孵化項目中順利畢業,分布式跟蹤領域出現了很多創新。
根據DevOps Pulse最近的報告可知,在實施分布式跟蹤時,有超過30%的人會選擇使用Jaeger。許多公司都已經認識到:要想使系統獲得更好的可觀察性并解決各類性能問題(特別是在處理復雜的微服務體系結構時),實施分布式跟蹤是非常有必要的。
就Jaeger而言,首先要檢測你的代碼,將跟蹤發送給Jaeger。然后設置Jaeger后端來收集、處理并可視化追蹤。在本文中,我將介紹如何在生產環境中部署和管理Jaeger后端,內容主要涵蓋:
Jaeger安裝組件
Jaeger使用的非Jaeger組件,例如后端存儲
Jaeger Deployment部署策略, 特別是圍繞生產系統的部署策略
代理(Agent)vs. 無代理(Agentless)
agent安裝方法:sidecar vs. DaemonSet
安裝工具:Manual、Operator、Helm chart
Jaeger 組件
在部署Jaeger Tracing時,我們需要用到以下組件:
代理(Agent)組件與應用程序處于同一位置,用于在本地收集Jaeger跟蹤數據。它負責Collector(見下文)的連接和流量控制以及數據豐富工作。
收集器(Collector)是一個集中式集線器,從agent那收集跟蹤信息,并發送到后端進行存儲。collector可以在span上進行驗證和豐富。
查詢(Query)檢索跟蹤并通過UI進行展示
當然,以上每個組件展開來講的話都要講上幾天幾夜,而且也有其他的Jaeger組件可供選擇,但為了便于討論,我們就不展開介紹了。在下文中,我們將深入了解一下如何在各種設置和策略中部署Agent、Collector和Query組件。
Jaeger使用的外部組件
根據部署策略的不同(詳見下文),Jaeger可能會用到其他(非Jaeger)組件,主要是持久化后端存儲(Elasticsearch、Cassandra或其他)和流式傳輸隊列(Kafka)。這些服務通常都是獨立部署的,你只需將Jaeger指向相關的端點即可,不過也可以讓Jaeger自行提供這些服務。
部署策略
如果你想將Jaeger部署在多個不同的系統上(例如自己用于開發的筆記本電腦或者大規模和高負載生產環境)的話,這里有一些可供選擇的部署策略:
jaegertracing All-in-One:該設置易于部署,非常適合試用產品、開發和演示使用。你可以將其作為預打包的二進制文件或Docker鏡像運行。它所有服務與內存存儲都被打包并部署在一個副本中。
Production:專注于高可用性和可擴展性的生產環境需求。所有后端服務都進行獨立部署,并支持多個副本和擴展選項。它還使用持久化后端存儲來保持跟蹤數據的彈性。目前它支持Elasticsearch和Cassandra存儲解決方案,并將Elasticsearch作為生產環境的推薦解決方案。
Streaming:對于高負載環境而言,這種設置可以將Kafka添加到生產部署策略中,從而減輕后端存儲的壓力。如果你需要在跟蹤上運行后處理邏輯的話,它在寫入存儲之前便可以輕松執行。
該一體式設置很容易上手,并且附帶了捆綁包。如果你想試用一下的話,可以參閱下方教程,了解如何將其與Elasticsearch后端以及Kibana結合使用。
(教程鏈接:
https://logz.io/blog/jaeger-and-the-elk-stack/?ref=hackernoon.com)
接下來,我將重點介紹生產環境的部署,以及在這個過程中需要考慮的事情和選擇。
Jaeger可以在無代理(agentless)情況下運行嗎?
agent需要駐留在應用程序的實例中。如果你運行著復雜的微服務架構,需要多個agent的話,或許會想了解Jaeger是否可以在無代理的情況下運行。
簡而言之:不要這樣做。
從技術上展開來講,我們確實可以讓Jaeger客戶端庫直接將span數據發送到Collector,但是這需要我們自己來處理各方面的問題,如collector的查找、流量控制、以及根據本地系統信息用附加元數據標記span。
雖然推薦使用Jaeger Agent進行部署,但在某些情況下是不能部署agent的。例如,如果你的應用程序以AWS lambda函數或類似的無服務器框架方式運行,無法控制pod部署和agent共存的話,就不能部署agent。如果使用Zipkin的話,agent也是無效的。在這種情況下,應該將span直接提交給Jaeger Collector。
Jaeger?Agent?安裝方法
agent需要與應用程序放在一起,這樣Jaeger客戶端庫便可以在localhost上對其進行訪問,并通過UDP向它發送數據,而不必承擔因網絡中斷而導致數據丟失的風險(與TCP不同,UDP傳輸協議中不包含數據丟失保護,但也因此更快、更經濟)。
要在Kubernetes環境中實現這一點可以采取兩種方法:sidecar或daemonset。下面我們一個個來看:
DaemonSet
以DeamonSet方式來安裝agent是最簡單,也是最經濟的選擇。該方法會在節點上提供一個Agent實例,為該節點上的所有pods提供服務。
但是,對于涉及多租戶、安全隔離需求或針對不同應用程序的多個Jaeger實例的生產環境來說,這種策略可能過于簡單。在這種情況下,你可以考慮以Sidecar模式進行部署。
Sidecar
這種方法是將agent作為各個pod的附加容器運行。此設置可以支持多租戶環境,其中每個租戶都有各自的Jaeger Collector,并且可以配置agent將其發送到相關的Collector。
你還可以對內存分配進行調控,防止特定租戶占用內存。在同一個pod中運行時,安全性配置則更簡單。sidecar方法自帶額外容器。一些安裝工具可以自動注入agent sidecar并簡化管理。
Jaeger安裝工具
既然我們已經了解了需要部署的組件以及策略,那下面就來看一下有哪些工具可以幫助我們將計劃付諸實踐吧:
手動使用kubectl:如果你想快速入門,又不想為自動化而煩惱的話,這應該很適合你。但對于生產部署來說,還是不太建議這樣做。這是Jaeger社區推薦的官方方式,下方鏈接中提供了完善的YAML模板。然而,它已于2020年5月被棄用。手動執行的另一選擇是使用Jaeger Operator生成靜態清單文件:運行Jaeger Operator generate生成YAML,然后運行kubectl apply將其手動應用到你的環境中。該功能目前尚處于實驗階段,因此使用時需要十分謹慎。
(鏈接:
https://github.com/jaegertracing/jaeger-kubernetes?ref=hackernoon.com)
Kubernetes Operator:Jaeger Operator讓Kubernetes實現了熱門的Operator模式,因此你可以讓指定的Controller作為自定義資源管理Jaeger后端。它將默認部署Jaeger Agent為sidecar。如果你在集群中運行控制器的話,Jaeger Operator還可以自動注入Jaeger Agent sidecar,省去了手動定義的麻煩。你還可以將agent策略設置為DaemonSet。需要注意的是,Jaeger Operator在使用基于gRPC插件的外部持久化存儲時的表現似乎差強人意。如果你屬于此類情況的話,或許可以試一試Helm。更多詳細信息請參閱下方Jaeger Operator repo鏈接。
(Jaeger Operator repo:
https://github.com/jaegertracing/jaeger-operator?ref=hackernoon.com)
Helm Chart:它具備完整程序包管理器的優點,如果你使用Helm來管理生產環境中的其他應用程序(如Jaeger使用的持久化存儲)的話,那么它將是你不二之選。你可以在下方鏈接中找到官方的Jaeger圖表,但需要注意它仍然是測試版。它將默認以DaemonSet方式來安裝Jaeger Agent。此外,你也可以使用Helm來安裝Jaeger Operator。
(鏈接:
https://github.com/jaegertracing/helm-charts?ref=hackernoon.com)
用Jaeger tracing接收Zipkin?Trace
至此,我們一直都在討論Jaeger span。但其實有很多系統使用的都是Zipkin instrumentation,因此需要注意,Jaeger同樣也接受Zipkin格式的span,即Thrift、JSON v1/v2和Protobuf。
如果你Jaeger后端部署的目的是接收Zipkin協議的話:
Jaeger Agent與收集Zipkin span無關。
你的Zipkin instrumentation 應該直接將Zipkin span發送給Jaeger Collector。Zipkin span可以通過POST請求提交到以下RESTful端點:
/api/v1/spans?for?Zipkin?JSON?v1?或?Zipkin?Thrift /api/v2/spans?for?Zipkin?JSON?v2將Jaeger Collector配置為在指定的HTTP端口上接收Zipkin span,標志是–collector.zipkin.http-port=9411(Zipkin collector使用9411端口)。
結語
Jaeger是Kubernetes領域中的新項目,強大的社區為Kubernetes部署提供了最佳的實踐和自動化。但是,作為一個年輕項目,它在生產環境中的使用和效果仍在不斷優化完善。我們在應用時,要緊跟社區更新,并且多方考量,找到最適合自己需求的運行方式。
原文鏈接:https://hackernoon.com/a-guide-to-deploying-jaeger-on-kubernetes-in-production-0p2n3tub
本文由CSDN云計算翻譯,轉載請注明出處
更多閱讀推薦
如何在SQL Server 2019中添加數據敏感度分類的命令
深度揭秘:騰訊存儲技術發展史
荷蘭政府用大數據預測天氣預防自然災害,他們是怎么做的?
有了圖分析,可解釋的AI還遠嗎?
互聯網人的求生戰役!分享身邊的 5 個故事
總結
以上是生活随笔為你收集整理的一文教你如何在生产环境中在Kubernetes上部署Jaeger的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通俗的讲,这就是容器CPU隔离的底层实现
- 下一篇: 梁胜:开源是最好的商业模式