paint-brush
如何使用 Docker 容器或直接从源代码部署 Grafana Loki 并将数据保存到 MinIO经过@minio
11,690 讀數
11,690 讀數

如何使用 Docker 容器或直接从源代码部署 Grafana Loki 并将数据保存到 MinIO

经过 MinIO11m2023/08/01
Read on Terminal Reader

太長; 讀書

虽然日志很常见,但它包含有关系统操作的关键信息,并且是调试和故障排除信息的宝贵来源。
featured image - 如何使用 Docker 容器或直接从源代码部署 Grafana Loki 并将数据保存到 MinIO
MinIO HackerNoon profile picture
0-item
1-item

Grafana Loki 是一个日志聚合系统,用于存储和查询来自应用程序和基础设施的日志。虽然日志很常见,但它包含有关系统操作的关键信息,并且是调试和故障排除信息的宝贵来源。日志经常用于识别和跟踪恶意活动,或者只是跟踪用户活动以提供商业情报。


在之前的博客文章《使用 Grafana Loki 和 MinIO 进行日志记录》中,我们概述了 Loki 的组件及其整体架构。将 Loki 的日志视为类似于 Prometheus 的指标。 Loki 是轻量级且经济高效的,因为它只索引和查询元数据。 Promtail 代理收集、标记和转换日志,然后将其发送给 Loki。然后,Loki 索引元数据并将条目分组到使用标签索引的流中。然后使用 Grafana 可视化和查询来自 Loki 的日志信息。从版本 2.0 开始,Loki 将数据存储在单个对象存储后端中,例如 MinIO。上一篇博文解释了将 Loki 数据保存到 MinIO 的优点,而这篇博文则是教您如何操作的教程。


首先,我们将教您如何使用 Docker 容器部署 Loki 和 MinIO,然后介绍如何从源代码安装。

使用 Docker 容器学习 Loki 并掌握 MinIO

我们使用 Docker 容器、一些脚本和 Git 存储库构建了一个演示。我们从 Grafana Loki 存储库开始,添加了 MinIO 的配置 yaml 和容器,以及用于创建和公开 Loki 数据的 MinIO 存储桶的脚本。以下步骤将导致这五个映像在 Docker 容器中本地运行:


  • 洛基
  • 普罗姆泰尔
  • 格拉法纳
  • 最小IO
  • 创建存储桶


Loki、Promtail 和 Grafana 显然需要前三个。它们已经可以从Loki 存储库下的 Grafana 获得(有一个简短的视频解释器)。 MinIO 是 Loki 的对象存储,最终容器将运行一个脚本来创建存储桶作为 Loki 目标。


Loki 已配置为使用loki.yaml将日志数据保存到 MinIO。特别重要的是以下部分:


 storage_config: boltdb_shipper: active_index_directory: /loki/index cache_location: /loki/index_cache resync_interval: 5s shared_store: s3 aws: s3: http://minioadmin:minioadmin@minio.:9000/loki s3forcepathstyle: true


请注意 MinIO 的 S3 地址中的点。使用此选项是因为无需指定 AWS 区域。


我们使用docker-compose.yaml文件创建 Docker 环境。我们将配置容器、卷、端口、网络并提供启动命令。


为了让loki镜像作为容器运行并通过卷访问 Loki 配置:


 services: loki: image: grafana/loki:latest volumes: - <your-local-path>/loki/production:/home/loki/production ports: - "3100:3100" command: -config.file=/home/loki/production/loki.yaml networks: - loki


您需要进行的第一个配置是确保您的本地production文件夹与容器共享。请编辑docker-compose.yamlvolumes部分,以引用您下载production文件夹的主机系统上的本地文件夹。我们将主机路径映射到容器路径以便读取loki.yaml


docker-compose.yaml中,我们还定义了一个网络并公开运行 MinIO 服务器的容器的端口。在这种情况下,端口 9000 和 9001 将暴露给您的本地计算机,以便您使用浏览器访问 MinIO 服务器。


 Console UI: minio: image: minio/minio:latest ports: - "9000:9000" - "9001:9001" networks: - loki command: server ~ --address ':9000' --console-address ':9001'


我们将网络配置为所有容器共享一个loki网络。每个容器都可以 ping 其他容器并使用它们的 API。不要为容器使用固定 IP 地址。为了使其更容易,我们在环境中配置了lokiminio以解析到适当的容器。例如:

 http://minio:9000 for MinIO http://loki:3100 for Loki http://loki:3000 for Grafana


