Loki 安装

DockerBeginner
立即练习

介绍

Grafana Loki 是一个水平可扩展、高可用、多租户的日志聚合系统,其灵感来源于 Prometheus。它被设计为极具成本效益且易于操作。与其它日志系统不同,Loki 不索引日志的内容,而是索引每个日志流的一组标签(labels)。

在这个 Lab 中,你将使用 Grafana Loki 的官方 Docker 镜像执行一个基础安装。你将学习如何创建一个最小化的配置文件,并将 Loki 服务作为一个容器启动。这是使用 Loki 构建完整日志堆栈(logging stack)的第一步基础。

拉取 Loki Docker 镜像

在这一步,你将从 Docker Hub 下载官方的 Grafana Loki Docker 镜像。docker pull 命令会从仓库(registry)获取一个镜像或一个仓库。你的 Lab 环境已经安装并配置了 Docker。

在终端中执行以下命令来拉取最新的 Loki 镜像:

docker pull grafana/loki

你将看到指示下载进度的输出。Docker 默认会拉取带有 latest 标签的镜像。

预期输出(版本号可能有所不同):

latest: Pulling from grafana/loki
a48641c1b8a9: Pull complete
...
Digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Status: Downloaded newer image for grafana/loki
docker.io/grafana/loki

创建基础 loki-config.yaml 文件

在这一步,你将为 Loki 创建一个最小化的配置文件。这个文件 loki-config.yaml 告诉 Loki 如何运行、在哪里存储数据以及使用哪种 schema(模式)。对于本次 Lab,我们将配置 Loki 使用本地文件系统进行存储。

我们将使用 nano 文本编辑器来创建文件。运行以下命令打开一个名为 loki-config.yaml 的新文件:

nano loki-config.yaml

现在,将以下 YAML 内容复制并粘贴到 nano 编辑器中:

auth_enabled: false

server:
  http_listen_port: 3100

common:
  path_prefix: /tmp/loki
  storage:
    filesystem:
      chunks_directory: /tmp/loki/chunks
      rules_directory: /tmp/loki/rules
  ring:
    kvstore:
      store: inmemory

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

storage_config:
  boltdb_shipper:
    active_index_directory: /tmp/loki/index
    cache_location: /tmp/loki/cache
  filesystem:
    directory: /tmp/loki/chunks

ruler:
  alertmanager_url: http://localhost:9093

limits_config:
  allow_structured_metadata: false

此配置将 Loki 所需的所有内容都保留在容器内的 /tmp/loki 目录下,这可以避免权限问题,并使设置易于理解。它禁用了身份验证(authentication),为单节点使用启用了内存中的环(in-memory ring),并将块(blocks)和索引(indexes)存储在本地文件系统上。

文件中每个部分的作用如下:

  • auth_enabled: false: 关闭身份验证,这样你就可以在没有额外凭证的情况下与 Loki 通信。这使得本地测试更简单;在生产环境中,你会启用身份验证。
  • server.http_listen_port: 3100: 告诉 Loki 在端口 3100 上监听 HTTP 请求。当你 curl localhost:3100 时,你访问的就是这个端口。
  • common.path_prefix: 设置 Loki 在容器内部存储临时数据的基础文件夹。此文件中其他所有路径都基于 /tmp/loki 构建,因此所有内容都保留在一个地方。
  • common.storage.filesystem: 指向 Loki 存储日志数据块(chunks)和规则文件(rule files)的两个文件夹。由于我们没有挂载任何特殊内容到容器中,使用 /tmp/loki 可以避免权限方面的麻烦。
  • common.ring.kvstore.store: inmemory: 将成员信息保存在内存中。对于单节点 Lab 来说这很完美;一个真正的集群会使用像 Consul 或 etcd 这样的共享存储。
  • schema_config: 定义 Loki 应如何布局日志数据的索引。我们设置了一个起始日期,选择了 boltdb-shipper 存储,并将索引保留在文件系统上。prefixperiod 控制文件的命名方式以及新索引文件的创建频率(每 24 小时)。
  • storage_config: 为 boltdb-shipper 索引(active_index_directorycache_location)以及原始块存储提供了确切的文件夹。所有路径再次位于 /tmp/loki 下,以保持整洁。
  • ruler.alertmanager_url: 准备 Loki 的 ruler 组件,以便将警报发送到 http://localhost:9093 的 Alertmanager。如果 Alertmanager 没有运行,Loki 不会崩溃;当它尝试发送警报时,只会记录一个警告。
  • limits_config.allow_structured_metadata: false: 禁用了一个高级功能,以便 Loki 坚持使用初学者期望的更简单、纯文本的日志元数据。

