輕量級日誌收集方案Loki
- 2021 年 8 月 29 日
- 筆記
- DevOps, Kubernetes, 運維
先看看結果有多輕量吧
官方文檔://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 支援根據您的指標發出警報。
架構圖
收集日誌的架構圖
轉載請在文章開頭附上原文鏈接地址: //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
參考://grafana.com/docs/loki/latest/configuration/examples/
//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 ,可根據不同業務設置標籤。
參考: //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: //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和埠號,即就是 //locki:3100。 然後點擊頁面低下 “Save && test ” 按鈕
查看日誌:
選擇host 或者job來看不同業務的日誌
即可看到日誌內容
轉載請在文章開頭附上原文鏈接地址: //www.cnblogs.com/Sunzz/p/15190702.html
至此,Loki+Promtail+Grafana收集日誌方案收工。