在默认位置找不到 Kubernetes 日志?
Kubernetes logs not found in default locations?
在运行 spring-boot 应用程序的 k8s 环境中,我检查了 /var/log
和 /var/lib
中的日志位置,但两者都是空的。然后我在 /tmp/spring.log
中找到了日志位置。这似乎是默认的日志位置。我的问题是
kubectl log
如何知道它应该从 /tmp
位置读取日志。我在 kubectl logs
命令上得到日志输出。
- 我在输入为
的地方配置了 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 的容器进程(您容器的 entrypoint
或 cmd
进程)转储到 STDOUT 的日志。
如果您想通过 kubectl logs
或 docker logs
查看日志,您应该将应用程序日志重定向到 STDOUT 而不是文件 /tmp/spring.log
。 Here's 一个很好的例子,说明如何以最小的努力实现这一目标。
或者,您也可以使用 hostPath volumeMount。这样就可以直接从主机上的路径访问日志了。
使用 hostPath volumeMount 时出现警告
如果 pod 由于某种原因转移到另一个主机,您的日志将不会随之移动。将在同一路径的新主机上创建一个新的日志文件。
在运行 spring-boot 应用程序的 k8s 环境中,我检查了 /var/log
和 /var/lib
中的日志位置,但两者都是空的。然后我在 /tmp/spring.log
中找到了日志位置。这似乎是默认的日志位置。我的问题是
kubectl log
如何知道它应该从/tmp
位置读取日志。我在kubectl logs
命令上得到日志输出。- 我在输入为 的地方配置了 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 的容器进程(您容器的 entrypoint
或 cmd
进程)转储到 STDOUT 的日志。
如果您想通过 kubectl logs
或 docker logs
查看日志,您应该将应用程序日志重定向到 STDOUT 而不是文件 /tmp/spring.log
。 Here's 一个很好的例子,说明如何以最小的努力实现这一目标。
或者,您也可以使用 hostPath volumeMount。这样就可以直接从主机上的路径访问日志了。
使用 hostPath volumeMount 时出现警告
如果 pod 由于某种原因转移到另一个主机,您的日志将不会随之移动。将在同一路径的新主机上创建一个新的日志文件。