如何部署 Grafana Loki 并将数据保存到 MinIO

如何部署 Grafana Loki 并将数据保存到 MinIO

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特别重要的是以下部分:

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 环境docker-compose.yaml我们将配置容器、卷、端口、网络并提供启动命令。

为了使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正在与容器共享。请编辑volumes您的部分docker-compose.yaml以引用您下载文件夹的主机系统上的本地文件夹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 Client (mc) 以配置 MinIO Server,为 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.yaml,loki.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/production

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:9001或登录 MinIO 控制台http://minio:9001本教程使用以下凭据:

用户:minioadmin密码:minioadmin


pasted image 0 - 2023-04-02T183723.972.png


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


pasted image 0 - 2023-04-02T183746.776.png


在右侧点击浏览,可以看到新建的bucket中的内容。您应该会fakeloki这是 Loki 将保存数据的地方。


pasted image 0 - 2023-04-02T183809.628.png


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


pasted image 0 - 2023-04-02T183830.089.png


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

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


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


pasted image 0 - 2023-04-02T183854.255.png


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


pasted image 0 - 2023-04-02T183917.789.png


然后单击保存并测试。

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


pasted image 0 - 2023-04-02T183941.962.png


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

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

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


pasted image 0 - 2023-04-02T184010.789.png


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


pasted image 0 - 2023-04-02T184036.397.png


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

扩展演示

演示运行后,下一步是让 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 配置promtail-local-config.yaml中所述编辑配置并运行它。

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

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 是一种收集、存储和查询日志的经济高效的方式。

如果您有任何问题,请发送电子邮件至sales@minio.org.cn,或加入MinIO slack 频道并提问。


上一篇 下一篇