輕量級日誌收集方案Loki

 先看看結果有多輕量吧

官方文檔://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收集日誌方案收工。