Loki - 使用 Prometheus 方法收集日志

致敬,哈布罗维特人! 预计该课程将开始新的注册 “DevOps 实践和工具” 为您准备了有趣材料的翻译。

本文是对洛基的简单介绍。 洛基计划 由格拉法纳支持 旨在集中收集日志(来自服务器或容器)。

洛基的主要灵感是 普罗米修斯 把他的方法应用于日志管理的想法:

  • 使用标签来存储数据
  • 资源消耗低

我们将回到 Prometheus 的原理,并给出一些在 Kubernetes 环境中使用它的示例。

关于普罗米修斯的几句话

为了充分理解 Loki 的工作原理,退后一步并重新审视一下 Prometheus 非常重要。

Prometheus 的显着特征之一是从收集点(通过导出器)提取指标并将其存储在 TSDB(Time Series Data Base,时间序列数据库)中,并以标签形式添加元数据。

为什么这是必要的

最近,Prometheus 已经成为容器和 Kubernetes 领域事实上的标准:它的安装非常简单,Kubernetes 集群最初就有 Prometheus 的端点。 Prometheus 还可以从容器中部署的应用程序中提取指标,同时维护特定标签。 因此,应用程序监控非常容易实现。

不幸的是,日志管理仍然没有交钥匙解决方案,您必须自己找到解决方案:

  • 用于集中日志的托管云服务(AWS、Azure 或 Google)
  • 监控服务“监控即服务”(例如,Datadog)
  • 创建您自己的日志收集服务。

对于第三个选项,我传统上使用 Elasticsearch,尽管事实上我并不总是对它感到满意(尤其是它的笨重和设置的复杂性)。

Loki 的设计遵循以下原则,易于实现:

  • 容易上手
  • 消耗很少的资源
  • 独立工作,无需任何特殊维护
  • 作为 Prometheus 的附加组件来帮助错误调查

然而,这种简单性是以一些妥协为代价的。 其中之一是不对内容建立索引。 因此,文本搜索不是很高效或丰富,并且不允许您对文本内容进行统计。 但由于 Loki 希望成为 grep 的等价物并补充 Prometheus,因此这并不是一个缺点。

事件调查

为了更好地理解为什么 Loki 不需要索引,让我们回到 Loki 开发人员使用的事件调查方法:

Loki - 使用 Prometheus 方法收集日志
1 警报 → 2 仪表板 → 3 即席查询 → 4 日志聚合 → 5 分布式跟踪 → 6 修复!
(1 警告 → 2 仪表板 → 3 即席查询 → 4 日志聚合 → 5 分布式跟踪 → 6 修复!)

我们的想法是,我们收到某种警报(Slack 通知、短信等),然后:

  • 查看 Grafana 仪表板
  • 查看服务指标(例如,在 Prometheus 中)
  • 查看日志条目(例如,在 Elasticsearch 中)
  • 也许看看分布式跟踪(Jaeger、Zipkin 等)
  • 并最终解决原来的问题。

在这里,对于 Grafana + Prometheus + Elasticsearch + Zipkin 堆栈的情况,您将必须使用四种不同的工具。 为了节省时间,最好能够使用一种工具完成所有这些步骤:Grafana。 值得注意的是,这种研究方法从 Grafana 第 6 版开始就已在 Grafana 中实现。因此,可以直接从 Grafana 访问 Prometheus 数据。

Loki - 使用 Prometheus 方法收集日志
资源管理器屏幕分为普罗米修斯和洛基

在此屏幕中,您可以使用分屏概念查看 Loki 中与 Prometheus 指标相关的日志。 从版本 6.5 开始,Grafana 允许您解析 Loki 日志条目中的跟踪 ID,以跟踪您最喜欢的分布式跟踪工具 (Jaeger) 的链接。

Loki本地测试

在本地测试 Loki 最简单的方法是使用 docker-compose。 docker-compose 文件位于 Loki 存储库中。 您可以使用以下命令获取存储库 git:

$ git clone https://github.com/grafana/loki.git

然后需要切换到生产目录:

$ cd production

之后,您可以获得最新的Docker镜像:

$ docker-compose pull

最后,使用以下命令启动 Loki 堆栈:

$ docker-compose up

洛基架构

这是 Loki 架构的小图:

Loki - 使用 Prometheus 方法收集日志
Loki 架构原则

Web 客户端在服务器上运行应用程序,Promtail 收集日志并将其发送给 Loki,Web 客户端还将元数据发送给 Loki。 Loki 聚合所有内容并将其传递给 Grafana。
洛基正在奔跑。 要查看可用组件,请运行以下命令:

$ docker ps

如果是新安装的 Docker,该命令应返回以下输出:

IMAGE               PORTS                  NAMES
grafana/promtail:                          production_promtail_1
grafana/grafana: m  0.0.0.0:3000->3000/tcp production_grafana_1
grafana/loki: late  80/tcp,0.0.0.0:3100... production_loki_1

我们看到以下组件:

  • Promtail:负责集中日志的代理
  • Grafana:著名的仪表板工具
  • Loki:数据集中守护进程

作为经典基础架构(例如基于虚拟机)的一部分,Promtail 代理必须部署在每台机器上。 Grafana 和 Loki 可以安装在同一台机器上。

部署到 Kubernetes

在 Kubernetes 中安装 Loki 组件如下:

  • daemon设置为在服务器集群中的每台机器上部署Promtail代理
  • 洛基部署
  • 最后一个是Grafana的部署。

幸运的是,Loki 可作为 Helm 包提供,使其易于部署。

通过 Heml 安装

