背景:

在一个k8s集群上,以daemonset的方式部署的filebeat,收集k8s各节点运行容器的日志。发现其中有一个宿主机节点的日志无法被收集上来,其他节点日志收集正常。

排查:

1. Filebeat运行的POD状态为Running状态。

2. 查看该filebeat运行日志,无异常信息。

3. 登录该异常的宿主机节点,进入filebeat配置文件配置的收集容器日志的目录,存在日志文件。

似乎看起来都正常。

再仔细看filebeat运行日志,在harvester相关的日志条目中,没有容器日志的目录。

同事找到了相关的文章,记一次EFK采集不到k8s日志数据的解决过程 - 代码天地

此文章出现问题的原因和我们的情况相似,但没有具体分析root cause。我来展开分析一下root cause:

filebeat pod挂载的容器Volume映射到宿主机上默认是/var/lib/docker/containers,而该k8s节点安装的docker不按标准的方式,放在了另外一个位置,导致宿主机的该目录,没有被挂载到filebeat pod中。而filebeat在pod收集的日志文件,需要通过软链接的方式,指向到/var/lib/docker/containers目录中。结果,在pod中,该软链接指向到了一个不存在的文件。尽管,在宿主机中,此软链接能正常指向。

兼容解决办法:

在filebeat的daemonset yaml配置文件中,添加该特殊目录至volumes和volumeMounts中。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