docker-compose.yaml采取的下一个操作是在容器中运行 MinIO 客户端(mc)来配置 MinIO 服务器,为 Loki 数据创建目标存储桶,并根据需要将访问策略设置为public


 createbuckets: image: minio/mc networks: - loki depends_on: - minio entrypoint: > /bin/sh -c " /usr/bin/mc config host add myminio http://minio:9000 minioadmin minioadmin; /usr/bin/mc rm -r --force myminio/loki; /usr/bin/mc mb myminio/loki; /usr/bin/mc policy set public myminio/loki; exit 0; "


Promtail 是一个小型 Go 程序,用于跟踪或收集分布式日志文件并将其传递给 Loki。对于此演示,Promtail 部署在其容器中,并带有一个用于抓取 /var/log 目录的配置文件。无需进行任何更改即可运行此演示并让它处理该位置的日志文件 - /var/log。


在本教程的最后,我们将介绍如何让 Promtail 抓取系统上其他位置的日志文件。

脚步

现在您已经了解如何配置 Loki、Promtail 和 Docker 环境,请按照以下步骤配置和运行演示环境。以下步骤使用docker-compose.yamlloki.yaml和默认的 Promtail 配置来演示 Loki 如何与 MinIO 配合使用。下载我们的文件后,根据您的环境进行编辑。


克隆此存储库https://github.com/cniackz/loki

git clone https://github.com/cniackz/loki.git minio-loki-tutorial


将目录更改为本地production文件夹:


https://github.com/cniackz/loki/tree/main/product


 cd <your-local-path>/minio-loki-tutorial/production Edit docker-compose.yaml to reference your local home directory If necessary, edit promtail.yaml


构建本地 Docker 环境:

docker-compose build --no-cache


启动本地 Docker 容器:

docker-compose up -d


要确认 Loki 数据已保存到 MinIO,请通过http://localhost:9001http://minio:9001登录 MinIO 控制台。本教程使用以下凭据:


 user: minioadmin password: minioadmin 



登录后,单击存储桶。您应该看到 Loki 存储桶已创建。



单击右侧的“浏览”即可查看新创建的存储桶的内容。您应该在loki下看到fake目录。这是 Loki 保存数据的地方。



单击其名称以打开fake目录。 Loki 将日志保存在内存中一段配置的时间间隔,然后将它们写入对象存储。默认间隔为 5 分钟,因此请等待 5 分钟,数据就会出现在您的存储桶中。



此时,Promtail 正在向 Loki 发送日志,Loki 正在将数据保存到 MinIO。现在,让我们设置 Grafana 来查看 Loki 日志。 Grafana 6.0 及更高版本包含对 Loki 的内置支持。 Grafana 6.3 及更高版本包括对LogQL功能的支持。


通过http://loki:3000登录 Grafana(默认凭据为 admin:admin)。


在 Grafana 中,单击左侧边栏上的齿轮图标以转到“配置”,然后单击“数据源”。单击“添加数据源”大按钮,然后选择 Loki。



使用 Docker 端口映射编辑本地运行的 Loki 服务器的 http URL 字段: http://loki:3100



然后单击“保存并测试”。


要立即查看日志,请单击“浏览”。您还可以通过单击左侧边栏中的“探索”来查看日志。无论您如何探索,然后在左上角的下拉列表中选择 Loki 数据源,然后使用“日志标签”按钮选择日志流。



您可以键入 LogQL 查询并单击“运行查询”。但是,如果您还不了解 LogQL,则可以使用 GUI 选择日志和查询参数。


要快速查看 Loki 中的日志,请单击日志浏览器,然后在1. Select labels to search in选择job ,然后在2. Find values for the selected labels下单击您的作业名称(来自promtail-local-config.yaml )。在本例中,我单击了varlogs 。然后单击显示日志按钮。


您可以在浏览器窗口的右上角选择时间范围并设置查询的刷新间隔。



要查看日志的更多详细信息,请向下滚动并单击其中一个日志条目,它将提供与该日志条目相关的其他信息。



一个真正强大的功能是能够通过单击图标直接从日志详细信息中过滤或查看有关labelsfields的统计信息。这简化了故障排除,因为它可以更轻松地查找重复出现的错误并在搜索词之间进行切换。

扩展演示

演示运行后,下一步是让 Promtail 抓取一组可能对您的用例更有趣的不同文件。为此,我们需要使用可编辑的配置文件来运行 Promtail。实现此目的的一种方法是在 Docker 中使用卷。


