loki 安装方式非常多,推荐的方式是按照官方文档说明,使用 helm 安装 loki-stack。
本文初衷是为了部署一套尽量轻量化的日志系统,对 k3s 集群内多实例服务日志进行收集过滤。为了缩小服务粒度让 k3s 羸弱的服务器节点承担的压力尽可能分散,故选择手动配置微服务方式部署 loki。
文中没有考虑过多的高可用性,需要读者自行添加。
1. 使用 helm 安装 loki 组件
这里先创建 monitor 命名空间,按需修改。
1
2
| LOKI_NAMESPACE="monitor"
kubectl create ns ${LOKI_NAMESPACE}
|
1.1 添加 Grafana 官方的 helm repo
1
2
| helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
|
1.2 Grafana
使用 helm 安装 Grafana,这里用 longhorn 自动创建 pvc,也可以改为persistence.existingClaim=
指定提前创建的 pvc 或者 template。
测试时删除部分配置,不使用持久化存储等,不影响部署体验。
==> 可自定义 chart 配置项点这里查看 <==
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 创建密码
secret="grafana"
kubectl create secret generic "$secret" \
--namespace ${LOKI_NAMESPACE} \
--from-literal=admin-user=admin \
--from-literal=admin-password=12345678
helm upgrade --install grafana \
--namespace=${LOKI_NAMESPACE} \
--set admin.existingSecret=${secret} \
--set persistence.enabled=true \
--set persistence.storageClassName=longhorn \
--set persistence.accessModes={ReadWriteOnce} \
--set persistence.size=500Mi \
grafana/grafana
|
手动配置部署 Grafana 参考:
https://grafana.com/docs/grafana/next/setup-grafana/installation/kubernetes/
可使用以下命令转发页面到本地 http://127.0.0.1:3000 ,验证部署。
1
2
| export POD_NAME=$(kubectl get pods --namespace ${LOKI_NAMESPACE} -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=grafana" -o jsonpath="{.items[0].metadata.name}")
kubectl --namespace ${LOKI_NAMESPACE} port-forward $POD_NAME 3000
|
如果是按照上面步骤 helm 安装的,可以使用账号/密码: admin/12345678 登陆。忘记密码可使用命令获取:
1
2
| kubectl get secret --namespace monitor grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
# 或者进入 POD 获取到环境变量 GF_SECURITY_ADMIN_PASSWORD
|
(可选)创建 Ingress
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # --------------- ing -------------- ##
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grafana
namespace: monitor
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: "grafana.k.epurs.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: grafana
port:
number: 80
tls:
- secretName: epurs-com
|
1.3 Loki
安装时配置添加上自动删除 92 天前日志。
持久化配置要求存储 10Gi 以上。
1
2
3
4
5
6
7
8
| helm upgrade --install loki \
--namespace=${LOKI_NAMESPACE} \
--set persistence.enabled=true \
--set persistence.size=20Gi \
--set persistence.storageClassName=longhorn \
--set config.compactor.retention_enabled=true \
--set config.compactor.retention_delete_delay=2208h \
grafana/loki
|
这里不考虑暴露 Loki 到公网,使用 https 及账号密码连接的情况,如有需要请查阅官方文档说明,配置不算复杂,用的场景不多,这里不做说明。
1.4 Fluent-Bit
Fluent-Bit 是轻量化的 Fluentd,即使相比于 promtail 占用资源也非常少,同时能轻松扩展实现 Fluent 高级配置功能,非常好用。
Grafana helm repo 中已经内置了 Fluent-Bit chart,只需要传入参数即可实现一键启动 DaemonSet。默认会收集宿主机上 host containers log
三种类型日志。
1
2
3
4
| helm upgrade --install fluent-bit grafana/fluent-bit \
--namespace=${LOKI_NAMESPACE} \
--set loki.serviceName=loki.${LOKI_NAMESPACE}.svc.cluster.local \
--set loki.servicePort=3100
|
==> 自定义 Fluent Bit 配置项点这里查看 <==
非 k3s/k8s 内安装可参考:https://grafana.com/docs/loki/latest/clients/fluentbit/
2. Grafana 配置 Loki
打开: http://<grafana_url>/datasources/new
选择创建 Loki
填入地址(替换掉变量):http://loki.${LOKI_NAMESPACE}.svc.cluster.local:3100
其他不需要改动,点击 Save & test 保存配置。
打开页面:http://<grafana_url>/explore?%22datasource%22:%22Loki%22
即可看到 loki
3. 使用 Loki 查询日志
3.1 通过 Label 对日志源筛选
在 Loki 页面,点击 Log browser 按条件过滤,例如选择使用 app Label 选择,选到需要的 app 名字,点击 Show logs 查看日志。
生成查询语法用{}
括起来。例如:
1
| {container="traefik",namespace="kube-system"}
|
查询结果如下图:
基础语法使用如下,用“,”隔开多个条件
3.2 简单日志查询语法
用在{}
之后,空格隔开,可以添加多个。
- | = “” 匹配包含字符串的行
- ! = “” 匹配不包含字符串的行
- | ~ “” 匹配符合正则表达式的行
- ! ~ “” 匹配不符合正则表达式的行
例如:
1
| {container="traefik",namespace="kube-system"} !~ "/ping" !~"machine"
|