我有一个 filebeat
配置为将我的 k8s 集群日志发送到 Elasticsearch
。
当我直接连接到 Pod 时 (kubectl exec -it <pod> -- sh -c bash
),
生成的输出日志没有发送到目的地。
查阅 k8s 文档,我找不到 k8s 如何从正在运行的 shell 处理 STDOUT。
如何配置 k8s 以发送实时 shell 日志?
答案 0 :(得分:1)
Kubernetes(大部分)与此无关,因为日志记录由用于支持 Kubernetes 的容器环境(通常是 docker)处理。
根据 docker 版本,容器的日志可以写入 json-file、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 的描述符
哪个工作正常,但需要手动重定向。
答案 1 :(得分:0)
使用以下流程: