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

img

填入地址(替换掉变量):http://loki.${LOKI_NAMESPACE}.svc.cluster.local:3100

img

其他不需要改动,点击 Save & test 保存配置。

打开页面:http://<grafana_url>/explore?%22datasource%22:%22Loki%22

即可看到 loki

3. 使用 Loki 查询日志

3.1 通过 Label 对日志源筛选

在 Loki 页面,点击 Log browser 按条件过滤,例如选择使用 app Label 选择,选到需要的 app 名字,点击 Show logs 查看日志。

img

生成查询语法用{}括起来。例如:

1
{container="traefik",namespace="kube-system"} 

查询结果如下图:

img

基础语法使用如下,用“,”隔开多个条件

  • =
  • != 不包含
  • =~ 正则匹配
  • !=

3.2 简单日志查询语法

用在{}之后,空格隔开,可以添加多个。

  • | = “” 匹配包含字符串的行
  • ! = “” 匹配不包含字符串的行
  • | ~ “” 匹配符合正则表达式的行
  • ! ~ “” 匹配不符合正则表达式的行

例如:

1
{container="traefik",namespace="kube-system"} !~ "/ping" !~"machine"

img