3. 使用Loki收集K8s日志 3.1 架构说明 无论是ELK、EFK还是Filebeat,都需要用到Elasticsearch来存储数据,Elasticsearch本身就像“一座大山”,维护难度和资源使用都是偏高的。对于很多公司而言
3. 使用Loki收集K8s日志
3.1 架构说明
无论是ELK、EFK还是Filebeat,都需要用到Elasticsearch来存储数据,Elasticsearch本身就像“一座大山”,维护难度和资源使用都是偏高的。对于很多公司而言,特别是新创公司,可能并不想大费周章地去搭建一个ELK、EFK或者其他重量级的日志平台,刚开始的人力投入可能是大于收益的,所以就需要一个更轻量的日志收集平台。
一个基于Kubernetes平台的原生日志收集平台Loki Stack应运而生,相对于上述技术栈,Loki的安装、架构、使用都比较简单,能够满足大部分的工作需求。
可以看到主要包含如下组件:
- Loki:主服务器,负责日志的存储和查询,参考了Prometheus的服务发现机制,将标签添加到日志流,而不是像其他平台一样进行全文索引。
- Promtail:负责收集日志并将其发送给Loki,主要用于发现采集目标以及添加对应Label,最终发送给Loki。
- Grafana:用来展示或查询相关日志,可以在页面查询指定标签Pod的日志。
Loki不对日志进行全文索引,仅索引相关日志的元数据,所以Loki操作起来更简单、更省成本。而且Loki是基于Kubernetes进行设计的,可以很方便地部署在Kubernetes上,并且对集群的Pod进行日志采集,采集时会将Kubernetes集群中的一些元数据自动添加到日志中,让技术人员可以根据命名空间、标签等字段进行日志的过滤,可以很快速地定位到相关日志。
3.2 部署Loki
添加helm仓库并拉取helm包
helm repo add grafana https://grafana.github.io/helm-charts
helm pull grafana/loki-stack
helm包版本是loki-stack-2.9.11,提前拉取需要部署服务的镜像到本地Harbor仓库,对以下文件中的镜像地址进行修改。
#一下镜像版本的查看
#loki-stack/values.yaml 下看grafana的配置,tag 是8.3.5
#loki-stack/charts/promtail/Chart.yaml 下看appVersion 是2.8.3
#/root/efk-7.10.2/loki-stack/values.yaml
docker pull bats/bats:1.8.2
#/root/efk-7.10.2/loki-stack/charts/grafana/values.yaml
docker pull grafana/grafana:8.3.5
docker pull bats/bats:1.4.1
docker pull curlimages/curl:7.85.0
docker pull busybox:1.13.1
docker pull quay.io/kiwigrid/k8s-sidecar:1.19.2
docker pull grafana/grafana-image-renderer
#/root/efk-7.10.2/loki-stack/charts/promtail/values.yaml
docker pull docker.io/grafana/promtail:2.8.3
docker pull docker.io/jimmidyson/configmap-reload:v0.8.0
#/root/efk-7.10.2/loki-stack/charts/loki/values.yaml
docker pull grafana/loki:2.6.1
创建 Loki Namespace、 Loki Stack
#/root/efk-7.10.2/loki-stack/下进行
kubectl create ns loki
helm --install loki . --set grafana.enabled=true --set grafana.service.type=NodePort -n loki
查看 Pod 状态
查看 Grafana 的 Service 暴露的端口号
之后通过任意一个安装了 kube-proxy 的节点的 IP 加上 31053 即可访问 Grafana
#查看 Grafana 密码(账号 admin)
kubectl get secret --namespace loki loki-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
Tips:Loki默认没持久化数据,可以进行修改配置文件实现持久化存储。
3.3 清理
[root@k8s-master01 loki-stack]# pwd
/root/efk-7.10.2/loki-stack
[root@k8s-master01 loki-stack]# helm delete -n loki loki
[root@k8s-master01 loki-stack]# kubectl delete ns loki