Helm 部署 Loki 日志聚合

一、loki 介绍

1.1、loki 是什么

Loki是一个水平可扩展,高可用性,多租户的日志聚合系统,受到Prometheus的启发。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签。官方介绍说到:Like Prometheus, but for logs.

1.2、loki特点

与其他日志聚合系统相比

  • 不对日志进行全文索引。通过存储压缩的非结构化日志和仅索引元数据,Loki操作更简单,运行更便宜。
  • 索引和组使用与Prometheus已使用的相同标签记录流,使您可以使用与Prometheus已使用的相同标签在指标和日志之间无缝切换。
  • 特别适合存放Kubernetes Pod日志; 诸如Pod标签之类的元数据会被自动删除和编入索引。
  • 在Grafana有本机支持(已经包含在Grafana 6.0或更新版本中)。

1.3、loki组成

Loki由3个组成部分组成:

  • loki 是主服务器,负责存储日志和处理查询。
  • promtail 是代理,负责收集日志并将其发送给loki。
  • 用户界面的Grafana。

二、部署动态 PV

2.1、 创建名称空间

  • 创建一个 nfs 名称空间,将 nfs-client-provisioner 放在这个名称空间上
kubectl create ns nfs

2.2、创建 Loki 存储目录

  • 该存储目录专门存放 Loki 数据包括: Elasticsearch Fluentd Kibana 数据
mkdir -p /data/NFS/Loki

2.3、使用 helm 安装 nfs-client-provisioner

  • 项目地址:https://hub.helm.sh/charts/stable/nfs-client-provisioner
  • 安装到 nfs 命名空间
  • 重点:nfs.path 让数据存储到指定目录,这样好区分数据
  • 重点:storageClass.name 这里填写 monitoring 专属名称,用于 PVC 自动绑定专属动态 PV 上。
#   下面代码直接复制黏贴即可
cat > loki-client.yaml << EOF
# NFS 设置
nfs:
  server: 192.168.8.131
  path: /data/NFS/Loki
storageClass:
  # 此配置用于绑定 PVC 和 PV
  name: loki-nfs-client
  # 资源回收策略
  reclaimPolicy: Retain
# 使用镜像
image:
  repository: kubesphere/nfs-client-provisioner
# 副本数量
replicaCount: 2
EOF

helm install loki -n nfs --values loki-client.yaml stable/nfs-client-provisioner --version 1.2.8

2.4、查看运行 nfs-client-provisioner Pod 状态

[root@Node-01 ~]# kubectl get pod -n nfs -w
NAME                                                             READY   STATUS    RESTARTS   AGE
loki-nfs-nfs-client-provisioner-7f656cdcf6-fgq5g          1/1     Running   0          2s
loki-nfs-nfs-client-provisioner-7f656cdcf6-qrgwv          1/1     Running   0          2s

三、Loki 部署

3.1、创建名称空间

kubectl create namespace monitoring

3.2、安装 Loki

  • 无需做数据持久化将 persistence.enabled=true 改为 persistence.enabled=false 即可
  • 时间本地化
  • service.httpNodePort 指定http端口
  • service.grpcNodePort 指定grpc端口
  • serviceMonitor.enabled 让普罗米修斯监控到指标
  • --set serviceMonitor.labels="prometheus-operated"
  • k8s版本低无法安装修改版本:kubeVersion: ^1.10.0-0
  • --set ingress.enabled=ture 获取ingress指标
#   添加 helm 仓库
helm repo add kube-ops https://charts.kube-ops.io

#   部署 Liki
helm install loki -n monitoring \
--set replicas=1 \
--set promtail.enabled=true \
--set service.type=ClusterIP \
--set persistence.enabled=true \
--set persistence.size="100Gi" \
--set persistence.storageClassName="loki-nfs-client" \
--set extraVolumeMounts[0].name=localtime \
--set extraVolumeMounts[0].mountPath="/etc/localtime" \
--set extraVolumes[0].name=localtime \
--set extraVolumes[0].hostPath.path="/etc/localtime" \
kube-ops/loki --version 1.6.1

3.3、查看运行 Pod 状态

root@k8s-master-01:~/Loki$ kubectl get pod -n monitoring -w
NAME                              READY   STATUS    RESTARTS   AGE
loki-0                            1/1     Running   0          70s
loki-promtail-22297               1/1     Running   0          70s
loki-promtail-4h4p8               1/1     Running   0          70s
loki-promtail-mj6xd               1/1     Running   0          70s
loki-promtail-zndlj               1/1     Running   0          70s

四、Grafana 配置

4.1、部署 Grafana

#   添加 helm 仓库
helm repo add grafana https://grafana.github.io/helm-charts

