Kubernetes基于pod内的文件进行日志记录

时间:2018-03-30 22:14:08

标签: docker elasticsearch logging kubernetes

我有一个Kubernetes集群,它有一些应用程序窗格,它们在每个窗格内生成多个日志文件。我想在像elasticsearch这样的集中式日志记录解决方案中记录这些文件。日志既不是pod的stdout / stderr的一部分,也不是作为主机卷安装的。所以基本上我需要一些解决方案,从我的pod读取文件并将其发送到elasticsearch或其他一些日志记录解决方案。

另外,我需要针对相同用例的解决方案,但是如果独立的Docker容器没有在Kubernetes上运行。

2 个答案:

答案 0 :(得分:2)

  

也不会将它们作为主机卷安装

存在您的问题:您需要公开 主机卷的路径,以便您现有的集中式日志诽谤工具可以看到它们。我知道在执行此操作时唯一的星号是要注意权限,如果您的进程以root用户身份运行,这将不会成为问题,但如果非root用户将会出现问题 - 您需要批量安装主机具有允许容器进程打开文件的权限的目录。

但是,我已经足够长时间知道在处理容器化软件时总是“是的,但是”,所以你可以考虑另外两种选择。

如果您正在使用一个现有的日志聚合工具,它希望所有日志记录输出都出现在容器的stdout和stderr上,那么您将希望利用容器内的根进程能够写入任何容器。文件将日志发送到容器的stdout和stderr的“pid 1”,至少以我知道的两种方式之一:

直接登录到stdout

某些日志记录框架会容忍被赋予“文件路径”并且会高兴地打开它并开始写入它:

<log4j:configuration>
  <appender name="DOCKER_STDOUT" class="org.apache.log4j.FileAppender">
    <param name="File" value="/proc/1/fd/1"/>

BTW:这只是一个例子,我现在还不知道log4j是否容忍这样的事情

重定向到stdout

与之前的策略类似,具有不需要更改应用程序配置的优点,并且可以100%的时间工作;但缺点是使集群内部署更加复杂。

我必须使用kong:0.10容器执行此操作,因为它们的日志记录情况只写入文件,并且不能容忍指向上面的文件描述符。

需要修改command:块以启动应用程序,然后为容器内日志生成tail,或使用某种部署后的技巧{{1} }并开始exec

tail

如果应用程序将文件从tail -f /the/inside/file.log > /proc/1/fd/1 下方旋转出来,则选择使用“tail -F”;如果需要在部署后{{1}保护进程免于终止,则使用tail shell退出

答案 1 :(得分:0)

我会考虑将持久性音量安装到您的pod。 使用像流利的侧车容器,您可以将这些日志文件转发到elasticsearch。 在docker引擎的情况下,可以在2个docker进程之间共享相同的卷。