十分鐘在K8s中部署輕量級(jí)日志系統(tǒng)Loki
Loki 是什么?
Loki是由Grafana Labs開源的一個(gè)水平可擴(kuò)展、高可用性,多租戶的日志聚合系統(tǒng)的日志聚合系統(tǒng)。它的設(shè)計(jì)初衷是為了解決在大規(guī)模分布式系統(tǒng)中,處理海量日志的問題。Loki采用了分布式的架構(gòu),并且與Prometheus、Grafana密切集成,可以快速地處理大規(guī)模的日志數(shù)據(jù)。該項(xiàng)目受 Prometheus 啟發(fā)
圖片
- Promtail是代理,負(fù)責(zé)收集日志并將其發(fā)送給 Loki 。
- Loki 是主服務(wù)器,負(fù)責(zé)存儲(chǔ)日志和處理查詢。
- Grafana則 用于 UI 展示。
與ELK相比優(yōu)勢(shì)在哪里?
ELK是大規(guī)模日志解決方案中的佼佼者說到Loki,免不了要拿來跟ELK做個(gè)對(duì)比
- 架構(gòu)簡(jiǎn)單:Loki 則采用分布式架構(gòu)、可以將日志存儲(chǔ)在多個(gè)節(jié)點(diǎn)上,也可以存儲(chǔ)在一個(gè)節(jié)點(diǎn)上,其中Promtail進(jìn)行日志收集、Loki 負(fù)責(zé)存儲(chǔ)查詢、Grafana用于展現(xiàn)
- 存儲(chǔ)更小:Loki使用了緊湊的索引和壓縮算法,相比ES 可以減少不少存儲(chǔ)空間
- 沒有采集日志格式要求:提供了更大的靈活性以及在查詢時(shí)格式化的選項(xiàng)
- 與 Prometheus、Grafana 和 K8s 原生集成:可以在單個(gè)用戶界面中無縫切換查詢指標(biāo)、日志等數(shù)據(jù)
- 輕量級(jí):相比ELK,Loki更加輕量級(jí),因?yàn)樗恍枰粋€(gè)單獨(dú)的Elasticsearch集群來存儲(chǔ)和索引日志數(shù)據(jù)
如何采集數(shù)據(jù)?
k8s 集群不提供日志收集的解決方案,一般來說有3 種方案來做日志收集:
- 在Node節(jié)點(diǎn)上運(yùn)行一個(gè) agent 來收集日志(DaemonSet 采集方式)
- 在 Pod 中包含一個(gè) sidecar 容器來收集應(yīng)用日志(sidecar 采集方式)
- 由應(yīng)用程序?qū)⑷罩拘畔⑼扑偷讲杉蠖耍ㄖ鲃?dòng)采集方式)
節(jié)點(diǎn)采集方式
圖片
日志系統(tǒng)會(huì)以DaemonSet 方式是在每個(gè)node 節(jié)點(diǎn)上部署一個(gè)agent,來采集這個(gè)節(jié)點(diǎn)上所有的日志,默認(rèn)會(huì)收集k8s 下/var/log/pod 、/var/lib/docker/containers下的日志,對(duì)應(yīng)用程序的要求就是開啟控制臺(tái)打印,否則會(huì)收集不到日志,比較適用于功能單一或業(yè)務(wù)不是很多的集群;
Sidecar采集方式
圖片
Sidecar 方式會(huì)在每一個(gè)Pod中部署一個(gè) sidecar 容器,來進(jìn)行當(dāng)前容器的日志采集,有多少個(gè) pod,就會(huì)有多少個(gè)Sidecar容器,因此Sidecar相對(duì)資源占用較多,但靈活性以及多租戶隔離性較強(qiáng),適合大型的 K8s 集群使用,因?yàn)槌苏加觅Y源多點(diǎn),采集性能不會(huì)有影響
Loki的Pormtail同時(shí)支持以上兩種方式,默認(rèn)為節(jié)點(diǎn)采集方式,下面我們演示如何在k8s 中快速部署一個(gè)Loki日志分析系統(tǒng)
Loki 部署
添加倉(cāng)庫(kù)
helm repo add grafana https://grafana.github.io/helm-charts
下載倉(cāng)庫(kù)
helm pull grafana/loki-stack
解壓包
解壓完成以后,可以查看相關(guān)參數(shù)的使用
tar -xvf loki-stack-2.10.0.tgz
配置概覽
圖片
此Chart不止包含了Loki 、promtail、grafana,還包括其他組件,但是默認(rèn)未開啟,只開啟了Loki 、promtail,這里為了演示,也開啟grafana配置,通過grafana.enabled=true指定,同時(shí)如果要指定相關(guān)子 chart 參數(shù),根據(jù)子 chart 名稱.參數(shù)進(jìn)行指定,比如要指定的grafana 的admin 密碼,可以用grafana.adminPassword=admin指定
圖片
啟動(dòng)
注意:?jiǎn)?dòng)示例沒有對(duì)日志數(shù)據(jù)進(jìn)行持久化處理,正式部署要進(jìn)行持久化配置
loki-stack中Grafana 的密碼獲取比較復(fù)雜,所以直接通過參數(shù)指定
helm install loki ./loki-stack -n loki-stack \
--set grafana.enabled=true \
--set grafana.adminPassword=admin \
--create-namespace
圖片
以上啟動(dòng)完成以后,會(huì)收集/var/log/pod 、/var/lib/docker/containers日志信息
查看啟動(dòng)pod,由于本人k8s 集群有 6 個(gè)node節(jié)點(diǎn),所以部署了6 個(gè)promtail
圖片
Grafana訪問
修改 Grafana 為 nodeport 訪問方式
kubectl edit svc loki-grafana -n loki-stack
圖片
登錄成功以后,訪問Explore 功能,并點(diǎn)擊Log browser按鈕,會(huì)看到已經(jīng)采集相關(guān)數(shù)據(jù),并自動(dòng)創(chuàng)建namepsace、pod等多個(gè)維度的 labels
圖片
比如要查看 ingress 的日志,選擇命名空間為ingress-nginx并點(diǎn)擊 show logs
圖片
圖片
同時(shí)查詢結(jié)果可以支持換行、日期排序等功能
圖片
以上默認(rèn)的查詢界面,使用起來可能沒那么順手,那么可以根據(jù)需求去定制不同的查詢界面,在https://grafana.com/grafana/dashboards中輸入 loki,可以下載感興趣的Dashboard
圖片
loki卸載
helm uninstall loki -n loki-stack
總結(jié)
以上我們快速演示了如何在 k8s 中部署一個(gè)Loki,可以看到非常簡(jiǎn)單,由于Loki 對(duì)k8s友好支持,默認(rèn)就可以采集到pod、namespace 等標(biāo)簽數(shù)據(jù),不需要額外配置,但是要達(dá)到生產(chǎn)級(jí)可用,還需要對(duì) Loki的數(shù)據(jù)進(jìn)行持久化配置、同時(shí)要根據(jù)采集日志數(shù)據(jù)的大小做好采集速率調(diào)整、以及日志過期策略設(shè)置