• 轻量级日志收集方案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收集日志方案收工。

  • 相关阅读:
    JQuery基础知识总结
    抽象方法与虚方法
    关于性能的几个术语
    T-SQL基础知识
    学习materialize
    VS2013 启用avalon 智能提示 Intelligence
    推荐一款开源的C#TCP通讯框架
    js/jquery 获取本地文件的文件路劲 获取input框中type=‘file’ 中的文件路径(转载)
    HTML5的 input:file上传类型控制(转载)
    tinymce4.x 上传本地图片 (转载)
  • 原文地址:https://www.cnblogs.com/Sunzz/p/15190702.html
Copyright © 2020-2023  润新知