在运行春季启动应用程序的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日志只包含PID为1的容器进程(容器的entrypoint
或cmd
进程(转储到STDOUT上的日志。
如果希望通过kubectl logs
或docker 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