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