最轻量级的Kubernetes云原生日志框架Loki

Loki 是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流配置一组标签。项目受 Prometheus 启发,官方的介绍就是:Like Prometheus, but for logs,类似于 Prometheus 的日志系统。

一、Loki 是什么

Loki官方是这么介绍自己的: Loki 是一个 可水平扩展, 高可用, 多租户 的日志聚合收集系统, 并且追求高性能和易于部署.

对比一下它和别的日志收集系统:

  • 由于它不创建全文索引, 而且只存储压缩后的非结构化日志和元信息索引, 所以很轻量级易于部署
  • 索引和分组与 Prometheus 使用相同的 label
  • 非常适合收集 k8s pod 日志信息, 类似 pod labels 这些元信息都是自动收集并添加索引的
  • 直接可以对接 Grafana 作为日志查询界面

相对于 ELK 需要的资源更少, 并且更易于部署.

loki 组件也基本分为三个:

  • promtail 日志收集 agent, 收集日志并发送给 loki
  • loki 核心服务, 存储日志和索引, 并提供查询服务
  • Grafana 日志查询界面

可以看到, 组件和 ELK 基本一样, 并且符合 k8s 的日志收集架构.


二、Loki 快速安装使用

根据Loki的组件架构, 可以看出 promtail 需要运行在所有运行应用容器的节点, 所以会是 DaemonSet, loki 作为核心服务, 带有持久化存储而且支持横向扩展, 所以应该是StatefulSet, Grafana 是比较基本的独立应用, 可以复用已部署的.

从官方的文档中看,提供了5中安装方法

  • 使用Tanka进行安装(推荐)
  • 通过helm安装
  • 通过Docker或Docker Compose安装
  • 在本地安装并运行
  • 从源码编译安装

官方推荐用Tanka来安装,是官方提供的一个安装工具,不过相信大部分人都不知道这个工具。所以,对于kubernetes来说,最简单的方式还是使用 helm, loki 官方已经提供了生产可用的 chart.

添加Loki的源到Helm,并更新源

helm repo add loki https://grafana.github.io/loki/charts
helm repo update
# 默认配置 helm upgrade --install loki loki/loki-stack
# 自定义namespace helm upgrade --install loki --namespace=loki loki/loki

部署Loki 套件包括 (Loki, Promtail, Grafana, Prometheus)

helm upgrade --install loki loki/loki-stack  --set grafana.enabled=true,prometheus.enabled=true,prometheus.alertmanager.persistentVolume.enabled=false,prometheus.server.persistentVolume.enabled=false 

获取grafana的登陆密码

kubectl get secret --namespace <YOUR-NAMESPACE> loki-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo 

映射grafana的登陆端口到3000

kubectl port-forward --namespace <YOUR-NAMESPACE> service/loki-grafana 3000:80 

用浏览器打开 http://localhost:3000 并用上面得到的密码登陆,用户名为 admin。

在grafana中增加Loki Data Source, 对应URL: http://loki:3100/ for Loki.

点击 Explore 并且选择 label 就可以查看日志了



三、部署nginx测试日志收集

笔者用springboot简单写了个程序,一秒钟打印一条日志处理

apiVersion: apps/v1 kind: Deployment metadata:   name: loki-springboot-test   labels:     app: log-test spec:   replicas: 1   selector:     matchLabels:       app: log-test   template:     metadata:       labels:         app: log-test     spec:       containers:       - name: log-test         image: log-test:0.0.1         ports:         - containerPort: 80

部署好看能正常收集到日志

四、总结

提起日志收集,相信大家首先想到的是EFK(Elasticsearch、Fluentd、Kibana),能搜索到也是EFK的解决方案,但是Elasticsearch 中的数据以非结构化 JSON 对象的形式存储在磁盘上。每个对象的键和每个键的内容都有索引。然后可以使用 JSON 对象来定义查询(称为 Query DSL)或通过 Lucene 查询语言来查询数据。功能强大,但是部署维护比较难,学习成本也比较高,并且系统资源占用非常高,没有3台服务器很难搭建起来,但是其实对应日志我们只需要能正确并快速的收集到,并存储起来,需要查询的时候能简单的查询到需要的日志。

相比之下,Loki受 Prometheus 启发的可以水平扩展、高可用以及支持多租户的日志聚合系统,主要体现在以下几点:

  • 使用了和 Prometheus 相同的服务发现机制,将标签添加到日志流中而不是构建全文索引
  • 从 Promtail 接收到的日志和应用的 metrics 指标就具有相同的标签集
  • 不仅提供了更好的日志和指标之间的上下文切换,还避免了对日志进行全文索引。

因此,当笔者看到Loki的日志方案后,毫不犹豫的在公司内部进行了试用,非常轻量,非常丝滑,这才是我们需要的云原生日志解决方案。

推荐给大家。

版权声明:

作者: freeclashnode

链接: https://www.freeclashnode.com/news/article-2742.htm

来源: FreeClashNode

文章版权归作者所有,未经允许请勿转载。

免费节点实时更新

热门文章

最新文章

归档