#   部署 Grafana
helm install grafana -n monitoring \
--set ingress.enabled=true \
--set ingress.hosts[0]="grafana.akiraka.net" \
--set persistence.enabled=false \
grafana/grafana --version 6.1.6

4.2、查看 Grafana Pvc 状态

root@k8s-master-01:~/Loki$ kubectl get pod -n monitoring
NAME                              READY   STATUS    RESTARTS   AGE
grafana-bbb647cb-km94j            1/1     Running   0          19d
loki-0                            1/1     Running   0          11m
loki-promtail-22297               1/1     Running   0          11m
loki-promtail-4h4p8               1/1     Running   0          11m
loki-promtail-mj6xd               1/1     Running   0          11m
loki-promtail-zndlj               1/1     Running   0          11m

4.3、配置 Grafna Loki 数据源

Dfq2RA.md.png

4.4、查看 Loki 日志

DfqLzn.md.png

4.5、查看某个服务日志

  • 这里查看 manager 名称空间中的 jenkins 日志

DfLAQ1.md.jpg

五、日志选择和过滤

5.1、日志选择器

对于查询表达式的标签部分,将其用大括号括起来{},然后使用键值语法选择标签。多个标签表达式用逗号分隔:

{namespace="manager",app_kubernetes_io_instance="jenkins"}

当前支持以下标签匹配运算符

  • = 完全相等
  • != 不相等
  • =~ 正则表达式匹配
  • !~ 不进行正则表达式匹配
{name=~"mysql.+"}
{name!~"mysql.+"}

5.2、日志过滤器

  • 编写日志流选择器后,您可以通过编写搜索表达式来进一步过滤结果。搜索表达式可以只是文本或正则表达式。
# 查询示例:
{job="mysql"} |= "error"
{name="kafka"} |~ "tsdb-ops.*io:2003"
{instance=~"kafka-[23]",name="kafka"} != kafka.server:type=ReplicaManager

#   过滤器运算符可以被链接,并将顺序过滤表达式-结果日志行将满足每个过滤器。例如:
{job="mysql"} |= "error" != "timeout"

已实现以下过滤器类型:

  • |= 行包含字符串
  • != 行不包含字符串
  • |~ 行匹配正则表达式
  • !~ 行与正则表达式不匹配

regex表达式接受RE2语法。默认情况下,匹配项区分大小写,并且可以将regex切换为不区分大小写的前缀(?i)

七、报错信息

7.1、集群配置

# 全部节点包括 master 增加
echo "fs.inotify.max_user_instances = 1024" >> /etc/sysctl.conf
# 刷新
sysctl -p

7.2、部署问题

# 当个别节点属于 Running 但一直未就绪时候,这里有个大坑
root@master-01:~$ kubectl get pod -n monitoring
NAME                                                     READY   STATUS    RESTARTS   AGE
loki-0                                                   1/1     Running   0          5m28s
loki-1                                                   1/1     Running   0          4m19s
loki-promtail-84r6m                                      1/1     Running   0          5m28s
loki-promtail-8cfqq                                      1/1     Running   0          5m28s
loki-promtail-8xhgj                                      1/1     Running   0          5m28s
loki-promtail-l5t7m                                      0/1     Running   0          5m28s
loki-promtail-l86mz                                      0/1     Running   0          5m28s
loki-promtail-lbpnc                                      1/1     Running   0          5m28s
loki-promtail-nw84k                                      1/1     Running   0          5m28s

# 日志信息、查看pod类似以下信息,可以看到找不到文件夹或者文件。
# 如果不及时解决这个问题那么会该问题会对这个节点机器有很高的磁盘写入可能达到90M/s左右
level=error ts=2021-04-07T04:47:15.500302866Z caller=filetarget.go:276 msg="failed to tail file, stat failed" error="stat /var/log/pods/kube-system_calico-node-kcs9w_191203ec-d45b-4cba-a8b1-dc1387fe4a27/calico-node/3.log: no such file or directory" filename=/var/log/pods/kube-system_calico-node-kcs9w_191203ec-d45b-4cba-a8b1-dc1387fe4a27/calico-node/3.log

# 解决方法,删除改目录下全部文件夹即可,不会对生产有任何影响放心删
rm -rf /var/log/pods/*

版权声明:
作者:Akiraka
链接:https://www.akiraka.net/kubernetes/849.html
来源:Akiraka
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
Helm 部署 Loki 日志聚合
一、loki 介绍 1.1、loki 是什么 Loki是一个水平可扩展,高可用性,多租户的日志聚合系统,受到Prometheus的启发。它的设计非常经济高效且易于操作,因为它不……
<<上一篇
下一篇>>