在默认位置找不到Kubernetes日志



在运行春季启动应用程序的k8s环境中,我检查了/var/log/var/lib中的日志位置,但都为空。然后我在/tmp/spring.log中找到了日志位置。这似乎是默认的日志位置。我的问题是

  1. kubectl log如何知道它应该从/tmp位置读取日志。我在kubectl logs命令上得到日志输出
  2. 我在有输入的地方配置了fluent bit

之后

[INPUT]
Name              tail
Tag               kube.dev.*
Path              /var/log/containers/*dev*.log
DB                /var/log/flb_kube_dev.db

这表明它应该从/var/log/containers/读取日志,但它没有日志。然而,我正在成功地获得流畅的位日志。我在这里错过了什么?

Docker日志只包含PID为1的容器进程(容器的entrypointcmd进程(转储到STDOUT上的日志。

如果希望通过kubectl logsdocker logs查看日志,则应将应用程序日志重定向到STDOUT,而不是文件/tmp/spring.log。下面是一个很好的例子,说明如何用最少的努力实现这一点。


或者,您也可以使用hostPath volumeMount。通过这种方式,您可以直接从主机上的路径访问日志。

使用hostPath volumeMount时发出警告

如果pod由于某种原因被转移到另一台主机,您的日志将不会随之移动。将在同一路径的新主机上创建一个新的日志文件。

如果要在容器外(以及集群的主机节点上(搜索日志的实际位置,这取决于以下几点。我想您正在使用Docker在Kubernetes下运行容器,这是最常见的设置。

在Kubernetes集群的每个节点上,您可以使用以下命令来检查当前使用的日志驱动程序:

docker info | grep -i logging

默认值应该是json-file,这意味着日志将作为json从容器写入主机节点上的某个位置。

如果您找到另一个驱动程序,例如journald,那么这意味着Docker日志驱动程序将日志直接发送到systemd日志。有许多日志驱动程序,因此作为第一次检查,您应该确保您的所有Kubernetes节点都配置为以json文件的形式进行日志记录(或者,以您需要获取它们的方式(。


完成后,您可以开始检查容器记录自己日志的位置。选择要分析的Pod,然后:

识别它在上运行的Kubernetes节点

kubectl get pod pod-name -owide

用类似以下的东西获取集装箱ID

kubectl get pod pod-name -ojsonpath='{.status.containerStatuses[0].containerID}'

其中id应该是docker://f834508490bd2b248a2bbc1efc4c395d0b8086aac4b6ff03b3cc8fd16d10ce2c形状的东西

在运行该容器的Kubernetes节点上删除docker://部分和SSH,然后执行

docker inspect container-id | grep -i logpath

它应该为您提供特定容器的日志位置。您可以在文件上尝试tail,以检查日志是否真的存在。


在我的情况下,我尝试这个过程的容器正在登录:

/var/lib/docker/containers/289271086d977dc4e2e0b80cc28a7a6aca32c888b7ea5e1b5f24b28f7601ff63/289271086d977dc4e2e0b80cc28a7a6aca32c888b7ea5e1b5f24b28f7601ff63-json.log

相关内容

  • 没有找到相关文章

最新更新