Loki诞生背景 Kubernetes已经成为编排领域事实上的标准,同时Prometheus也成为基于Kubernetes平台之上、监控领域的标配。Prometheus能够收集业务metrics数据,Grafana界面展示,AlertManage…

一、Loki日志系统

1.1 Loki诞生背景

Kubernetes 已经成为编排领域事实上的标准,同时 Prometheus 也成为基于 Kubernetes 平台之上、监控领域的标配。 Prometheus 能够收集业务 metrics 数据, Grafana 界面展示, AlertManager 告警,一站式的监控框架就此诞生。通过这一套框架可以在线监控服务运行状态,如果不正常,能够通过各种途径通知给相关人员;相关人员通过查看告警信息,通过日志分析出现问题具体原因。

我们可以进入 Pod 中查询,如果 Pod 进程已经崩溃,那么将无法进入容器内部,没关系, Pod 所在宿主机挂载的日志文件,你不得不询已经崩溃 Pod 所在宿主机,然后通过命令行进入宿主机中查询日志,这样的话如果碰到一个服务多个副本运行在同一个节点上,那么可能会出现日志交叉打印的情况,服务崩溃还没有解决,你已经崩溃了,其实出现这种问题的真正原因是 Kubernetes 超强的自动横向扩容能力,你可能无法准确预测到服务副本数量和所在节点,大多数公司是基于 ELK (日志收集解决方案)搭建一套日志收集和查看平台,就这一套平台不仅耗费资源,而且需要 KibinaGrafana 两套平台之间频繁切换,影响工作效率,为了解决此问题 Loki 问世。
Test从此,一站式的监控、告警、日志分析平台解决了我们不用频繁切换系统的麻烦。

1.2 Loki架构设计思路

Test基于 Loki 的完整的日志收集框架需要三部分完成

  `Promtail` :日志收集客户端,以 `DaemonSet` 方式运行在各个计算节点上、当然也可以通过 `sidercar` 方式运行在 `Pod` 内部。 `Promtail` 本身可以替换为 `fluent-bit` 或者 `fluentd`

Loki :日志收集服务端,接收来自 Promtail 发送的日志

  `Grafana` :日志展示 
 

Loki 是一个高可用、可扩展、多租户的日志收集系统,受 Prometheus 启发而出现,但 Loki 侧重点在于日志并且通过客户端推送获取日志信息, Prometheus 更多在于监控指标并且通过拉取获取指标信息,相比于其它日志系统具有以下优势:

 非常节省资源,提供日志压缩功能。 
 

 没有把全文添加到索引中,而是把标签加入到索引中,对于用过 `Prometheus` 的人来说,使用起来非常顺手。 
 

 
 非常适合存储和搜索 `Kubernetes Pod` 的日志,因为它能够把 `Pod` 所在的节点信息、容器信息、命名空间、标签添加到索引中。 
 

 
 原生支持 `Grafana 6.0` 以上版本。 
 
Loki内部组件介绍

Test

  Distributor 
 

它的主要功能是接收来自客户端的日志, Distributor 接收到日志之后,首先会校验正确性,校验通过之后会把它划分为多个批次,并发送给 Ingester 。每个发送过来的流都对应一个 Ingester ,当日志发送到 Distributor 之后, Distributor 会根据 hash 和元数据算法计算应该路由到那个 Ingester 上。

其中 DistributorIngester 之间是通过 gRPC 通信,都是无状态应用,支持横向扩展。

  Ingester 
 

它的主要功能是接收来自 Distributor 发送的日志并写入到后端存储中,其中后端存储可以是 DynamoDB、 S3、 Cassandra、FS 等等。其中需要注意, ingester 会严格验证接收到的日志行是以时间戳升序接收的(即,每个日志的时间戳都比之前的日志晚一些)。

ingester 收到不遵循此顺序的日志时,日志行将被拒绝,并返回错误( Entry out of order )。
总结起来说,首先 distributor 会接受来自外部数据流请求发送,每个数据流都有自己的一致性 hash ,然后 distributor 通过计算 hash ,把数据流发送到正确的 ingester 上面; ingester 会创建 chunk 或者或者追加数据到已存在 chunk 上面(必须保证租户和标签唯一),最后完成数据存储。

  Chunks和index 
 

