【问题标题】: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】:

      使用以下流程:

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

      【讨论】:

        猜你喜欢
        • 2019-01-20
        • 1970-01-01
        • 2021-11-19
        • 2018-11-16
        • 1970-01-01
        • 2018-09-15
        • 2022-01-18
        • 2021-07-01
        • 1970-01-01
        相关资源
        最近更新 更多