![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CNyUzN3IzN2cDO4MDM2YTMvw1MxgDMyIDMy8CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
一、Loki简介
1.1 Loki是什么?🎆
[项目地址]:https://github.com/grafana/loki
[官方文档]:https://grafana.com/docs/loki/latest/
Loki
是
Grafana Labs
团队最新的开源项目,是一个水平可扩展,高可用性,多租户的==日志聚合系统==。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签。
与其他日志系统不同,Loki 是围绕仅索引有关日志的元数据的想法构建的:标签(就像 Prometheus 标签一样)。然后,日志数据本身会被压缩并以块的形式存储在对象存储(例如 S3 或 GCS)中,甚至本地存储在文件系统中。小索引和高度压缩的块简化了操作并显着降低了 Loki 的成本。
Loki采用Go语言开发
1.2 Loki架构解析🦖
- Loki: 主服务器,负责日志的存储和查询,参考了Prometheus的服务发现机制,将标签添加到日志流,而不是是像其它平台一样进行全文索引;
- Promtail:负责收集日志并将其发送给Loki,主要用于发现采集目标及添加对应Label,最终发送给Loki;
- Grafana:用来展示、查询日志,可在页面查询指定标签Pod的日志;
1.3 版本说明
|-V2.5.0 2022-04-12 🦖发布
|-V2.4.2 2022-01-13 🎊发布
|-V2.3.0 2021-08-07 🥳发布
1.4 日志系统的业务需求
- 日志保留天数
- 日志切割
- 日志审计
二、部署Loki
Loki提供多种安装方式,有二进制、Helm、docker、docker-compose、Tanka等。
基于Helm的几种安装模式
grafana/loki-stack:单体模式
grafana/loki-canary:金丝雀;
grafana/loki-distributed:分布式;微服务模式,适合生产较大规模场景
grafana/loki-simple-scalable:简单可扩展,读写分离模式;
2.1 Loki部署(二进制)
Lovi v2.4.2
Promtail v2.4.3
Grafana v8.3.5
注意:此时不要下载 LogCLI 或 Loki Canary。
LogCLI允许您在命令行界面中运行 Loki 查询。
Loki Canary是一个审计 Loki 性能的工具。
2.1.1 安装Loki服务
1)创建工作目录
$ mkdir /etc/loki/
2)下载二进制安装包
$ wget https://github.com/grafana/loki/releases/download/v2.4.2/loki-linux-amd64.zip
$ unzip loki-linux-amd64.zip
$ mv loki-linux-amd64 /usr/local/bin/loki
$ loki -version
loki, version 2.4.2 (branch: HEAD, revision: 525040a32)
3)下载配置文件(通用)
$ wget https://raw.githubusercontent.com/grafana/loki/master/cmd/loki/loki-local-config.yaml
$ mv loki-local-config.yaml /etc/loki/
4)启动Loki
$ yum install coreutils
$ nohub loki --config.file=/etc/loki/loki-local-config.yaml &
会有read、write两个进程。
2.1.2 安装Promtail服务
Promtail服务用于采集日志。
1)创建目录
$ mkdir /etc/promtail
2)下载二进制文件
$ wget https://github.com/grafana/loki/releases/download/v2.4.2/promtail-linux-amd64.zip
$ unzip promtail-linux-amd64.zip
$ mv promtail-linux-amd64 /usr/local/bin/promtail
$ promtail -version
promtail, version 2.4.2
2)下载配置文件
$ wget https://raw.githubusercontent.com/grafana/loki/main/clients/cmd/promtail/promtail-local-config.yaml
$ mv promtail-local-config.yaml /etc/promtail/
$ vim /etc/promtail/promtail-local-config.yaml
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://localhost:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*log #采集的日志文件目录 /var/log/*/*log
3)启动Promtail
$ nohup promtail --config.file=/etc/promtail/promtail-local-config.yaml &
$ ss -ntulp | grep promtail
2.1.3 安装Grafana
1)下载二进制包
$ wget https://dl.grafana.com/oss/release/grafana-8.3.5.linux-amd64.tar.gz
$ tar zxvf grafana-8.3.5.linux-amd64.tar.gz
$ mv grafana-8.3.5 /usr/local/grafana
$ cd /usr/local/grafana
$ mv bin/grafana-server /usr/local/bin/
$ mv bin/grafana-cli /usr/local/bin/
2)安装服务器端图像渲染组件
$ yum install -y fontconfig freetype* urw-fonts
3)安装grafana的插件
$ rafana-cli plugins list-remote #查看可以安装的插件
$ grafana-cli plugins install alexanderzobnin-zabbix-app #zabbix插件
$ grafana-cli plugins install grafana-clock-panel #时钟插件
4)编写服务启动文件
$ vim /usr/lib/systemd/system/grafana-server.service
[Unit]
Description=Grafana
After=network.target
[Service]
Type=notify
ExecStart=/usr/local/bin/grafana-server -homepath /usr/local/grafana
Restart=on-failure
[Install]
WantedBy=multi-user.target
-homepath: 指定工作目录;
5)启动Grafana
$ systemctl enable --now grafana-server.service
$ systemctl status grafana-server.service
6)登录Grafana
在浏览器输入主机IP:3000
默认用户名:admin
默认密码:admin 首次登录会进行修改密码操作
默认配置文件位置:/etc/grafana/grafana.ini
默认数据库使用sqlite3位置:/var/lib/grafana/grafana.db 可修改为其他数据库
2.3 Helm部署Loki(单体模式)
单体模式可快速部署一套Loki环境,将多个服务封装到一个Pod中,且未做数据的持久化,主要用于Demo环境,不适合用于生产。
$ kubectl create namespace loki
$ helm repo add grafana https://grafana.github.io/helm-charts
$ helm repo list
$ helm search repo grafana
$ helm pull grafana/loki-stack --untar
$ cd loki-stack/
$ vim values.yaml
grafana:
enabled: true #启用Grafana组件
sidecar:
datasources:
enabled: true
maxLines: 1000
image:
tag: 8.3.5
$ helm install loki-stack . -n loki
$ kubectl -n loki edit svc loki-stack-grafana
spec:
type: NodePort
2.4 Helm部署Loki(读写分离模式)
Loki提供Helm的安装方式。
其它安装配置:https://grafana.com/docs/loki/latest/installation/helm/
Loki是以StatefulSet控制器部署的,副本数默认为1,且未做数据的持久化,生产需要修改副本数并做持久化。
镜像清单:
grafana/loki:2.5.0
docker.io/grafana/loki:2.5.0
grafana/agent:v0.25.1
quay.io/prometheus-operator/prometheus-config-reloader:v0.47.0
nginxinc/nginx-unprivileged:1.19-alpine
grafana/agent-operator:v0.25.1
loki-v2.4.2
promtail-v2.4.2
grafana-v8.3.5
2.4.1 环境准备
1)创建命名空间
$ kubectl create namespace loki
2)安装Helm
如果你已经安装好helm了,可以忽略本步骤。
$ wget https://get.helm.sh/helm-v3.7.2-linux-amd64.tar.gz
$ tar zxvf helm-v3.7.2-linux-amd64.tar.gz
$ cp linux-amd64/helm /usr/local/bin/
$ helm versio
3)添加Chart仓库
$ helm repo add grafana https://grafana.github.io/helm-charts
$ helm repo list
NAME URL
grafana https://grafana.github.io/helm-charts
$ helm repo update
搜索chart
$ helm search repo grafana/loki
Loki-stack:将多个进程封装到一个Pod内,未做数据持久化,适用于测试环境;
搜索chart所有版本
$ helm search repo grafana/loki-simp -l
2.4.2 安装Loki
1)下载Chart包
$ helm pull grafana/loki-simple-scalable --untar --version 0.3.3
--untar: 下载解压;
--version:指定版本;0.3.3对应是app版本是2.4.2,比较稳定些!
2)修改values.yaml配置
$ cd loki-simple-scalable/
$ vim values.yaml
write:
persistence:
storageClass: loki-storage #指定创建的storageclass名
read:
persistence:
storageClass: loki-storage
3)安装Loki
$ helm install loki . -n loki
$ helm -n loki ls
4)服务状态验证
查看Pod & Service是否正常!
$ kubectl -n loki get pods
$ kubectl -n loki get svc
2.4.3 安装Promtail
为了验证应用是否正常,接下来我们再安装 Promtail 和 Grafana 来进行数据的读写。
获取 promtail 的 Chart 包并解压:
$ helm pull grafana/promtail --untar
$ cd promtail
$ vim values.yaml
image:
tag: 2.4.2
config:
clients:
- url: http://loki-gateway/loki/api/v1/push
注意:
我们需要将 Promtail 中配置的 Loki 地址为 http://loki-gateway/loki/api/v1/push,这样就是 Promtail 将日志数据首先发送到 Gateway 上面去,然后 Gateway 根据我们的 Endpoints 去转发给 write 节点.
$ helm install promtail . -n loki
NAME: promtail
LAST DEPLOYED: Wed Jul 6 21:43:05 2022
NAMESPACE: loki
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
2.4.4 安装Grafana
grafana/grafana:9.0.2
$ helm pull grafana/grafana
$ tar zxvf grafana-6.32.1.tgz
$ cd grafana/
$ vim values.yaml
service:
enabled: true
type: NodePort #修改为NodePort
port: 80
targetPort: 3000
$ helm install grafana . -n loki
$ helm install loki-grafana grafana/grafana
登录Grafana
查看Grafana密码
$ kubectl -n loki get secret grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
添加数据源-Loki
Explore——Loki
2.5 Helm部署Loki(微服务模式)
本处安装2.4.2版本的Loki
1)搜索Chart包
$ helm search repo grafana/loki-distributed -l | grep 2.4.2
2)下载Chart包
$ helm pull grafana/loki-distributed --untar --version 0.47.4
$ cd loki-distributed/
--untar: 下载解压;
--version:指定版本;0.47.4对应是app版本是2.4.2,比较稳定些!
3)修改values.yaml
ingester:
persistence:
size: 10Gi
storageClass: loki-storage
querier:
persistence:
size: 10Gi
storageClass: loki-storage
compactor:
persistence:
size: 10Gi
storageClass: loki-storage
indexGateway:
enabled: false
#或者:
$ sed -i '/storageClass/s/null/loki-storage/' values.yaml
Install安装
$ helm install loki . -n loki
NAME: loki
LAST DEPLOYED: Wed Jul 13 10:07:51 2022
NAMESPACE: loki
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
***********************************************************************
Welcome to Grafana Loki
Chart version: 0.47.4
Loki version: 2.4.2
***********************************************************************
Installed components:
* gateway
* ingester
* distributor
* querier
* query-frontend
三、Loki的使用
3.1 Loki语法
Loki是参考Prometheus进行设计的,查询语法和PromQL类似,比如查询命名空间为kube-lidabai下的所有Pod的日志,在Log browser输入{namespace=”kube-lidabai”},然后点击Run query就可以了。
Loki语法支持正则表达式、Pipeline;
更复杂的语法:https://grafana.com/docs/loki/latest/logql
查看指定命名空间&指定Pod的日志:
{namespace= "kube-lidabai ",pod=~"lidabai.*"}
过滤包含avg的字段的日志
{namespace= "kube-lidabai ",pod=~"lidabai.*" |~ "avg"}
还可以使用logfmt对日志进行格式化,然后进行值的判断;
例如:找到包含avg的字段,并且longest的值大于16ms的日志
{namespace= "kube-lidabai ",pod=~"lidabai.*" |~ "avg" | logfmt | longest > 16ms}
值匹配
{namespace= "kube-lidabai ",pod=~"lidabai.*" |~ "avg" | logfmt | longest > 16ms and avg > 6ms}