Loki日志系統(tǒng),比ELK輕量多了
圖片來(lái)自 包圖網(wǎng)
先看看結(jié)果有多輕量吧:
Loki 是一個(gè)為有效保存日志數(shù)據(jù)而優(yōu)化的數(shù)據(jù)存儲(chǔ)。日志數(shù)據(jù)的高效索引將 Loki 與其他日志系統(tǒng)區(qū)分開來(lái)。與其他日志系統(tǒng)不同,Loki 索引是根據(jù)標(biāo)簽構(gòu)建的,原始日志消息未編入索引。
代理(也稱為客戶端)獲取日志,將日志轉(zhuǎn)換為流,然后通過(guò) HTTP API 將流推送到 Loki。Promtail 代理專為 Loki 安裝而設(shè)計(jì),但許多其他代理與 Loki 無(wú)縫集成。
Loki 特點(diǎn)如下:
用于索引日志的高效內(nèi)存使用:通過(guò)在一組標(biāo)簽上建立索引,索引可以明顯小于其他日志聚合產(chǎn)品。更少的內(nèi)存使得操作成本更低。
多租戶:Loki 允許多個(gè)租戶使用單個(gè) Loki 實(shí)例。不同租戶的數(shù)據(jù)與其他租戶完全隔離。通過(guò)在代理中分配租戶 ID 來(lái)配置多租戶。
LogQL,Loki 的查詢語(yǔ)言:Prometheus 查詢語(yǔ)言 PromQL 的用戶會(huì)發(fā)現(xiàn) LogQL 熟悉且靈活,可用于生成針對(duì)日志的查詢。該語(yǔ)言還有助于從日志數(shù)據(jù)中生成指標(biāo),這是一項(xiàng)遠(yuǎn)遠(yuǎn)超出日志聚合的強(qiáng)大功能。
可擴(kuò)展性:Loki 在小范圍內(nèi)運(yùn)行良好。在單進(jìn)程模式下,所有需要的微服務(wù)都在一個(gè)進(jìn)程中運(yùn)行。
單進(jìn)程模式非常適合測(cè)試 Loki、在本地運(yùn)行或小規(guī)模運(yùn)行。Loki 還旨在為大規(guī)模安裝進(jìn)行橫向擴(kuò)展。
Loki 的每個(gè)微服務(wù)組件都可以分解為單獨(dú)的進(jìn)程,并且配置允許對(duì)組件進(jìn)行單獨(dú)擴(kuò)展。
靈活性:許多代理(客戶端)都有插件支持。這允許當(dāng)前的可觀察性結(jié)構(gòu)將 Loki 添加為他們的日志聚合工具,而無(wú)需切換可觀察性堆棧的現(xiàn)有部分。
Grafana 集成:Loki 與 Grafana 無(wú)縫集成,提供完整的可觀察性堆棧。
Loki/Promtail/Grafana vs EFK
EFK(Elasticsearch、Fluentd、Kibana)堆棧用于從各種來(lái)源攝取、可視化和查詢?nèi)罩尽?/p>
Elasticsearch 中的數(shù)據(jù)作為非結(jié)構(gòu)化 JSON 對(duì)象存儲(chǔ)在磁盤上。每個(gè)對(duì)象的鍵和每個(gè)鍵的內(nèi)容都被索引。
然后可以使用 JSON 對(duì)象定義查詢(稱為查詢 DSL)或通過(guò) Lucene 查詢語(yǔ)言查詢數(shù)據(jù)。
相比之下,單二進(jìn)制模式的 Loki 可以將數(shù)據(jù)存儲(chǔ)在磁盤上,但在水平可擴(kuò)展模式下,數(shù)據(jù)存儲(chǔ)在云存儲(chǔ)系統(tǒng)中,例如 S3、GCS 或 Cassandra。
日志以純文本形式存儲(chǔ),并標(biāo)有一組標(biāo)簽名稱和值,其中僅索引標(biāo)簽對(duì)。這種權(quán)衡使得操作比完整索引更便宜,并允許開發(fā)人員積極地從他們的應(yīng)用程序中登錄。使用LogQL查詢 Loki 中的日志。
然而,由于這種設(shè)計(jì)權(quán)衡,基于內(nèi)容(即日志行中的文本)過(guò)濾的 LogQL 查詢需要加載搜索窗口中與查詢中定義的標(biāo)簽匹配的所有塊。
Fluentd 通常用于收集日志并將其轉(zhuǎn)發(fā)到 Elasticsearch。Fluentd 被稱為數(shù)據(jù)收集器,它可以從許多來(lái)源攝取日志,對(duì)其進(jìn)行處理,并將其轉(zhuǎn)發(fā)到一個(gè)或多個(gè)目標(biāo)。
相比之下,Promtail 的用例是專門為 Loki 量身定制的。它的主要操作模式是發(fā)現(xiàn)存儲(chǔ)在磁盤上的日志文件,并將它們與一組標(biāo)簽相關(guān)聯(lián)地轉(zhuǎn)發(fā)給 Loki。
Promtail 可以為與 Promtail 運(yùn)行在同一節(jié)點(diǎn)上的 Kubernetes pod 進(jìn)行服務(wù)發(fā)現(xiàn),充當(dāng)容器邊車或 Docker 日志驅(qū)動(dòng)程序,從指定文件夾讀取日志,并跟蹤 systemd 日志。
Loki 通過(guò)一組標(biāo)簽對(duì)表示日志的方式類似于 Prometheus表示指標(biāo)的方式。
當(dāng)與 Prometheus 一起部署在環(huán)境中時(shí),由于使用相同的服務(wù)發(fā)現(xiàn)機(jī)制,Promtail 的日志通常具有與應(yīng)用程序指標(biāo)相同的標(biāo)簽。
具有相同標(biāo)簽的日志和指標(biāo)使用戶能夠在指標(biāo)和日志之間無(wú)縫切換上下文,幫助進(jìn)行根本原因分析。
Kibana 用于可視化和搜索 Elasticsearch 數(shù)據(jù),并且在對(duì)這些數(shù)據(jù)進(jìn)行分析方面非常強(qiáng)大。
Kibana 提供了許多可視化工具來(lái)進(jìn)行數(shù)據(jù)分析,例如位置圖、用于異常檢測(cè)的機(jī)器學(xué)習(xí)以及用于發(fā)現(xiàn)數(shù)據(jù)關(guān)系的圖形。警報(bào)可以配置為在發(fā)生意外情況時(shí)通知用戶。
相比之下,Grafana 專門針對(duì)來(lái)自 Prometheus 和 Loki 等來(lái)源的時(shí)間序列數(shù)據(jù)量身定制。
儀表板可以設(shè)置為可視化指標(biāo)(即將提供日志支持),并且可以使用瀏覽視圖對(duì)您的數(shù)據(jù)進(jìn)行臨時(shí)查詢。與 Kibana 一樣,Grafana 支持根據(jù)您的指標(biāo)發(fā)出警報(bào)。
架構(gòu)圖:
收集日志的架構(gòu)圖:
一套輕量級(jí)日志收集方案:
- Promtail:日志收集工具
- Loki:日志聚合系統(tǒng)
- Grafana:可視化工具
部署 Loki
官網(wǎng)地址:
- https://github.com/grafana/loki
①loki
編輯 loki 配置文件:loki-config.yaml,參考:
- https://grafana.com/docs/loki/latest/configuration/examples/
- https://grafana.com/docs/loki/latest/installation/docker/
- ---
- apiVersion: v1
- kind: ConfigMap
- metadata:
- name: loki-config
- labels:
- name: loki
- data:
- loki-config.yaml: |-
- auth_enabled: false
- server:
- http_listen_port: 3100
- grpc_listen_port: 9096
- ingester:
- lifecycler:
- address: 127.0.0.1
- ring:
- kvstore:
- store: inmemory
- replication_factor: 1
- final_sleep: 0s
- chunk_idle_period: 5m
- chunk_retain_period: 30s
- chunk_target_size: 1048576 # Loki will attempt to build chunks up to 1.5MB, flushing first if chunk_idle_period or max_chunk_age is reached first
- max_transfer_retries: 0 # Chunk transfers disabled
- schema_config:
- configs:
- - from: 2021-08-18
- store: boltdb
- object_store: filesystem
- schema: v11
- index:
- prefix: index_
- period: 168h
- storage_config:
- boltdb:
- directory: /tmp/loki/index
- filesystem:
- directory: /tmp/loki/chunks
- limits_config:
- enforce_metric_name: false
- reject_old_samples: true
- reject_old_samples_max_age: 168h
- ingestion_rate_mb: 15
- chunk_store_config:
- max_look_back_period: 0s
- table_manager:
- retention_deletes_enabled: false
- retention_period: 0s
- kubectl apply -f loki-config.yaml
創(chuàng)建 Service 和 StatefulSet,loki,.yaml:
- ---
- apiVersion: v1
- kind: Service
- metadata:
- name: loki
- annotations:
- k8s.kuboard.cn/displayName: loki
- k8s.kuboard.cn/workload: loki
- labels:
- name: loki
- spec:
- ports:
- - name: http
- port: 3100
- protocol: TCP
- targetPort: 3100
- selector:
- name: loki
- ---
- apiVersion: apps/v1
- kind: StatefulSet
- metadata:
- name: loki
- spec:
- serviceName: loki
- selector:
- matchLabels:
- name: loki
- template:
- metadata:
- labels:
- name: loki
- spec:
- volumes:
- - name: loki-config
- configMap:
- #defaultMode: 0640
- name: loki-config
- containers:
- - name: loki
- #image: grafana/loki:2.3.0
- image: grafana/loki:master
- args:
- - -config.file=/etc/loki/loki-config.yaml
- ports:
- - containerPort: 3100
- name: loki
- protocol: TCP
- volumeMounts:
- - name: loki-config
- mountPath: /etc/loki/
- readOnly: true
執(zhí)行命令創(chuàng)建:
- kubectl apply -f loki.yaml
②grafana
根據(jù)自己時(shí)間情可對(duì)存儲(chǔ)那塊進(jìn)行更改,不改的話是 emptyDir,你懂的。賬號(hào)密碼為 admin/admin123.可自行修改。
- apiVersion: v1
- kind: Service
- metadata:
- name: grafana
- labels:
- k8s-app: grafana
- spec:
- type: NodePort
- ports:
- - name: http
- port: 3000
- targetPort: 3000
- selector:
- k8s-app: grafana
- ---
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: grafana
- labels:
- k8s-app: grafana
- spec:
- selector:
- matchLabels:
- k8s-app: grafana
- template:
- metadata:
- labels:
- k8s-app: grafana
- spec:
- # initContainers: ## 初始化容器,用于修改掛載的存儲(chǔ)的文件夾歸屬組與歸屬用戶
- # - name: init-file
- # image: busybox:1.28
- # imagePullPolicy: IfNotPresent
- # securityContext:
- # runAsUser: 0
- # command: ['chown', '-R', "472:0", "/var/lib/grafana"]
- # volumeMounts:
- # - name: data
- # mountPath: /var/lib/grafana
- # subPath: grafana
- containers:
- - name: grafana ## Grafana 容器
- #image: grafana/grafana
- image: grafana/grafana:7.4.3
- #securityContext: ## 容器安全策略,設(shè)置運(yùn)行容器使用的歸屬組與用戶
- # fsGroup: 0
- # runAsUser: 472
- ports:
- - name: http
- containerPort: 3000
- protocol: TCP
- env: ## 配置環(huán)境變量,設(shè)置 Grafana 的默認(rèn)管理員用戶名/密碼
- - name: GF_SECURITY_ADMIN_USER
- value: "admin"
- - name: GF_SECURITY_ADMIN_PASSWORD
- value: "admin123"
- readinessProbe: ## 就緒探針
- failureThreshold: 10
- httpGet:
- path: /api/health
- port: 3000
- scheme: HTTP
- initialDelaySeconds: 10
- periodSeconds: 10
- successThreshold: 1
- timeoutSeconds: 30
- livenessProbe: ## 存活探針
- failureThreshold: 10
- httpGet:
- path: /api/health
- port: 3000
- scheme: HTTP
- initialDelaySeconds: 10
- periodSeconds: 10
- successThreshold: 1
- timeoutSeconds: 1
- volumeMounts: ## 容器掛載配置
- - name: data
- mountPath: /var/lib/grafana
- subPath: grafana
- volumes: ## 共享存儲(chǔ)掛載配置
- - name: data
- emptyDir: {}
- #persistentVolumeClaim:
- # claimName: grafana ## 指定使用的 PVC
③promtail
應(yīng)用結(jié)合 promtail,進(jìn)行日志收集。這里使用 Sidecar 模式。一個(gè) pod 中跑兩個(gè)容器,一個(gè)為業(yè)務(wù)容器,一個(gè)為 promtail,兩個(gè)容器掛載同一個(gè)存儲(chǔ)目錄,promtail 即可收集日志。
編輯 promtail-config.yaml,可根據(jù)不同業(yè)務(wù)設(shè)置標(biāo)簽。參考:
- https://grafana.com/docs/loki/latest/clients/promtail/installation/
- ---
- apiVersion: v1
- kind: ConfigMap
- metadata:
- name: promtail-config
- labels:
- k8s-app: promtail
- data:
- promtail.yaml: |-
- server:
- http_listen_port: 9080
- grpc_listen_port: 0
- positions:
- filename: ./positions.yaml # This location needs to be writeable by Promtail.
- #filename: /tmp/positions.yaml # This location needs to be writeable by Promtail.
- client:
- url: http://loki:3100/loki/api/v1/push
- scrape_configs:
- - job_name: system
- #- job_name: busybox
- static_configs:
- - targets:
- - localhost
- labels:
- job: varlog #自定義
- host: busybox #自定義
- __path__: /tmp/*log 收集日志的目錄
- ---
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: promtail-deployment
- spec:
- replicas: 2
- selector:
- matchLabels:
- name: promtail
- template:
- metadata:
- labels:
- name: promtail
- spec:
- volumes:
- - name: log
- emptyDir: {}
- - name: promtail-config
- configMap:
- name: promtail-config
- containers:
- - name: promtail
- image: grafana/promtail:master
- imagePullPolicy: IfNotPresent
- args:
- - -config.file=/etc/promtail/promtail.yaml
- volumeMounts:
- - name: log
- mountPath: /tmp/
- - name: promtail-config
- mountPath: /etc/promtail/
- - name: busybox
- image: centos:7
- imagePullPolicy: IfNotPresent
- args:
- - /bin/sh
- - -c
- - "while : ; do echo '--- promtail log test ---' `date` && echo '--- promtail log test ---' `date` >> /tmp/healthy.log && sleep 3 ; done "
- volumeMounts:
- - name: log
- mountPath: /tmp/
配置 grafana 并查看日志
查看 grafana 的 nodeport 端口:
- kubectl get svc
瀏覽器輸入 Node IP +上邊看到的 port 打開 grafana 頁(yè)面:
輸入賬號(hào)密碼進(jìn)行登陸 admin admin123。
配置數(shù)據(jù)源:
找到 loki,然后 url 處寫上 loki 的 service name 和端口號(hào),即就是 http://locki:3100。
然后點(diǎn)擊頁(yè)面低下 "Save && test " 按鈕:
查看日志:
選擇 host 或者 job 來(lái)看不同業(yè)務(wù)的日志:
即可看到日志內(nèi)容:
至此,Loki+Promtail+Grafana 收集日志方案收工。
作者:Sunzz
編輯:陶家龍
出處:cnblogs.com/Sunzz/p/15190702.html