关注「WeiyiGeek」公众号
本章目录:
- 0x00 快速入门
- 1.什么是 Loki ?
- 2.为什么要使用 Grafana Loki?
- 3.Grafana Loki 是如何工作的?
- 4.Grafana Loki 架构简述
- 5.Grafana Loki 参考来源
- 0x01 安装部署
以 二进制方式 安装 Loki 与 Promtail
以 Helm3 在K8S集群里安装 Loki 与 Promtail
0x02 实践使用
使用 Grafana 连接到 Loki 数据源
使用 Grafana Dashboard 显示集群中 pods 日志
0x00 快速入门
1.什么是 Loki ?
描述:在对公司容器的日志存储查询方案进行设计的时候,发现主流的 ELK (Elasticsearch, Logstash, Kibana)
或者 EFK (Elasticsearch, Filebeat or Fluentd, Kibana)
比较重,再加上现阶段对于 ES 复杂的搜索功能很多都用不上,最终选择了 Grafana 开源的 Loki 日志系统即 PLG 日志解决方案。
本篇文章将主要介绍使用 Loki 实现 Kubernetes 容器日志监控的相关知识,感兴趣的朋友一起看看吧!
什么是 Grafana Loki?
官方介绍: Like Prometheus, but for logs.
Grafana Loki 是一个日志聚合系统,旨在存储和查询来自所有应用程序和基础架构的日志。
Grafana Loki 项目由 Grafana Labs 团队开发,并在 2018 年的 KubeCon 上发布 (在 AGPLv3 许可下发布), 其基于 Go 语言实现,它是一个受 Prometheus 启发的水平可扩展,高可用性,多租户的日志聚合系统, 其相对比于ELK更加轻量级,它的设计非常具有成本效益且易于操作。
那 Loki 与 Promethus 区别在什么地方呢?
答:Loki 与 Prometheus 的不同之处在于专注于日志而不是指标,并且通过推送而不是拉取来传递日志。
在生产实践环境中 Loki 常常与 Grafana 联合使用, 提供了一种界面化对 Loki 中存储的日志进行查询并可视化查询结果的方法,所以 Grafana Labs提供的另一个日志解决方案 PLG 目前也逐渐变得流行起来。
PLG 架构为 Promtail + Loki + Grafana
的组合,整体架构图下所示:
其中所有组件说明:
- Grafana 大家应该都比较熟悉,它是一款开源的可视化和分析软件,它允许用户查询、可视化、警告和探索监控指标.
- Loki 是一组可以组成一个功能齐全的日志堆栈组件, 负责存储日志和处理查询。
- Promtail 是一个日志收集的代理, 其类似于 ELk 中的 filebeat 的 日志采集端 agent,负责收集日志并将其发送给 Loki。
2.为什么要使用 Grafana Loki?
描述:Loki 采用了一种独特的方法,它只索引元数据而不是日志行的全文,并且为每个日志流设置一组标签,Loki 的最小索引方法意味着在 Loki 中存储同一组日志所需的存储空间比其他解决方案少得多,例如下图
温馨提示: 从图纸中可以看到Loki针对时间戳和标签键值对进行了索引, 这极大的方便我们进行日志查询。
Loki 优点介绍
- 容易上手, 因为您可以使用各种客户端从任何来源以任何格式发送日志。
- 对象存储持久化, 意味着您可以获得 PB 级规模、高吞吐量和经济高效且耐用的存储。
- 告警通知, 可以通过采用的日志对比预定的告警阈值进行相应告警通知。
- 灵活的日志格式, 为您提供更大的灵活性和在查询时进行格式设置的选项。
- 实时跟踪应用日志, 以查看进入系统的日志、每隔特定时间更新日志、查看特定日期的日志等。
- 云原生环境集成, 可以非常方便的与 Prometheus、Grafana 和 K8s 原生集成.
与其他日志聚合系统相比
- 不像ELK对日志进行全文索引, 通过存储压缩的非结构化日志和仅索引元数据Loki 操作更简单,运行成本更低、效率也提升了。
- 使用已在 Prometheus 中使用的相同标签对日志流进行索引和分组,使您能够使用已在 Prometheus 中使用的相同标签在指标和日志之间无缝切换。
- 特别适合存储 Kubernetes Pod 日志, Pod 标签等元数据会被自动抓取和索引。
- 在 Grafana 中有原生支持(需要 Grafana v6.0)。
在 Loki 架构中类比与 EFK 几个概念:
- Grafana:相当于 EFK 中的 Kibana ,用于 UI 的展示。
- Loki:相当于 EFK 中的 ElasticSearch ,用于存储日志和处理查询。
- Promtail:相当于 EFK 中的 Filebeat/Fluentd ,用于采集日志并将其发送给 Loki 。
- LogQL:Loki 提供的日志查询语言,类似 Prometheus 的 PromQL,而且 Loki 支持 LogQL 查询直接转换为 Prometheus 指标。
3.Grafana Loki 是如何工作的?
描述: 我们可以官方图示中看出 Grafana Loki 的工作流程。
步骤 01.Promtail 是专门为 Loki 构建的日志收集器,我们使用 Promtail 拉入任何日志,它使用与 Prometheus 相同的服务发现功能,并包括在将日志摄取到 Loki 之前标记、转换和过滤日志的类似功能。
步骤 02.promtail 将采集到的日志存储在 Loki 存储空间中,Loki 不索引日志文本,只将时间戳与标签进行索引,这不仅可以降低成本,还意味着可以在 Loki 接收到的几毫秒内查询日志行。
步骤 03.使用 Grfana 接入 Loki 数据源, 然后直接在 Grafana 中运行 LogQL 查询,以将您的日志与其他数据源一起可视化,或者使用 LogCLI 来显示查询到可视化数据。
步骤 04.最后我们还可以为 Loki 设置警报规则以评估传入的日志数据,配置 Loki 以将生成的警报发送到 Prometheus Alertmanager 中,从而进行告警。
4.Grafana Loki 架构简述
描述: Loki 整体架构也是由不同的组件来协同完成日志收集、索引、存储等工作的各个组件如下图所示。
架构图剖析:
Loki 采用读写分离架构,关键组件有:
- Distributor 分发器(日志分发):日志数据传输的“第一站”,Distributor 分发器接收到日志数据后,根据元数据和 hash 算法,将日志分批并行地发送到多个 Ingester 接收器上
- Ingester 接收器(日志持久化):接收器是一个有状态的组件,在日志进入时对其进行 gzip 压缩操作,并负责构建和刷新 chunck 块,当 chunk 块达到一定的数量或者时间后,就会刷新 chunk 块和对应的 Index 索引存储到数据库中
- Querier 查询器 (查询解析):给定一个时间范围和标签选择器,Querier 查询器可以从数据库中查看 Index 索引以确定哪些 chunck 块匹配,并通过 greps 将结果显示出来,它还会直接从 Ingester 接收器获取尚未刷新的最新数据
- Query Frontend 查询前端(查询API):查询前端是一个可选的组件,运行在 Querier 查询器之前,起到缓存,均衡调度的功能,用于加速日志查询
- Ruler 预警规则: Ruler 规则规定了何种情况向 altermanger 发送,其语法规则近似于 Prometheus Alertmanager 中告警规则。
- Object Store:存储采集到的日志index索引与Chunks。
- Memcaches: 缓存写入、查询结果,加快查询效率。
- Cluster Services: 包含 compactor 与 consul 服务发现组件。
温馨提示: 我们可以通过 loki 二进制的 -target
参数指定运行角色(querier/inester/query-frontend/distributor)
.
5.Grafana Loki 参考来源
官方地址:https://grafana.com/oss/loki/
项目地址: https://github.com/grafana/loki
开始: https://grafana.com/docs/loki/latest/getting-started/
安装参考: https://grafana.com/docs/loki/latest/installation/
0x01 安装部署
描述: 我们可以使用多种方式进行安装 Loki 和 Promtail 组件,其中最常用的是使用 Helm 部署微服务、使用 Helm 进行简单的可扩展部署、通过 Docker 或 Docker Compose 安装、在本地安装和运行或者从源代码安装。
常规使用
Step 1.下载并安装 Loki 和 Promtail。
Step 2.下载两个程序的配置文件。
Step 3.启动 Loki。
Step 4.更新 Promtail 配置文件,让您的日志进入 Loki。
Step 5.开始在Grafana中浏览日志。
Loki 三种部署方式
单体模式
(Monolithic mode)
,ALL IN ONE : Loki 支持单一进程模式,可在一个进程中运行所有必需的组件。单进程模式非常适合测试 Loki 或以小规模运行。不过尽管每个组件都以相同的进程运行,但它们仍将通过本地网络相互连接进行组件之间的通信(grpc)。使用 Helm 部署就是采用的该模式。简单可扩展模式
(Simple scalable deployment mode)
: 如果您每天的日志量超过几百 GB,或者如果您想分离读写关注点, Loki 提供了简单的可扩展部署模式, 该模式下每天存储的日志量可到TB级别,其分离读写路径有以下优点通过提供专用节点提高写入路径的可用性,可单独扩展的读取路径以按需添加/删除查询性能。微服务模式
(Microservices mode)
:为了实现水平可伸缩性,Loki 支持组件拆分为单独的组件分开部署,从而使它们彼此独立地扩展。每个组件都产生一个用于内部请求的 gRPC 服务器和一个用于外部 API 请求的 HTTP 服务,所有组件都带有 HTTP 服务器,但是大多数只暴露就绪接口、运行状况和指标端点。
# 包含的组件distributor
ingester
querier
query-scheduler
query-frontend
index-gateway
ruler
compactor
三种部署模式参考: https://grafana.com/docs/loki/latest/fundamentals/architecture/deployment-modes/
以 二进制方式 安装 Loki 与 Promtail
描述: 在进行容器化部署时,建议初学者先使用单节点主机模式部署各个组件,熟悉一下整个流程,然后在进行容器化部署。
实践环境
~$ cat /etc/issue.net
Ubuntu 20.04.4 LTS
~$ uname -a
Linux devtest-102 5.4.0-59-generic #65-Ubuntu SMP Thu Dec 10 12:01:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
实践步骤
- Step 1.下载 Loki 与 Promtail 最新而二进制文件并准备安装配置文件, 当前最新版本release查看(https://github.com/grafana/loki/releases/)。
mkdir -vp /usr/local/loki/{config,data}; mkdir -vp /usr/local/loki/data/{loki,promtail}
cd /usr/local/loki
# 下载二进制包
LOKI_VERSION=v2.6.0
curl -O -L https://github.com/grafana/loki/releases/download/${LOKI_VERSION}/loki-linux-amd64.zip
curl -O -L https://github.com/grafana/loki/releases/download/${LOKI_VERSION}/promtail-linux-amd64.zip
curl -O -L https://github.com/grafana/loki/releases/download/${LOKI_VERSION}/logcli-linux-amd64.zip
$ ls
logcli-linux-amd64.zip loki-linux-amd64.zip promtail-linux-amd64.zip
# 解压与可执行权限赋予
unzip "loki-linux-amd64.zip"
unzip promtail-linux-amd64.zip
unzip logcli-linux-amd64.zip
chmod a+x logcli-linux-amd64 loki-linux-amd64 promtail-linux-amd64
# 软连接创建
ln -s $(pwd)/loki-linux-amd64 /usr/local/bin/loki
ln -s $(pwd)/promtail-linux-amd64 /usr/local/bin/promtail
ln -s $(pwd)/logcli-linux-amd64 /usr/local/bin/logcli
- Step 2.使用 systemd 管理 loki 与 Promtail 准备的服务器清单如下。
cat <<EOF > /usr/lib/systemd/system/loki.service[Unit]
Description=loki.service
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/loki/loki-linux-amd64 -log.level=info -target all -config.file=/usr/local/loki/config/loki-config.yaml
WorkingDirectory=/usr/local/loki/
LimitMEMLOCK=infinity
LimitNPROC=65536
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOFcat <<EOF > /usr/lib/systemd/system/promtail.service[Unit]
Description=promtail.service
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/loki/promtail-linux-amd64 -config.file=/usr/local/loki/config/promtail.conf
WorkingDirectory=/usr/local/loki/
LimitMEMLOCK=infinity
LimitNPROC=65536
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
扩展补充: 我们也可使用 supervisor 管理进程, Supervisor 是Python编写的 Client/Server 模式的系统,通过supervisor,可以对类Unix操作系统的进程进行监控和管理,可以方便地进行进程集中管理,并监控进程的状态, 当程序异常退出时,可以自动拉起程序,起到守护进程的作用。
# CentOS
sudo yum install epel-release -y
sudo yum install supervisor -y
# 修改内存、进程、文件限制
sed -i '/forking/a LimitNOFILE=65536' /usr/lib/systemd/system/supervisord.service;
sed -i '/forking/a LimitNPROC=65536' /usr/lib/systemd/system/supervisord.service;
sed -i '/forking/a LimitMEMLOCK=infinity' /usr/lib/systemd/system/supervisord.service;
# 设置开机启动,启动服务
systemctl daemon-reload
systemctl enable supervisord
systemctl start supervisord
# 配置 supervisor 管理 loki进程
mkdir -vp /usr/local/loki/{loki,promtail,config} /var/log/loki/
cat <<EOF> /etc/supervisord.d/loki.ini
[program:loki]
command=/usr/local/loki/loki-linux-amd64 -log.level=info -target all -config.file=/usr/local/loki/config/loki-config.yaml
autorestart=true
autostart=true
stderr_logfile=/var/log/loki/loki_err.log
stdout_logfile=/var/log/loki/loki_out.log
user=root
stopsignal=INT
startsecs=10
startretries=3
directory=/usr/local/loki/
EOF
cat << EOF > /etc/supervisord.d/promtail.ini
[program:promtail]
command=/usr/local/loki/promtail-linux-amd64 -config.expand-env=true -config.file=/usr/local/loki/config/promtail.conf
autorestart=true
autostart=true
stderr_logfile=/var/log/loki/promtail_err.log
stdout_logfile=/var/log/loki/promtail_out.log
user=root
stopsignal=INT
startsecs=10
startretries=3
directory=/usr/local/loki/
EOF