我配置了一个filebeat来发送我的k8s集群日志到Elasticsearch。
当我直接连接到pod(kubectl exec -it -- sh -c bash
),生成的输出日志并没有被发送到目的地。
在挖掘k8s文档时,我找不到k8s是如何处理运行中的shell
的STDOUT
的。
我怎样才能配置k8s来发送实时的shell日志?
我配置了一个filebeat来发送我的k8s集群日志到Elasticsearch。
当我直接连接到pod(kubectl exec -it -- sh -c bash
),生成的输出日志并没有被发送到目的地。
在挖掘k8s文档时,我找不到k8s是如何处理运行中的shell
的STDOUT
的。
我怎样才能配置k8s来发送实时的shell日志?
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
的文件描述符中。这样做也行,但有一个问题,就是需要手动重定向。
你的答案