文章目录
- 轻量级日志管理平台Grafana Loki
- 背景
- 什么是Loki
- 为什么使用 Grafana Loki?
- 架构
- Log Storage
- Grafana
- 部署使用
- 基于 Docker Compose 安装 Loki
- MinIO
- K8s集群部署Loki采集
- Helm 部署方式和案例
- 参考
轻量级日志管理平台Grafana Loki
背景
在微服务以及云原生时代,由于应用部署到遍地是,为了不像传统的方式上每台应用服务器筛选日志,那么我们可以使用日志管理平台,将所有日志都采集到统一的平台,供运维和研发人员快速排查故障,进而提升效率。
在整个运维生命周期中,日志监控主要就是关注程序运行状态。日志系统是现代运维的核心。但随着系统的复杂化和分布式架构的普及,日志量呈现指数级增长。选择一个高效的日志收集和分析工具,直接影响系统的性能和维护成本。
这样的日志平台云厂商有提供,比如腾讯云的日志服务CLS,阿里云日志SLS,百度云日志服务BLS,天翼云日志服务CT-LTS,谷歌云Cloud Logging等等。
在公司的分布式环境中,存储和管理来自各种系统资源的日志是一项具有挑战性的任务。为了简化这项任务,引入了一个称为日志聚合的概念,它从各种系统资源中收集、存储、管理日志。有各种各样的日志聚合工具,其中一个工具是 Grafana Loki。
什么是Loki
官网:https://grafana.com/docs/loki/latest/
Loki是由Grafana Labs开源的一个水平可扩展、高可用性,多租户的日志聚合系统的日志聚合系统。Loki采用了分布式的架构,并且与Prometheus、Grafana密切集成,可以快速地处理大规模的日志数据。
项目受 Prometheus 启发,官方的介绍就是: Like Prometheus, but for logs ,类似于 Prometheus 的日志系统。
Grafana Loki 是一个开源的日志收集系统,其功能是收集、存储和查询日志。Grafana Loki 压缩日志并将日志存储在块中,并将它们存储在文件系统或 AWS S3 等后端存储中。
块是一个压缩文件,其中包含基于日志卷的日志条目,因此当块大小达到其大小限制时,它会将日志存储在另一个块中。每当存储一个块时,它都会为每个块创建一个索引。索引不包含日志的内容,它只包含时间戳、块的标签和块的位置。
日志的默认保留期限为24小时,最短期限为1小时,最长可延长至30天。Loki 横向扩展并具有其查询语言 LogQL。
特别适合储存 Kubernetes Pod 日志 ; 诸如 Pod 标签之类的元数据会被自动删除和编入索引。
Loki 的一大特点是它不索引日志内容,只索引标签(Labels),这大幅减少了资源消耗。
它不对原始日志进行索引,只对日志的标签进行索引,而日志通过压缩进行存储,通常是文件系统存储,所以其操作成本更低,数量级效率更高。
与其他日志记录系统不同,Loki 的构建理念是仅索引关于日志标签的元数据(就像 Prometheus 标签一样)。然后将日志数据本身压缩并以块的形式存储在对象存储中,例如 Amazon Simple Storage Service (S3) 或 Google Cloud Storage (GCS),甚至本地文件系统。
总结:相对于EFK/ELK,专为日志而生的Loki,结合Grafana生态,对于中小企业,或者说只是作为日志系统而言,我更倾向于选择Loki代替EFK/ELK
Loki
美[ˈloʊki]英[ˈləuki:]
n.【欧神】洛基
网络洛奇;邪神洛基;火神
可以把Loki的功能总结如下:
- 日志收集:Loki可以接收来自不同应用程序、主机和容器的日志数据。
- 日志存储:Loki使用可扩展的分布式存储后端存储日志数据,包括本地存储和云存储。
- 日志查询:Loki提供了一个高效的查询语言,可以快速地搜索和过滤日志数据。
- 日志索引:Loki使用标签索引和压缩算法对日志数据进行索引,可以大大减少存储空间和查询时间。
- 日志警报:Loki可以根据日志数据中的条件触发警报,并将警报发送到警报通道。
可以看到,作为一个日志处理系统,从收集、存储、查询、告警支持都是比较全面的,配合Grafana也能够比较好实现可视化,相关组件也比较简单。
为什么使用 Grafana Loki?
- 入门非常简单:可以使用各种客户端从任何来源发送任何格式的日志
- 没有采集日志格式要求:提供了更大的灵活性以及在查询时格式化的选项
- 轻量级:相比ELK,Loki更加轻量级,因为它不需要一个单独的Elasticsearch集群来存储和索引日志数据。
- 高度可扩展性:Loki可以通过添加更多的Loki实例来实现水平扩展,这使得它更容易处理大量的日志数据。
- 与 Prometheus、Grafana 和 K8s 原生集成:可以在单个用户界面中无缝切换查询指标、日志等数据
- 根据日志生成告警:可以从日志行构建指标并生成告警
Loki 更适合对日志量大但查询要求相对简单的场景。特别是在 Kubernetes 环境中,Loki 的轻量和与 Prometheus 的无缝集成,让它成为了首选。
架构
Loki 的架构非常简单,主要由以下 3 个部分组成:
- Loki:负责存储日志和处理查询。
- Promtail:日志收集的代理,负责在各端收集日志并将其发送给 Loki 。
- Grafana:用于日志搜索的UI 展示。
在 Kubernetes 中 Promtail 以 DaemonSet
方式运行在每个节点中,通过 Kubernetes API 得到日志的正确元数据,并将它们发送到 Loki。
Loki则采用了分布式架构,将日志数据存储在多个节点上,Promtail进行日志收集,可视化依赖于Grafana
Loki具有较低的硬件要求,可以在较小的硬件上运行,例如使用少量内存和CPU。可以通过添加更多的Loki实例来实现水平扩展,这使得它更容易处理大量的日志数据。
直接支持Prometheus:Loki与Prometheus深度集成,这使得在Prometheus查询中使用Loki日志数据更加容易。
该图显示了 Grafana Loki 如何收集、存储、查询和可视化日志。
- 在 Grafana Loki 中,agent 负责从文件、容器、pod、应用程序和系统日志中收集日志。
Loki 使用日志收集代理(agent)来收集日志,如果您在 Kubernetes 中使用 Loki,代理将作为守护程序集(Daemonset)部署,因为我们需要来自集群每个可用节点的日志。 - Promtail 是该架构中使用的代理(agent),Promtail 收集日志,然后过滤和压缩日志以节省存储空间。
压缩日志后,它会为日志提供一个标签并将其发送给 Loki。 - 从 Promtail 接收到日志之后,Loki 将每个日志存储为一个块,该块将日志消息收集在一个文件中,以节省存储空间和有效检索。
它还为块提供标签和时间戳。每当存储块时,它都会为每个块创建一个索引,其中包含块的时间戳、标签和位置。 - Loki 使用 LogQL 查询语言查询日志,LogQL 允许我们根据我们选择的标签和值过滤、聚合和分析日志。
- 通过将 Loki 添加到 Grafana,您可以可视化查询的日志或使用 LogCLI 从 CLI 查询日志。
Promtail 是充当 Loki 的日志代理(agent)的重要组件。它的功能是从系统中收集每个日志,标记它,然后将其发送给 Loki。Loki 从本地日志文件和系统日志中收集日志。
您必须在要收集日志的每个系统中安装 Promtail,同样,如果您在 Kubernetes 上使用 Loki,则必须在每个节点中部署 Promtail 作为守护进程集(Daemonset)。
Log Storage
Loki 存储日志数据,提高查询和接收日志的效率。它将日志数据压缩成块,根据时间进行组织,并为其提供标签和时间戳。然后,它以键值对格式为每个块创建一个索引,其中块时间戳和标签等。
例如,将块的索引视为一本书的索引。
Chunks 和 Index 可以存储在各种后端对象存储或文件系统中。
一旦存储了块,它就会为数据创建一个保留期,并根据保留期自动删除。
如果您使用文件系统作为存储,则块和索引的默认存储路径是 /var/lib/loki/chunks 和 /var/lib/loki/index。
Grafana
官方文档:https://grafana.org.cn/docs/loki/latest/#google_vignette
Loki 的数据查询,都是通过 Grafana,在 Grafana 中支持 loki 的数据源,通过配置 Loki 的接口地址即可
Grafana 的查询,支持 LogQL
部署使用
官方文档:https://grafana.org.cn/docs/loki/latest/get-started/
使用 Grafana 进行查询验证
通过http://localhost:3000,访问Grafana来查询和观察 Loki 集群的日志数据,Grafana 已经默认把 Loki 配置为数据源。
部署 Loki 有几种方式,包括使用 Docker、Kubernetes 以及 Helm Chart :
- 使用 Docker 部署 Loki: 使用 Docker 部署 Loki 是一种简便的方式。你可以编写一个 docker-compose.yml 文件来定义 Loki 服务,并通过 docker-compose up 命令启动 Loki。
- 使用 Kubernetes 部署 Loki: Loki 官方推荐的最佳实践为采用 DaemonSet 部署 Promtail 的方式,Promtail 是 Loki 的代理,负责收集日志并将其发送给 Loki。你可以创建相应的 Kubernetes 配置文件,定义 Loki 和 Promtail 的部署和服务。
- 使用 Helm Chart 部署 Loki: Helm Chart 是 Kubernetes 的包管理工具,可以用来部署 Loki。首先需要添加 Loki 的 Helm 仓库,然后使用 helm install 命令安装 Loki。安装时可以指定一个 values 文件来覆盖默认配置。
基于 Docker Compose 安装 Loki
参考官方部署手册:https://grafana.com/docs/loki/latest/get-started/quick-start/
官方docker-compose快速部署架构图有下面这些组件:使用的最新版本3.1.x
轻量级日志管理平台Grafana Loki搭建及应用
flog :生成日志行。 flog是常见日志格式的日志生成器。
Grafana Alloy :从 flog 中刮取原木线,并通过网关将它们推送给 Loki。
网关(nginx),接收请求并根据请求的 URL 将它们重定向到适当的容器。
Loki 读取组件:运行查询前端和查询器。
Loki 写入组件:运行分发器和接收器。
Loki 后端组件:运行 Index Gateway、Compactor、Ruler、Bloom Compactor(实验性)和 Bloom Gateway(实验性)。
Minio :Loki 用它来存储索引和块。
Grafana :提供 Loki 中捕获的日志行的可视化。
上面官方采用的是读写分离以及minio存储后端,启动的组件比较多,本人调整了成单节点部署测试,想初步体验的可以使用我下面的 docker-compose.yaml 快速部署。
[推荐参考这篇文章即可]轻量级日志管理平台Grafana Loki搭建及应用
参考URL: https://cloud.tencent.com/developer/article/2448658
物理部署protmail
若你需要采集其他机器上的日志,那么你只需要安装采集组件protmail,docker版本在上面已经演示过了,下面演示使用物理部署。
MinIO
Minio就是一个开源的、自托管的分布式对象存储服务,分布式架构,可部署在本地服务器、私有云或公有云。
数据访问:基于标准的 Amazon S3 API,支持 RESTful API 访问文件,可以使用标准的 S3 客户端工具(如 aws-cli、MinIO 控制台等)与 MinIO 交互。
协议支持:支持 S3 协议,因此可以无缝集成到现有的 S3 应用和生态系统中,方便与 AWS、Azure、Google Cloud 等其他云服务互通。
K8s集群部署Loki采集
K8s集群部署Loki采集,用NFS持久存储,日志保留7天
参考URL: https://blog.csdn.net/Lilk5/article/details/140174359
如何在k8s集群中安装配置loki并使用grafana可视化管理
参考URL: https://www.cnblogs.com/wod-Y/p/17348436.html
Helm 部署方式和案例
Install Grafana Loki with Helm官方文档:https://grafana.com/docs/loki/latest/setup/install/helm/
使用 Helm 安装 Loki Stack
参考URL: https://todoit.tech/k8s/loki/
- 前提条件
在开始之前,请确保您已经:
安装了 Kubernetes 集群
安装了 Helm
配置了 kubectl 连接到您的集群
-
添加 Grafana Helm 仓库
-
创建 values.yaml 自定义配置文件
-
安装 Loki
# 使用自定义配置安装
helm install loki grafana/loki \
-n monitoring \
-f loki-values.yaml \
--create-namespace
- 验证安装
# 检查 Loki Pod 状态
kubectl get pods -n monitoring -l app.kubernetes.io/name=loki
# 查看服务
kubectl get svc -n monitoring | grep loki
- 配置 Grafana 数据源(可选)
在 Grafana 中添加 Loki 数据源:
URL: http://loki-gateway.monitoring.svc.cluster.local
参考
真香,Grafana开源Loki日志系统取代ELK?
参考URL: https://blog.csdn.net/projim_tao/article/details/129338320
Loki vs ELK:谁是日志收集的终极选择?
参考URL: https://blog.csdn.net/problc/article/details/142330846
Grafana Loki 架构详解,比 ES 成本低很多
参考URL: https://segmentfault.com/a/1190000045124031
【写的好,推荐阅读】详解轻量日志聚合系统 Loki 架构
参考URL: https://xie.infoq.cn/article/5376127f5956a99941bbb1e00
k8s集群监控cadvisor+prometheus+grafana部署
参考URL: https://blog.csdn.net/weixin_48878440/article/details/128374447
Kubernetes 日志解决方案 Grafana Loki 「Helm 部署案例」
参考URL: https://cloud.tencent.com/developer/article/2307121
基于 Docker Compose 安装 Loki
参考URL:https://blog.csdn.net/a120608yby/article/details/140660210
轻量级日志系统docker-compose搭建Loki+Grafana+Promtail,配置、部署,查询全流程
参考URL:https://tencentcloud.csdn.net/6762647af3b8a55e4e985821.html