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

时间:2021-04-26 05:49:14

标签: elasticsearch kubernetes logging filebeat

我有一个 filebeat 配置为将我的 k8s 集群日志发送到 Elasticsearch
当我直接连接到 Pod 时 (kubectl exec -it <pod> -- sh -c bash),
生成的输出日志没有发送到目的地。

查阅 k8s 文档,我找不到 k8s 如何从正在运行的 shell 处理 STDOUT。

如何配置 k8s 以发送实时 shell 日志?

2 个答案:

答案 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)

使用以下流程:

  1. 在您的应用程序中进行更改以将日志推送到 STDOUT。您可以在日志记录配置文件中对此进行配置。
  2. 配置文件以读取这些 STDOUT 日志(最终是一些 docker 日志文件位置,如 /var/log 等)
  3. 将您的文件作为 DeamonSets 启动,以便可以将来自新 Pod 和节点的日志按解剖结构推送到 ES。
  4. 为了提高日志的可读性,请确保以 json 格式推送日志。