本文主要介紹如何使用類似kubectl logs -tail這類專業(yè)的工具實時查看應用日志,從而方便地了解開發(fā)過程中系統(tǒng)的運行情況鼻百,以及在為實際生產(chǎn)環(huán)境的k8s選擇解決方案時需要考慮哪些問題孵构。
無論你使用基于kubernetes的系統(tǒng)有多長時間橘券,在你定位問題的工具包中一定存在:日志消息党远。
在開發(fā)過程中,使用kubectl logs -tail命令等工具實時查看日志輸出营勤,可以方便地了解系統(tǒng)中正在發(fā)生的事情灵嫌。
然而,當你將容器部署到生產(chǎn)環(huán)境中時葛作,維護這種級別的可觀察性可能會成為一個負擔寿羞,因為你試圖管理和分析來自多個pod中執(zhí)行的多個容器化應用程序的大量消息。在現(xiàn)代云原生環(huán)境中进鸠。必須收集稠曼、理解和研究不同來源的數(shù)百萬條日志,才能理解應用程序運行時發(fā)生的事情客年。
傳統(tǒng)日志解決方案根本無法跟上現(xiàn)代產(chǎn)品環(huán)境中復雜的分布式基礎設施特點霞幅,因此找到一個簡單而高效的解決方案來幫助你管理這種復雜性,是你進行k8s日志管理工作的關鍵量瓜。
走進Loki
你肯定聽說過Grafana司恳,這家公司憑借開源軟件而聞名,其開源的軟件可以輕松地可視化來自許多不同來源的數(shù)據(jù)绍傲。在k8s世界中扔傅,Grafana最著名的可能是監(jiān)控指標可視化組件Prometheus。
但事情正在發(fā)生變化烫饼,最近猎塞,Grafana已經(jīng)發(fā)展成為一個成熟的可觀測性軟件供應商,開發(fā)了新的項目杠纵,如Loki荠耽、Mimir和Tempo,解決了日志比藻、鏈路追蹤和指標等重要的可觀測性需求铝量。
Loki項目結合云原生架構,專注于管理分布式银亲、高容量慢叨、高速增長的日志數(shù)據(jù),其靈感來自Prometheus(事實上务蝠,Loki宣傳自己“像Prometheus拍谐,但只針對日志”)。具備很多優(yōu)勢,非常適合現(xiàn)代環(huán)境的日志管理赠尾。
它易于設置和操作力穗,只索引元數(shù)據(jù),而不是完整的日志消息气嫁,使其輕量化,它與其他云原生工具(如Kubernetes)一起工作得很好够坐,使用常見的對象存儲解決方案寸宵,如Amazon S3。
Loki既可以使用自管理的開源版本元咙,也可以用由Grafana云提供的托管服務梯影,它是構成所謂的“PLG”技術棧的基礎:Promtail用于日志流采集,Loki用于聚合庶香、存儲和查詢日志甲棍,Grafana用于日志可視化。
再見ELK赶掖,你好PLG
看下PLG技術棧感猛,很容易看出來它的確受到Prometheus設計的影響。
Promtail是一個代理(作為Loki產(chǎn)品的一部分提供)奢赂,負責發(fā)現(xiàn)和檢索日志數(shù)據(jù)流陪白。它的功能類似于Prometheus的“scraper”,其配置文件在語法上與Prometheus使用的配置文件相同膳灶。本質上是“跟蹤”Kubernetes主節(jié)點和pod日志文件咱士,并將它們轉發(fā)到Loki的核心系統(tǒng)。(值得注意的是轧钓,Loki支持由Grafana及其社區(qū)開發(fā)者提供的許多不同的代理序厉,使用fluentd或logstash等的用戶更容易遷移到基于PLG的解決方案。)
Loki當然是PLG方案的核心毕箍,是專門為處理日志數(shù)據(jù)而設計的弛房。Loki的特性(我們將在后面更詳細地討論)使它在獲取和查詢日志數(shù)據(jù)時既高效又經(jīng)濟。
Grafana儀表板和可視化工具完善了“PLG”套件霉晕,提供了強大的功能來分析應用程序庭再、pod和集群日志。
Loki工作原理
架構和部署方式
從架構上看牺堰,洛基由五個不同的組件組成:
- distributor:是負責獲取日志數(shù)據(jù)并將其轉發(fā)給ingester的無狀態(tài)組件拄轻。Distributor對數(shù)據(jù)進行預處理,檢查其有效性伟葫,并確保其來自已配置的租戶恨搓,這有助于系統(tǒng)擴展并保護其免受潛在的Dos攻擊。這里Grafana很好地解釋了Promtail(推薦的分發(fā)代理)如何處理數(shù)據(jù)。
- ingester:是Loki架構的關鍵組件斧抱。從distributors接收到的數(shù)據(jù)由ingester寫入云云原生存儲服務常拓。ingesters還與查詢協(xié)作,返回內存中的數(shù)據(jù)以響應讀請求辉浦。
- Queriers:負責解析LogQL查詢請求弄抬,并從ingesters或持久化存儲中獲取數(shù)據(jù)。
-
query fronted:可選組件-提供API接口宪郊,可用于加速讀處理掂恕。該組件通過將讀請求排隊、將大請求拆分為多個小請求以及緩存數(shù)據(jù)來優(yōu)化讀處理弛槐。
類似Prometheus懊亡,Loki支持告警和記錄功能。這些特性是在ruler組件中實現(xiàn)的乎串,該組件持續(xù)地計算一組查詢店枣,并根據(jù)結果執(zhí)行已定義的操作,例如發(fā)送告警或預計算指標。
對于可伸縮性,所有這些組件都可以按需跨系統(tǒng)分布夯膀。
Loki可以選擇兩種本地部署方式: - 單體模式:在一個進程或Docker容器中運行Loki的所有二進制文件滥搭。這是了解產(chǎn)品更多信息的一個很好的開始。
- 微服務部署模式:它允許Loki組件分布在多個系統(tǒng)中,并提供了高可伸縮性。
另外一種本地部署模式,稱為“簡單可伸縮”模式逾柿,當你的需求超過單體模式的能力,但不需要大規(guī)模的微服務部署時宅此,這是一個很好的中間步驟机错。當然,如果你根本不想管理Loki父腕,那么可以考慮Grafana云服務弱匪。
重要特性
Loki實現(xiàn)了一些令人驚嘆的特性,這些特性專門用于分配負載璧亮、保護系統(tǒng)不受攻擊萧诫,并利用有效的存儲機制。
Labels(標簽)
和許多日志處理系統(tǒng)不同枝嘶,Loki不對日志數(shù)據(jù)執(zhí)行全文索引帘饶。相反,它利用了從Prometheus中借來的概念—標簽—從日志數(shù)據(jù)中提取和標記信息群扶,然后僅對標簽本身進行索引及刻。這極大地提高了寫和讀路徑上的性能镀裤,并且—在我們看來同樣有價值—不管輸入源是什么,都能實現(xiàn)一致的標簽分類缴饭。
由于這是Loki的一個重要優(yōu)點暑劝,讓我們深入研究Loki文檔中的一個示例。假設你有一個Loki的“scrape配置”颗搂,如下圖所示:
這個配置的標簽部分特別重要担猛。在本節(jié)中path變量定義了要讀取的日志文件,關鍵字job定義了要查找的標簽和用于過濾日志的值丢氢。使用此配置毁习,Loki分發(fā)器將“跟蹤”日志文件,在每個記錄中查找一個名為job的變量卖丸,該變量的值為syslog,然后創(chuàng)建包含此關鍵字和值的Loki記錄“流”盏道。最后將job標簽的索引以及包含標簽和值的數(shù)據(jù)塊寫入持久化存儲稍浆。
這個記錄流可以使用簡單的LogQL查詢查詢: {job="syslog"}。
在處理查詢時猜嘱,Loki查詢器組件將找到指向job標簽為syslog記錄的索引衅枫,然后檢索這些記錄。
云原生后端存儲
由于原始日志數(shù)據(jù)本身沒有索引朗伶,Loki可以通過利用云原生對象存儲服務(如Amazon S3弦撩、Amazon DynamoDB或Cassandra)作為后端數(shù)據(jù)存儲庫來提高系統(tǒng)的成本。為了改進查詢處理论皆,Loki使用云服務將數(shù)據(jù)存儲為“塊”(原始日志數(shù)據(jù))和“索引”(規(guī)范化和索引標簽以及從日志記錄中提取的數(shù)據(jù))益楼。查詢器使用更有效的索引來查找請求的分塊日志數(shù)據(jù)。
LogQL
Loki實現(xiàn)了一種名為LogQL的日志查詢語言点晴,它大量借鑒了Prometheus的PromQL語言感凤。LogQL既可以直接使用,也可以通過Grafana前端儀表板使用粒督。為日志和指標提供一致的查詢語言可以簡化學習曲線陪竿,并促進動態(tài)過濾和轉換。
在k8s集群中部署PLG技術棧
Loki有幾種安裝機制:Tanka(Grafana自己的云部署)屠橄,Helm charts用于“簡單可伸縮”的微服務部署族跛,使用Docker / Docker Compose機制,以及可下載的二進制文件锐墙。如果需要礁哄,你還可以從Github存儲庫下載Loki源代碼,并在本地編譯贮匕。Grafana在這里為每種安裝方法提供了說明姐仅。
Loki: 是一個更好的k8s日志管理解決方案
跟蹤Kubernetes應用程序、pod和集群日志文件是一種非常有用的技術,可以近乎實時地跟蹤容器化應用程序的運行情況掏膏。Grafana的Loki產(chǎn)品將其提升到一個新的水平劳翰,其功能受到流行的Prometheus指標系統(tǒng)的啟發(fā),甚至是在高度復雜的環(huán)境也易于擴展馒疹,以及一些增強性功能佳簸,使日志文件的處理比以往任何時候都簡單。如果你正在尋找更好的Kubernetes日志管理解決方案颖变,Loki絕對值得一試生均。