您应该已经安装了 Heml。 可以从项目的 GitHub 存储库下载它。 它是通过提取适合您的架构的存档并将 helm 添加到来安装的 $PATH.

注: Helm 3.0.0 版本最近发布。 由于它已经发生了很多变化,建议读者稍等一下再开始使用它。.

添加 Helm 源

第一步是使用以下命令添加“loki”存储库:

$ helm add loki https://grafana.github.io/loki/charts

之后,您可以搜索名为“loki”的包:

$ helm search loki

结果:

loki/loki       0.17.2 v0.4.0 Loki: like Prometheus, but for logs.
loki/loki-stack 0.19.1 v0.4.0 Loki: like Prometheus, but for logs.
loki/fluent-bit 0.0.2  v0.0.1 Uses fluent-bit Loki go plugin for...
loki/promtail   0.13.1 v0.4.0 Responsible for gathering logs and...

这些软件包具有以下功能:

  • 洛基 只匹配Loki服务器
  • 洛基/流利位 允许您使用 Fluent-bin 来部署 DaemonSet 来收集日志而不是 Promtail
  • 洛基/promtail 包含日志收集代理
  • 洛基/洛基堆栈,让您可以立即将 Loki 与 Promtail 一起部署。

安装洛基

要将 Loki 部署到 Kubernetes,请在“monitoring”命名空间中运行以下命令:

$ helm upgrade --install loki loki/loki-stack --namespace monitoring

要保存到磁盘,请添加选项 --set loki.persistence.enabled = true:

$ helm upgrade --install loki loki/loki-stack 
              --namespace monitoring 
              --set loki.persistence.enabled=true

注: 如果要同时部署Grafana,则添加参数 --set grafana.enabled = true

运行此命令时,您应该得到以下输出:

LAST DEPLOYED: Tue Nov 19 15:56:54 2019
NAMESPACE: monitoring
STATUS: DEPLOYED
RESOURCES:
==> v1/ClusterRole
NAME AGE
loki-promtail-clusterrole 189d
…
NOTES:
The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.
See <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> for more details.

查看“monitoring”命名空间中 Pod 的状态,我们可以看到一切都已部署:

$ kubectl -n monitoring get pods -l release=loki

结果:

NAME                 READY  STATUS   RESTARTS  AGE
loki-0               1/1    Running  0         147m
loki-promtail-9zjvc  1/1    Running  0         3h25m
loki-promtail-f6brf  1/1    Running  0         11h
loki-promtail-hdcj7  1/1    Running  0         3h23m
loki-promtail-jbqhc  1/1    Running  0         11h
loki-promtail-mj642  1/1    Running  0         62m
loki-promtail-nm64g  1/1    Running  0         24m

所有 Pod 都在运行。 现在是时候做一些测试了!

连接到 Grafana

为了连接到 Kubernetes 下的 Grafana,您需要打开一条通往其 pod 的隧道。 以下是为 Grafana Pod 打开端口 3000 的命令:

$ kubectl -n port-forward monitoring svc/loki-grafana 3000:80

另外重要的一点是需要恢复Grafana管理员密码。 密码保密 loki-grafana 在现场 .data.admin-user 以base64 格式。

要恢复它,您需要运行以下命令:

$ kubectl -n monitoring get secret loki-grafana 
 --template '{{index .data "admin-password" | base64decode}}'; echo

将此密码与默认管理员帐户 (admin) 结合使用。

Grafana 中的 Loki 数据源定义

首先,确保Loki数据源(配置/数据源)已创建。
这是一个例子:

Loki - 使用 Prometheus 方法收集日志
为 Loki 设置数据源的示例

通过单击“测试”,您可以测试与 Loki 的连接。

向洛基提出请求

现在转到 Grafana 并转到“探索”部分。 当从容器接收日志时,Loki 会添加来自 Kubernetes 的元数据。 这样就可以查看特定容器的日志。

例如,要选择 promtail 容器日志,您可以使用以下查询: {container_name = "promtail"}.
不要忘记在这里选择 Loki 数据源。

此查询将返回容器活动,如下所示:

Loki - 使用 Prometheus 方法收集日志
Grafana 中的查询结果

添加到仪表板

从 Grafana 6.4 开始,可以将日志信息直接放在仪表板上。 之后,用户将能够在其站点上的请求数与应用程序跟踪之间快速切换。

下面是实现此交互的示例仪表板:

Loki - 使用 Prometheus 方法收集日志
包含 Prometheus 指标和 Loki 日志的示例仪表板

洛基的未来

我早在五月/六月就开始使用 Loki 0.1 版本。 今天已经发布了版本 1,甚至还有 1.1 和 1.2。

必须承认0.1版本还不够稳定。 但 0.3 已经显示出真正成熟的迹象,而接下来的版本(0.4,然后是 1.0)只会强化这种印象。

1.0.0之后,没有人可以有借口不使用这个奇妙的工具。

进一步的改进不应该是关于 Loki,而是它与优秀的 Grafana 的集成。 事实上,Grafana 6.4 已经与仪表板有了很好的集成。

最近发布的 Grafana 6.5 通过自动识别 JSON 格式的日志内容,进一步改进了这种集成。

下面的视频显示了此机制的一个小示例:

Loki - 使用 Prometheus 方法收集日志
使用在 Grafana 中渲染的 Loki 字符串

可以使用 JSON 字段之一,例如:

  • 链接到外部工具
  • 日志内容过滤

例如,您可以单击traceId 转到Zipkin 或Jaeger。

像往常一样,我们期待您的评论并邀请您 开放网络研讨会,我们将谈论DevOps行业在2019年的发展情况,并讨论2020年可能的发展路径。

来源: habr.com