loki的部署模式
grafana loki 在 helm 中版本变化很大,理解部署模式有助于快速 run 一组 loki 服务;loki 服务是一个单体二进制文件运行的微服务架构模式,具体运行的角色通过 -target 参数来区分运行什么组件。
单体模式
单体模式又称整体模式,源自官网 (Monolithic mode),这个模式指的是 -target=all 时运行的服务。需要注意的是单体模式下,每天读写量为 20GB.
Monolithic mode is useful for getting started quickly to experiment with Loki, as well as for small read/write volumes of up to approximately 20GB per day. [1]
该模式下loki 所有的组件都为二进制文件或者容器作为单一进程运行。
SSD
SSD (Simple Scalable deployment mode) 简单可扩展部署模式,是 loki 对内部组件进行分类,当参数 target 我i -target=write , -target=read, -target=backend 时,是作为 SSD mode 启动。其中 write 和 backend 是有状态服务,read 是无状态服务。
微服务模式
微服务模式 (Microservices mode) 指的是,参数 target 制定了对应的组件名字,即每个组件作为独立的微服务运行。可以通过 -list-targets 参数来获取 loki 所有组件。
| |
微服务模式官方推荐在大规模 loki 集群时使用。
Microservices mode is only recommended for very large Loki clusters or for operators who need more precise control over scaling and cluster operations. [2]
Loki的存储
Loki存储日志的方式是将日志的元数据信息作为类似 Prometheus 的 key/value 对的格式进行索引,而日志内容不索引进行存储,大致一条信息的组成为:
| |
在 Loki 2.0 之前版本,loki存储将索引数据和未索引数据分别存储,索引数据包含了相对应的标签,常见为 {app="api", env="production", filename="/var/logs/app.log"} 这种起了唯一的标识;对象存储则负责存储和压缩日志。索引提供负责快速查询的标签。
在 Loki 2.0 后的版本提供了 Single Store,这里存储了包含“索引数据”和“非索引数据”,即只提供了一个存储。
Helm 安装 Loki 2.9
添加 loki 仓库
| |
helm的版本差异
loki helm 有很多不同的模式,官方也提供了诸如 SSD 的 helm,这里采用 loki helm 进行安装。在安装时需要区分版本,loki helm 2.x (最高对应 loki 2.6.1 版本),这里 helm 运行为单一进程的。在 loki helm 3 以上,编默认作为 SSD 模式运行,如果还想运行为“单体模式” 需要自行修改。
下面时 loki helm 2.16.0 的 helm values.yaml
| |
单体模式进行部署
修改 values.yaml, 搜索 singleBinary,修改为 true
| |
注意修改存储模式,在使用到单体的状态下,通常都是进行最小化部署,所以使用 “文件系统” 模式,这里修改文件系统模式
| |
需要注意的是,使用了 filesystem,对应的你的 k8s 集群需要提供 storageClass,以供应用自动获取 pvc
| |
部署 Loki
| |
SSD模式部署
默认模式下,就是 SSD 模式,
| |
而 Ingress 中会根据用户启用了什么模式而分配不同的路由,在文件 grafana/loki/blob/v2.9.2/production/helm/loki/templates/ingress.yaml 中定义
| |
在文件 grafana/loki/blob/v2.9.2/production/helm/loki/templates/_helpers.tpl 可以看到
| |
最后就是 values.yaml 中定义的路由,根据不同的服务,吧请求路由转发到对应的服务上。
| |
后面就配置你要启用的服务即可,read, write, backend, gateway, loki有维护一个表格,包含了该模式下的组件有哪些,backend可以看到是不属于 read, write 模式。
| Component | individual | all | read | write | backend |
|---|---|---|---|---|---|
| Distributor | x | x | x | ||
| Ingester | x | x | x | ||
| Query Frontend | x | x | x | ||
| Query Scheduler | x | x | x | ||
| Querier | x | x | x | ||
| Index Gateway | x | x | |||
| Compactor | x | x | x | ||
| Ruler | x | x | x | ||
| Bloom Planner (Experimental) | x | x | |||
| Bloom Builder (Experimental) | x | x | |||
| Bloom Gateway (Experimental) | x | x |
官方也有提供一些简单的部署模式在文件夹 production/helm/loki/ci
至此 loki 使用 helm 部署的两种模式就完成了部署,再配合 data ingestion, 例如 Promtail, Filebeat 等就可以完成日志的收集。
Reference
[2] Microservices mode
[3] Chunk storage
[4] Loki components