ChunksLoki 长期数据存储,旨在提供查询和写入操作,支持 DynamoDB、Bigtable、 Cassandra、S3、FS (单机)。 index 是根据 chunks 中元数据生成的索引,支持 DynamoDB、Bigtable、 Apache Cassandra、BoltDB (单机)。默认情况下 Chunks 使用 FS 本地文件系统存储,文件系统存储存在一定的限制,大约可以存储 550Wchunk ,超过这个限制可能会有问题。

Index 使用 BoltDB 存储, BoltDB 是相当出名的 Go 实现的 KV 读写引擎, 用户有 etcd 等。如果需要支持高可用部署,则需要引入大数据组件

 Query 
 
 
 主要负责调度前端的查询请求,首先会 
  `Ingesters` 内存中查询数据,然后再回退到后端存储中查询数据,支持并行化查询和数据缓存。 
 

1.3 Loki配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
github.com/grafana/loki/blob/v1.5.0/docs/configuration/README.md#storage_config

```


#### 1.4 Loki使用建议
使用 `Loki` 的过程中,可能会疑惑,为了提升查询速度,是不是应该使用尽可能多的标签,因为 `Loki` 本身的索引是由标签生成的,使用其它日志系统的情况下,可以通过添加尽可能多的索引解决查询速度慢的问题,这是常见的思维方式。然而 `Loki` 数据存储设计思想是使用尽可能少的索引,因为 `Loki` 本身会把数据存储为多个数据块,并通过标签中的索引匹配数据块。如果你觉得查询速度慢,可以重新配置分片大小和间隔,也可以通过配置的方式使用尽可能多的查询器并行查询。较小的索引和并行蛮力查询与较大/较快的全文本索引之间的这种权衡使 `Loki` 与其他系统相比可以节省成本。操作大索引的成本和复杂性很高,而且索引一旦建立,通常是固定的,如果您要查询或不查询,则全天 `24` 小时付费,这种设计的优点意味着您可以决定要拥有查询要求是什么,可以根据需要进行更改,同时数据被大量压缩并存储在低成本对象存储中,以将固定的运营成本降至最低,同时仍然具有令人难以置信的快速查询功能, `Loki` 跟云原生思想也是契合的。

#### 1.5 Loki安装

github.com/grafana/loki/blob/v1.5.0/docs/installation/README.md

```


#### 1.6 Promtail
看到这个名字就会想到 `Prometheus` ,其实它们设计思想也是相通的,它作为一个客户端端代理运行在计算节点上,当然也可以通过边车模式运行在 `Pod` 中,主要功能是收集日志、为日志流添加标签、推送日志。

##### 功能配置


`clients` :用于配置 `Loki` 服务端地址



`positions` :收集日志文件位置,在 `Kubernetes` 中服务以 `Pod` 形式运行, `Pod` 生命周期有可能随时结束,所以需要记录日志收集位置并挂载到宿主机,通过位置记录方便下次继续收集。


`scrape_configs` :日志文件收集配置,支持收集 `syslog、jouanl、docker、Kubernetes` 、以及日志文件。根据收集需求,自行配置。



github.com/grafana/loki/blob/v1.5.0/docs/clients/promtail/configuration.md

```


##### 安装部署

github.com/grafana/loki/blob/v1.5.0/docs/clients/promtail/installation.md

```

,不在赘述。

#### 1.7 Grafana配置
`Grafana` 版本应该使用 `6.0` 以上版本。


`admin` 账号登录
`Grafana` 实例


左侧菜单栏点击 `Configuration > Data Sources` 点击
`+ Add data source` 按钮


输入
`Loki` 服务地址,如果在本地输入
`localhost:3100` 或者
`Loki svc` 地址:
`loki:3100`
``




点击右侧
`Explore` ,会提示
`Log labels` 搜索按钮,点击即可搜索。



`github.com/grafana/loki/blob/v1.5.0/docs/logql.md`


#### 1.8 总结
以上就是我对 `Loki` 使用过程中的心得总结, `Loki`
``` 用户体验良好,设计优雅,但是配置复杂,本文有很多无法覆盖到知识点,如有问题或者想深入讨论的同学请
K8S集群模式下fluent-bit日志收集方案
Kubernetes集群环境下fluentd日志收集方案
轻量级日志收集转发 | fluent-bit
日志收集,我用洛基

本文标题: Loki漫谈

发布时间: 2021年01月10日 00:00

最后更新: 2025年12月30日 08:54

原始链接: https://haoxiang.eu.org/586ed3ca/

版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!

× 喜欢就赞赏一下呗!
打赏二维码