在默认位置找不到 Kubernetes 日志?

Kubernetes logs not found in default locations?

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

  1. kubectl log 如何知道它应该从 /tmp 位置读取日志。我在 kubectl logs 命令上得到日志输出。
  2. 我在输入为
  3. 的地方配置了 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 到 运行 你在 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

形状的东西

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

docker inspect container-id | grep -i logpath

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


就我而言,我在其上尝试此过程的容器正在登录:

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

Docker 日志仅包含由 PID 为 1 的容器进程(您容器的 entrypointcmd 进程)转储到 STDOUT 的日志。

如果您想通过 kubectl logsdocker logs 查看日志,您应该将应用程序日志重定向到 STDOUT 而不是文件 /tmp/spring.logHere's 一个很好的例子,说明如何以最小的努力实现这一目标。


或者,您也可以使用 hostPath volumeMount。这样就可以直接从主机上的路径访问日志了。

使用 hostPath volumeMount 时出现警告

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