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