访问从ssh exec生成的k8s pod日志

啊啊 发表于: 2021-04-26   最后更新时间: 2021-04-27 00:12:04   1,559 游览

我配置了一个filebeat来发送我的k8s集群日志到Elasticsearch。

当我直接连接到pod(kubectl exec -it -- sh -c bash),生成的输出日志并没有被发送到目的地。

在挖掘k8s文档时,我找不到k8s是如何处理运行中的shellSTDOUT的。

我怎样才能配置k8s来发送实时的shell日志?

发表于 2021-04-26

Kubernetes(大部分)与此无关,因为日志是由用于支持Kubernetes的容器环境处理的,通常是docker。

根据docker的版本,容器的日志可以写在json文件、journald或更多,默认是json文件。你可以做一个docker info | grep -i logging来检查docker使用的日志驱动是什么。如果结果是json-file,那么日志就被写在json格式的文件中。如果是其他值,则说明日志是以其他方式处理的(由于有各种日志驱动,我建议查看相关文档)

如果日志被写入文件,通过使用docker inspect container-id | grep -i logpath,你就可以看到节点上的路径。

Filebeat只是从这些文件中获取日志,由docker处理容器内的应用程序STDOUT和其中一个文件之间的重定向,并使用其驱动程序。

关于exec命令不在日志中的问题,这是一个开放的建议(https://github.com/moby/moby/issues/8662) 因为不是所有的东西都被重定向,只是由入口本身启动的应用程序的日志。

有一个建议的解决方法 (https://github.com/moby/moby/issues/8662#issuecomment-277396232)

同时,你可以试试这个...

echo hello > /proc/1/fd/1

将你的输出重定向到PID 1(docker容器)STDOUT的文件描述符中。

这样做也行,但有一个问题,就是需要手动重定向。

你的答案

查看kubernetes相关的其他问题或提一个您自己的问题