按下 Ctrl+X 退出,然后按 Y 确认保存,最后按 Enterloki-config.yaml 的名称保存文件。

使用配置文件在 3100 端口运行 Loki 容器

现在你已经有了 Loki 镜像和一个配置文件,你将把 Loki 作为一个 Docker 容器来运行。你将使用 docker run 命令来启动容器、挂载你的配置文件并暴露必要的端口。

执行以下命令:

docker run -d --name loki -v $(pwd)/loki-config.yaml:/etc/loki/config.yml -p 3100:3100 grafana/loki -config.file=/etc/loki/config.yml

我们来分解一下这个命令:

  • -d: 在分离模式(detached mode,即后台)下运行容器。
  • --name loki: 为容器指定名称 loki,以便于引用。
  • -v $(pwd)/loki-config.yaml:/etc/loki/config.yml: 将你本地的 loki-config.yaml 文件挂载到容器内的 /etc/loki/config.yml 位置。Loki 将从该文件中读取其配置。
  • -p 3100:3100: 将宿主机(host machine)的端口 3100 映射到容器内的端口 3100,允许你访问 Loki API。
  • grafana/loki: 用于容器的镜像名称。
  • -config.file=/etc/loki/config.yml: 传递给 Loki 进程的命令行参数,告诉它在哪里可以找到配置文件。

运行该命令后,Docker 将打印新创建的容器的唯一 ID。

e8a9f2b1c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0

验证 localhost:3100/ready 上的 Loki 就绪端点

在这一步,你将执行一个健康检查(health check),以确认 Loki 服务器已启动并正常运行。Loki 暴露了一个 /ready HTTP 端点可用于此目的。成功的响应表明服务器已准备好接收请求。

使用 curl 命令向此端点发送请求。由于在上一步中我们将端口 3100 进行了映射,你可以通过 localhost:3100 访问它。

curl http://localhost:3100/ready

如果 Loki 启动成功,它将以文本 ready 和 HTTP 200 OK 状态码进行响应。

预期输出:

ready

检查 Loki 日志以确认启动

验证 Loki 成功启动的另一种方法是检查其容器日志(logs)。这对于调试配置问题或其他启动故障非常有用。docker logs 命令用于获取容器的日志。

使用以下命令查看你的 loki 容器的日志:

docker logs loki

你应该会看到详细说明启动过程的输出。查找确认服务器正在监听连接的日志行。这表明服务已在没有关键错误的情况下初始化。

预期输出片段(日志详情可能有所不同):

level=info ts=... caller=server.go:299 http=[::]:3100 grpc=[::]:9096 msg="server listening on addresses"
level=info ts=... caller=loki.go:372 msg="Loki started"

总结

恭喜你!你已成功完成本次实验(Lab)。

在本次实验中,你学习了启动 Grafana Loki 实例的基本步骤。你已经:

  • 从 Docker Hub 拉取了官方 Loki Docker 镜像。
  • 创建了一个基本的 loki-config.yaml 文件,用于定义服务器和存储设置。
  • 在 Docker 容器中启动了 Loki,挂载了配置文件并暴露了 API 端口。
  • 使用其 /ready 端点并通过检查容器日志,验证了 Loki 实例正在运行且健康。

这个基础设置是构建更复杂、更健壮的日志架构的基础。从这里开始,你可以继续配置一个日志收集代理(如 Promtail)将日志发送到 Loki,并使用 Grafana 来查询和可视化这些日志。