【问题标题】:Get log files from Pod (containers) before it get killed?在 Pod(容器)被杀死之前从它获取日志文件?
【发布时间】:2020-01-03 11:53:21
【问题描述】:

我在一个 pod 中有 2 个容器,1 个是数据库,1 个是应用程序。当我的应用程序容器启动但此时尚未准备好接受流量时,容器会生成一些日志文件,我希望这些日志文件用于进一步的应用程序调查。由于容器没有通过就绪探测并且无法启动,因此 Pod 被杀死,日志文件也被删除,所以我如何在 Pod 被杀死之前获取这些日志文件??

【问题讨论】:

  • 您应该研究如何使用oc debug 并运行一个实例来获得交互式shell 访问。然后,您可以手动运行原始启动命令并观察发生的情况,如有必要,使用单独的终端将oc rsh 连接到调试 pod 以跟踪任何基于文件系统的日志。使用文件系统日志是不好的做法,应该发送到 stdout/stderr 以便平台可以捕获它们。
  • 也许有点傻,也许有用;但您可以重新尝试升级部署并在准备情况检查期间检查日志,只需使用kubectl logs <podname>

标签: kubernetes openshift kubernetes-helm openshift-origin kubernetes-pod


【解决方案1】:

最快的解决方案可能是将 hostPath 类型的卷挂载到您的 pod。然后,将此卷绑定到您的日志目录。
请参阅文档here

请记住,此解决方案肯定不是最干净的解决方案。仅用于调试目的。

【讨论】:

    【解决方案2】:

    如何将日志转发到 STDOUT 和 STDERR?那将是最干净的解决方案(但是,它需要对您的代码进行一些更改)。 https://kubernetes.io/docs/reference/kubectl/cheatsheet/#interacting-with-running-pods

    【讨论】:

      【解决方案3】:

      一次性解决方案是安装stern,然后在启动应用程序容器之前在单独的终端中运行以下命令:

      stern <pod_name>
      

      然后您可以将输出通过管道传输到本地存储以供进一步分析

      【讨论】:

        【解决方案4】:

        您可以使用oc logs 命令的-c CONTAINER 标志来获取pod 内容器的日志。

        如果您知道 pod 中容器的名称,则可以使用如下命令获取该容器的日志

        for i in {1..100}; do oc get pods -o name | grep -v "deploy" | xargs -i oc logs -p {} -c CONTAINER_NAME; done

        当然,如果您只在一个空项目中使用失败的 pod 运行它会很好。

        【讨论】:

          【解决方案5】:

          创建一个持久化卷并将其挂载到容器的日志目录中。即使 pod 被杀死,您也会得到日志。您可以用于此任务的卷类型很少 -

          • 天蓝色磁盘
          • 主机路径
          • gce 永久磁盘 最简单的是 hostpath 但不是首选。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-09-25
            • 1970-01-01
            • 1970-01-01
            • 2019-07-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-06-03
            相关资源
            最近更新 更多