编辑docker-compose.yaml文件以创建 2 个可从 Promtail 容器访问的新卷。第一个提供对主机系统上将在其中创建新配置文件的目录的访问。第二个提供对包含感兴趣的日志文件的目录的访问。此外,Promtail 将引用新的配置文件启动,我们将其称为promtail-local-config.yaml


 version: "3" networks: loki: services: loki: image: grafana/loki:latest volumes: - <your-local-path>/loki/minio-loki-tutorial/production:/home/loki/production ports: - "3100:3100" command: -config.file=/home/loki/production/loki.yaml networks: - loki promtail: image: grafana/promtail:2.4.2 volumes: - /var/log:/var/log -- <your-local-path>/loki/minio-loki-tutorial/production:/home/loki/production -- <your-local-path>/access_logs:/home/loki/access_logs command: -config.file=/home/loki/production/promtail-local-config.yaml networks: - loki grafana: image: grafana/grafana:latest ports: - "3000:3000" networks: - loki minio: image: minio/minio:latest ports: - "9000:9000" - "9001:9001" networks: - loki command: server ~ --address ':9000' --console-address ':9001' createbuckets: image: minio/mc networks: - loki depends_on: - minio entrypoint: > /bin/sh -c " /usr/bin/mc config host add myminio http://minio:9000 minioadmin minioadmin; /usr/bin/mc rm -r --force myminio/loki; /usr/bin/mc mb myminio/loki; /usr/bin/mc policy set public myminio/loki; exit 0; "


您还可以在 Grafana 中使用日志数据执行更多操作。对于初学者来说,您可以在更多地方安装 promtail,以便向 Loki 跟踪更多日志。将可执行文件和promtail-local-config.yaml复制到其他计算机/实例/容器,按照Promtail 配置中所述编辑配置并运行它。


我们现在需要创建 Promtail 配置文件promtail-local-config.yaml以将本地系统日志发送到 Loki。从 Grafana 下载并编辑示例配置文件。要重点关注的部分是scrape_configs ,因为这是告诉 promtail 要提取哪些日志、如何格式化它们以及将它们发送到哪里的地方。请参阅 获取 Loki 日志,了解有关配置 promtail 的更多信息。


scrape_configs部分包括以下内容:


  • job_name - 这可以区分从其他日志组收集的日志。
  • 目标 - static_configs可选。然而,经常被定义,因为在旧版本的 Promtail 中它不是可选的。这是直接使用 Prometheus 服务发现代码的产物,需要此条目。
  • labels - 应用于此定义抓取的每个日志行的静态标签。很好的例子包括环境名称、作业名称或应用程序名称。
  • path - Loki 要使用的日志的存储路径。


 server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://loki:3100/loki/api/v1/push scrape_configs: - job_name: apache static_configs: - targets: - localhost labels: job: access_logs __path__: /home/loki/access_logs/*log


了解 Promtail 中抓取的不同配置选项非常重要,Grafana 提供了大量详细信息


查阅完整的promtail 配置参考以了解应用程序的全部功能可能会有所帮助。


最后,将一些 Apache Web 服务器访问日志放置在主机系统上docker-compose.yaml文件指定的目录中。这些是 Promtail 将摄取并发送给 Loki 进行处理的日志:


-- <your-local-path>/access_logs:/home/loki/access_logs


完成编辑并将示例 Apache 访问日志放置到位后,使用 docker compose 关闭并备份容器:


 docker-compose down docker-compose up -d


Promtail 随后将加载新的 Apache 访问日志文件并使 Loki 可以使用它们。


我们在本教程中创建的环境对于 Loki 入门很有帮助,但它还不能用于生产。下一步是将 Docker 留给 Kubernetes,并使用分布式 MinIO 而不是单个实例。最终,Loki 数据变得足够大,可以从外部数据库中受益以进行快速索引搜索。请参阅可扩展性 - 使用 Grafana Loki 进行扩展以了解更多信息。

结论

Grafana、Prometheus 和 AlertManager 的可观测性堆栈通过 Loki 获得了强大的补充(顺便说一句,我们还在MinIO 上提供了 Grafana、Prometheus 和 AlertManager的教程)。分布式系统,尤其是由 Kubernetes 容器化和编排的系统,其应用程序和微服务有许多日志。 Loki 与 MinIO 结合是一种经济高效的收集、存储和查询日志的方式。


如果您有任何疑问,请发送电子邮件至[email protected] ,或加入MinIO slack 频道并提问。


也发布在这里