前面我们已经将SpringBoot项目部署在K8S中,此时需要filebeat收集日志并通过ELK进行展示,以用于后续的问题排查及监控。
与传统的日志收集不同:
- pod所在节点不固定,每个pod中运行filebeat,配置繁琐且浪费资源;
- pod的日志目录一般以emptydir方式挂载在宿主机,目录不固定,filebeat无法自动匹配;
- pod持续增多,filebeat需要做到自动检测并收集;
因此最好的收集方式为node节点上的一个filebeat能够收集所有的pod日志,但是这就要求统一的日志收集规则、目录以及输出方式。
下面我们就按这个思路进行思考。
日志目录
K8S中的日志目录有以下三种:
- /var/lib/docker/containers/
- /var/log/containers/
- /var/log/pods/
为什么会有这三种目录呢?这就要从容器运行时(Container Runtime)组件说起了:
- 当Docker 作为 k8s 容器运行时,容器日志的落盘将由 docker 来完成,保存在/var/lib/docker/containers/$CONTAINERID 目录下。Kubelet 会在 /var/log/pods 和 /var/log/containers 下建立软链接,指向 /var/lib/docker/containers/CONTAINERID 该目录下的容器日志文件。
- 当Containerd 作为 k8s 容器运行时, 容器日志的落盘由 Kubelet 来完成,保存至 /var/log/pods/$CONTAINER_NAME 目录下,同时在 /var/log/containers 目录下创建软链接,指向日志文件。
# 1.查看/var/log/containers目录下文件,已被软链到/var/log/pods中的xx.log文件按# cd /var/log/containers && lllrwxrwxrwx 1 root root 107 Jun 15 15:39 kube-apiserver-uvmsvr-3-217_kube-system_kube-apiserver-7fbb97008724e35427262c1ac294c24d7771365b9facf5f5a49c6b15f032e441.log -> /var/log/pods/kube-system_kube-apiserver-uvmsvr-3-217_837ea80229ea9cd5bbf448f4f0386cbc/kube-apiserver/1.loglrwxrwxrwx 1 root root 107 Aug 21 11:39 kube-apiserver-uvmsvr-3-217_kube-system_kube-apiserver-fd8b454b07b8701045f007bd55551aae60f376d1aee07729779ec516ea505239.log -> /var/log/pods/kube-system_kube-apiserver-uvmsvr-3-217_837ea80229ea9cd5bbf448f4f0386cbc/kube-apiserver/2.log...只列举部分...# 2.查看/var/log/pods目录下的文件,xx.log 最终又软链到/var/lib/docker/containers/ 下的xxx-json.log# cd /var/log/podsll /var/log/pods/kube-system_kube-apiserver-uvmsvr-3-2