Loki是一个受Prometheus启发的水平可伸缩、高可用性、多租户日志聚合系统。它的设计是非常有效的成本和易于操作。它不索引日志的内容,而是为每个日志流设置一组标签。日志数据被压缩存储在对象存储(例如S3或者GCS)中的块中。
对于传统的日志管理工具,Loki有如下特点
- 不对日志进行全文索引,通过存储压缩的非结构化日志和仅索引元数据,Loki操作更简单,运行成本更低。
- 使用已经在Prometheus中使用的相同标签对日志流进行索引和分组,使您能够使用已经在Prometheus中使用的相同标签在指标和日志之间无缝切换。
- Loki是一个特别适合存储Kubernetes Pod日志,元数据(如Pod标签)会自动抓取并建立索引。
- 原生支持Grafana
Loki通过三个模块来完成日志的管理,三个模块是Promtail,Loki,Grafana
Promtail
1.将容器日志发送到Loki或者Grafana服务上的日志收集工具。
2.发现采集目标以及给日志流添加上Label,然后发送给Loki。
3.Promtail的服务发现基于Prometheus的服务发现机制实现的,可以查看configmap loki-promtail了解细节
Loki
1.Loki可以水平扩展、高可用以及支持多租户的日志聚合系统
2.使用和Prometheus相同的服务发现机制,将标签添加到日志流中而不是构建全文索引
3.Promtail接收到的日志和应用的metrics指标就具有相同的标签集
Grafana
1.Grafana是一个用于监控和可视化观测的开源平台,支持非常丰富的数据源
2.在Loki技术栈中它专门用来展示来自Prometheus和Loki等数据源的时间序列数据
3.允许进行查询、可视化、报警等操作,可以用于创建、探索和共享数据Dashboard
Loki本身又可以划分为3个组件,分配器、采集器、查询器。
Distributor(分配器)
分配器负责处理客户端写入的日志,一旦分配器接收到日志数据,就会分成若干批次,并将他们并行的发送到多个采集器上去。
分配器通过gRPC和采集器进行通信。分配器是无状态的,可以根据实际需要对分配器进行扩所容。
Ingester(采集器)
采集器负责将日志写入长期存储的后端(S3,SynamoDB等),采集器会校验采集的日志是否乱序。另外,采集器验证接收到的日志行是按时间戳递增的顺序接收的,如果时间戳不正确,日志行将被拒绝且返回错误。
Querier(查询器)
查询器服务负责处理LogQL查询语句来评估存储在长期存储中的日志数据。
前面介绍了Loki的理论知识,接下来通过实际例子看看Loki如何工作。首先是在k8s集群上安装Loki
在安装Loki的时候,同时安装了grafana和prometheus(安装prometheus时persistentVolume=false,否则还需要配置存储)
helm repo add grafana https://grafana.github.io/helm-charts
helm upgrade --install loki grafana/loki-stack --set grafana.enabled=true,prometheus.enabled=true,prometheus.alertmanager.persistentVolume.enabled=false,prometheus.server.persistentVolume.enabled=false
安装完成后,查看pod,可以看到loki的pod已经处于running状态。
将Loki grafana service的类型修改成NodePort,方便后面在外网访问Grafana
查看secret,获取Grafana的登录密码,注意需要通过base64 -d解密才能登录。
kubectl get secret loki-grafana -oyaml
登录后,数据源可以选择Loki或者Promethues,这里选择Loki,如下查看了在集群上的nginx pod的日志信息。
通过标签选择需要查看的pod信息非常方面,如下所示:Loki自动显示了所有安装在集群上的pod,可以选择任意需要查看的pod,进行日志查看。
以上就是对Loki的理解和使用。