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

How To Deploy Grafana Loki and Save Data to 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 文件和容器,以及一个创建并公开 MinIO 存储桶以存放 Loki 数据的脚本。以下步骤将使这五个映像在 Docker 容器中本地运行。

  • Loki
  • Promtail
  • Grafana
  • MinIO
  • 创建存储桶

前三个是 Loki、Promtail 和 Grafana 显然需要的。它们已经在 Grafana 的 Loki 存储库 下可用(有一个简短的 视频说明)。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.yaml 文件的 volumes 部分,以引用主机系统上您下载 production 文件夹的本地文件夹。我们正在将主机路径映射到容器路径,以便读取 loki.yaml

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

控制台界面:
  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    用于 MinIO

http://loki:3100     用于 Loki

http://loki:3000     用于 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/production

cd <your-local-path>/minio-loki-tutorial/production

编辑 docker-compose.yaml 文件,以引用您的本地主目录。

如有必要,编辑 promtail.yaml。

构建您的本地 Docker 环境。

docker-compose build --no-cache

启动本地 Docker 容器。

docker-compose up -d

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

user: minioadmin
password: minioadmin

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

在右侧,单击“Browse”以查看新创建的存储桶的内容。您应该会看到 loki 下的 fake 目录。这是 Loki 保存数据的位置。

单击其名称以打开 fake 目录。Loki 会将日志保存在内存中,直到配置的时间间隔过后,才会将其写入对象存储。默认时间间隔为 5 分钟,因此请等待 5 分钟,以便数据显示在您的存储桶中。

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

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


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

编辑“http URL”字段,使其指向我们使用 Docker 端口映射在本地运行的 Loki 服务器:http://loki:3100

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

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

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

要快速查看 Loki 中的日志,请单击“日志浏览器”,然后在“1. 选择要搜索的标签”下选择“job”,然后在“2. 查找所选标签的值”下单击您的作业的名称(来自 promtail-local-config.yaml)。在本例中,我单击了“varlogs”。然后单击“显示日志”按钮。

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

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

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

扩展演示

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

编辑 docker-compose.yaml 文件以创建两个可从 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 - 这区分了从其他日志组收集的日志。
  • targets - 对于 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 配置参考 可能会有所帮助,以便了解应用程序的全部功能。

最后,在主机系统上 docker-compose.yaml 文件中指定的目录中放置一些 Apache Web 服务器访问日志。这些是 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 相结合是一种经济高效的方式来收集、存储和查询日志。

如有任何问题,请发送电子邮件至:hello@min.io,或加入 MinIO Slack 频道 并提出问题。