轻量级日志收集方案Loki

 先看看结果有多轻量吧

官方文档: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收集日志方案收工。

 

posted @ 2021-08-29 21:33  Sunzz  阅读(12326)  评论(0编辑  收藏  举报