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