【问题标题】:Access k8s pod logs generated from ssh exec访问 ssh exec 生成的 k8s pod 日志
【发布时间】:2023-03-16 01:35:01
【问题描述】:
我有一个 filebeat 配置为将我的 k8s 集群日志发送到 Elasticsearch。
当我直接连接到 Pod 时 (kubectl exec -it <pod> -- sh -c bash),
生成的输出日志没有发送到目的地。
挖掘 k8s 文档,我找不到 k8s 如何从正在运行的 shell 处理 STDOUT。
如何配置 k8s 发送实时 shell 日志?
【问题讨论】:
标签:
elasticsearch
kubernetes
logging
filebeat
【解决方案1】:
Kubernetes(大部分)与此无关,因为日志记录由用于支持 Kubernetes 的容器环境(通常是 docker)处理。
根据 docker 版本,容器日志可以写入 json-file、journald 或更多,默认为 json 文件。您可以通过docker info | grep -i logging 来检查 docker 使用的 Logging Driver 是什么。如果结果是 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 的描述符
效果很好,但存在需要手动重定向的问题。
【解决方案2】:
使用以下流程:
- 在您的应用程序中进行更改以将日志推送到 STDOUT。您可以在日志记录配置文件中进行配置。
- 配置文件以读取那些 STDOUT 日志(最终是一些 docker 日志文件位置,如 /var/log 等)
- 将您的文件作为 DeamonSets 启动,以便可以将来自新 pod 和节点的日志从解剖学上推送到 ES。
- 为了提高日志的可读性,请确保以 json 格式推送日志。