先看看結果有多輕量吧
官方文件:https://grafana.com/docs/loki/latest/
簡介
Grafana Loki 是一個日誌聚合工具,它是功能齊全的日誌堆疊的核心。
Loki 是一個為有效儲存日誌資料而優化的資料儲存。日誌資料的高效索引將 Loki 與其他日誌系統區分開來。與其他日誌系統不同,Loki 索引是根據標籤構建的,原始日誌訊息未編入索引。
代理(也稱為客戶端)獲取日誌,將日誌轉換為流,然後通過 HTTP API 將流推送到 Loki。Promtail 代理專為 Loki 安裝而設計,但許多其他代理與 Loki 無縫整合。
Loki特點
用於索引日誌的高效記憶體使用
通過在一組標籤上建立索引,索引可以明顯小於其他日誌聚合產品。更少的記憶體使得操作成本更低。
多租戶
Loki 允許多個租戶使用單個 Loki 例項。不同租戶的資料與其他租戶完全隔離。通過在代理中分配租戶 ID 來配置多租戶。
LogQL,Loki 的查詢語言
Prometheus 查詢語言 PromQL 的使用者會發現 LogQL 熟悉且靈活,可用於生成針對日誌的查詢。該語言還有助於從日誌資料中生成指標,這是一項遠遠超出日誌聚合的強大功能。
可擴充套件性
Loki 在小範圍內執行良好。在單程序模式下,所有需要的微服務都在一個程序中執行。單程序模式非常適合測試 Loki、在本地執行或小規模執行。
Loki 還旨在為大規模安裝進行橫向擴充套件。Loki 的每個微服務元件都可以分解為單獨的程序,並且配置允許對元件進行單獨擴充套件。
靈活性
許多代理(客戶端)都有外掛支援。這允許當前的可觀察性結構將 Loki 新增為他們的日誌聚合工具,而無需切換可觀察性堆疊的現有部分。
Grafana 整合
Loki 與 Grafana 無縫整合,提供完整的可觀察性堆疊。
Loki / Promtail / Grafana vs EFK
EFK(Elasticsearch、Fluentd、Kibana)堆疊用於從各種來源攝取、視覺化和查詢日誌。
Elasticsearch 中的資料作為非結構化 JSON 物件儲存在磁碟上。每個物件的鍵和每個鍵的內容都被索引。然後可以使用 JSON 物件定義查詢(稱為查詢 DSL)或通過 Lucene 查詢語言查詢資料。相比之下,單二進位制模式的 Loki 可以將資料儲存在磁碟上,但在水平可擴充套件模式下,資料儲存在雲端儲存系統中,例如 S3、GCS 或 Cassandra。日誌以純文字形式儲存,並標有一組標籤名稱和值,其中僅索引標籤對。這種權衡使得操作比完整索引更便宜,並允許開發人員積極地從他們的應用程式中登入。使用LogQL查詢 Loki 中的日誌。然而,由於這種設計權衡,基於內容(即日誌行中的文字)過濾的 LogQL 查詢需要載入搜尋視窗中與查詢中定義的標籤匹配的所有塊。
Fluentd 通常用於收集日誌並將其轉發到 Elasticsearch。Fluentd 被稱為資料收集器,它可以從許多來源攝取日誌,對其進行處理,並將其轉發到一個或多個目標。
相比之下,Promtail 的用例是專門為 Loki 量身定製的。它的主要操作模式是發現儲存在磁碟上的日誌檔案,並將它們與一組標籤相關聯地轉發給 Loki。Promtail 可以為與 Promtail 執行在同一節點上的 Kubernetes pod 進行服務發現,充當容器邊車或 Docker 日誌驅動程式,從指定資料夾讀取日誌,並跟蹤 systemd 日誌。
Loki 通過一組標籤對錶示日誌的方式類似於 Prometheus表示指標的方式。當與 Prometheus 一起部署在環境中時,由於使用相同的服務發現機制,Promtail 的日誌通常具有與應用程式指標相同的標籤。具有相同標籤的日誌和指標使使用者能夠在指標和日誌之間無縫切換上下文,幫助進行根本原因分析。
Kibana 用於視覺化和搜尋 Elasticsearch 資料,並且在對這些資料進行分析方面非常強大。Kibana 提供了許多視覺化工具來進行資料分析,例如位置圖、用於異常檢測的機器學習以及用於發現數據關係的圖形。警報可以配置為在發生意外情況時通知使用者。
相比之下,Grafana 專門針對來自 Prometheus 和 Loki 等來源的時間序列資料量身定製。儀表板可以設定為視覺化指標(即將提供日誌支援),並且可以使用瀏覽檢視對您的資料進行臨時查詢。與 Kibana 一樣,Grafana 支援根據您的指標發出警報。
架構圖
收集日誌的架構圖
轉載請在文章開頭附上原文連結地址: https://www.cnblogs.com/Sunzz/p/15190702.html
介紹Loki
Promtail:日誌收集工具
Loki:日誌聚合系統
Grafana:視覺化工具
一、部署Loki
官網地址:GitHub - grafana/loki: Like Prometheus, but for logs.
1. loki
編輯loki配置檔案 loki-config.yaml
參考:https://grafana.com/docs/loki/latest/configuration/examples/
https://grafana.com/docs/loki/latest/installation/docker/
1 ---
2 apiVersion: v1
3 kind: ConfigMap
4 metadata:
5 name: loki-config
6 labels:
7 name: loki
8 data:
9 loki-config.yaml: |-
10 auth_enabled: false
11
12 server:
13 http_listen_port: 3100
14 grpc_listen_port: 9096
15
16 ingester:
17 lifecycler:
18 address: 127.0.0.1
19 ring:
20 kvstore:
21 store: inmemory
22 replication_factor: 1
23 final_sleep: 0s
24 chunk_idle_period: 5m
25 chunk_retain_period: 30s
26
27 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
28 max_transfer_retries: 0 # Chunk transfers disabled
29
30 schema_config:
31 configs:
32 - from: 2021-08-18
33 store: boltdb
34 object_store: filesystem
35 schema: v11
36 index:
37 prefix: index_
38 period: 168h
39
40 storage_config:
41 boltdb:
42 directory: /tmp/loki/index
43
44 filesystem:
45 directory: /tmp/loki/chunks
46
47 limits_config:
48 enforce_metric_name: false
49 reject_old_samples: true
50 reject_old_samples_max_age: 168h
51
52 ingestion_rate_mb: 15
53
54 chunk_store_config:
55 max_look_back_period: 0s
56
57 table_manager:
58 retention_deletes_enabled: false
59 retention_period: 0s
kubectl apply -f loki-config.yaml
建立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
執行命令建立:
kubectl apply -f loki.yaml
2.grafana
根據自己時間情可對儲存那塊進行更改,不改的話是emptyDir,你懂的。賬號密碼為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: ## 初始化容器,用於修改掛載的儲存的資料夾歸屬組與歸屬使用者
# - 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: ## 容器安全策略,設定執行容器使用的歸屬組與使用者
# fsGroup: 0
# runAsUser: 472
ports:
- name: http
containerPort: 3000
protocol: TCP
env: ## 配置環境變數,設定 Grafana 的預設管理員使用者名稱/密碼
- 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: ## 共享儲存掛載配置
- name: data
emptyDir: {}
#persistentVolumeClaim:
# claimName: grafana ## 指定使用的 PVC
3.promtail
應用結合 promtail,進行日誌收集。
這裡使用Sidecar模式。一個pod中跑兩個容器,一個為業務容器,一個為promtail,兩個容器掛載同一個儲存目錄,promtail即可收集日誌。
編輯promtail-config.yaml ,可根據不同業務設定標籤。
參考: https://grafana.com/docs/loki/latest/clients/promtail/installation/
1 ---
2 apiVersion: v1
3 kind: ConfigMap
4 metadata:
5 name: promtail-config
6 labels:
7 k8s-app: promtail
8 data:
9 promtail.yaml: |-
10 server:
11 http_listen_port: 9080
12 grpc_listen_port: 0
13
14 positions:
15 filename: ./positions.yaml # This location needs to be writeable by Promtail.
16 #filename: /tmp/positions.yaml # This location needs to be writeable by Promtail.
17
18 client:
19 url: http://loki:3100/loki/api/v1/push
20
21 scrape_configs:
22 - job_name: system
23 #- job_name: busybox
24 static_configs:
25 - targets:
26 - localhost
27 labels:
28 job: varlog #自定義
29 host: busybox #自定義
30 __path__: /tmp/*log 收集日誌的目錄
1 ---
2 apiVersion: apps/v1
3 kind: Deployment
4 metadata:
5 name: promtail-deployment
6 spec:
7 replicas: 2
8 selector:
9 matchLabels:
10 name: promtail
11 template:
12 metadata:
13 labels:
14 name: promtail
15 spec:
16 volumes:
17 - name: log
18 emptyDir: {}
19 - name: promtail-config
20 configMap:
21 name: promtail-config
22
23 containers:
24 - name: promtail
25 image: grafana/promtail:master
26 imagePullPolicy: IfNotPresent
27 args:
28 - -config.file=/etc/promtail/promtail.yaml
29 volumeMounts:
30 - name: log
31 mountPath: /tmp/
32 - name: promtail-config
33 mountPath: /etc/promtail/
34
35 - name: busybox
36 image: centos:7
37 imagePullPolicy: IfNotPresent
38 args:
39 - /bin/sh
40 - -c
41 - "while : ; do echo '--- promtail log test ---' `date` && echo '--- promtail log test ---' `date` >> /tmp/healthy.log && sleep 3 ; done "
42 volumeMounts:
43 - name: log
44 mountPath: /tmp/
二、配置grafana並檢視日誌
檢視grafana的nodeport埠
kubectl get svc
瀏覽器輸入Node IP + 上邊看到的port 開啟grafana頁面
輸入賬號密碼進行登陸 admin admin123
配置資料來源
找到loki,然後url處寫上loki的service name和埠號,即就是 http://locki:3100。 然後點選頁面低下 "Save && test " 按鈕
檢視日誌:
選擇host 或者job來看不同業務的日誌
即可看到日誌內容
轉載請在文章開頭附上原文連結地址: https://www.cnblogs.com/Sunzz/p/15190702.html
至此,Loki+Promtail+Grafana收集日誌方案收工。