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