輕量級日誌收集方案 Loki

 先看看結果有多輕量吧

官方文檔:https://grafana.com/docs/loki/latest/ 

簡介

Grafana Loki 是一個日誌聚合工具,它是功能齊全的日誌堆棧的核心。

Loki 是一個爲有效保存日誌數據而優化的數據存儲。日誌數據的高效索引將 Loki 與其他日誌系統區分開來。與其他日誌系統不同,Loki 索引是根據標籤構建的,原始日誌消息未編入索引。

代理(也稱爲客戶端)獲取日誌,將日誌轉換爲流,然後通過 HTTP API 將流推送到 Loki。Promtail 代理專爲 Loki 安裝而設計,但許多其他代理與 Loki 無縫集成。

Loki 特點

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 來看不同業務的日誌

 

 即可看到日誌內容

至此, Loki+Promtail+Grafana 收集日誌方案收工。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://www.cnblogs.com/Sunzz/p/15190702.html