一.系統架構
二.組成部分
Loki 的日誌堆棧由 3 個組件組成:promtail
:用於採集日誌、並給每條日誌流打標籤,每個節點部署,k8s部署模式下使用daemonset管理。
用於存儲採集的日誌, 並根據標籤查詢日誌流。單節點部署,一般和監控組件部署在同一節點。loki:
- Grafana:提供界面,實現日誌的可視化查詢。安裝監控組件會默認部署grafana,與監控組件共用grafana。
源碼地址:https://github.com/grafana/loki
三.promtail日誌收集原理
默認情況下,容器日誌會存儲在 /var/log/pods
路徑下
$ ls /var/log/pods kube-system_kube-flannel-ds-amd64-9x66j_28e71490-d614-4cd8-9ea7-af23cc7b9bff lab_job-employee-cronjob-1615078800-n2rxh_134ce637-c2a7-47b8-896f-348931125acb kube-system_kube-proxy-lfzmx_90605182-ae56-4085-801e-fc4a83531945 ...
每個文件夾對應一個 Pod,Pod 下級目錄爲容器名,再下級即爲容器日誌。
$ tree kube-system_kube-flannel-ds-amd64-9x66j_28e71490-d614-4cd8-9ea7-af23cc7b9bff/ kube-system_kube-flannel-ds-amd64-9x66j_28e71490-d614-4cd8-9ea7-af23cc7b9bff/ ├── install-cni │ └── 3.log -> /data/docker/containers/6accaa2d6890df8ca05d1f40aaa9b8da69ea0a00a8e4b07a0949cdc067843e37/6accaa2d6890df8ca05d1f40aaa9b8da69ea0a00a8e4b07a0949cdc067843e37-json.log └── kube-flannel ├── 2.log -> /data/docker/containers/9e8eea717cc3efd0804900a53244a32286d9e04767f76d9c8a8cc3701c83ece5/9e8eea717cc3efd0804900a53244a32286d9e04767f76d9c8a8cc3701c83ece5-json.log └── 3.log -> /data/docker/containers/06389981d26cbe60328cd5a46af7b003c8d687d1c411704784aa12d4d82672b8/06389981d26cbe60328cd5a46af7b003c8d687d1c411704784aa12d4d82672b8-json.log
kube-flannel/3.log
只是對 /data/docker/containers/***/***.log
文件的軟鏈接,本質上還是 Docker 維護日誌, k8s 對其引用而已。log
:日誌內容stream
:stderr(異常輸出)、stdout(正常輸出)time
:時間
注意:/data/docker/containers
並非 docker 默認的數據存儲路徑,是通過 /etc/docker/daemon.json
配置的。
注意:上述提到 /var/log/pods
下的日誌只是對 /data/docker/containers
下日誌的軟鏈接,所以 Promtail
部署時需要同時掛載這兩個目錄。
四.Loki
Loki是一個水平可擴展,高可用,多租戶的日誌聚合系統。Loki只會對日誌元數據標籤進行索引,而不會對原始的日誌數據進行全文檢索,收集的日誌數據本身會被壓縮,並以chunks(塊)的形式存放在存儲中。
4.1.組件
1.Distributor(分配器)
日誌寫入第一站,一旦分配器接收到日誌數據,他就會把日誌分成若干批次,並將它們並行的傳送到採集器。
分配器採用gRPC與採集器進行通信,它們是無狀態的,所以我們需要根據實際狀況進行擴縮容。
2.Ingester(採集器)
採集器負責將日誌數據寫入存儲。
3.Querier(查詢器)
查詢服務器,負載處理LOGQL查詢語句。
4.Chunk(塊)存儲
塊存儲是Loki的長期數據存儲,旨在支持交互式查詢和持續寫入,無需後臺維護任務。