我们的设置:
我们在GCP中使用kubernetes。 我们有一个Pod,用于将日志写入共享卷,并带有一个sidecar容器,该容器吸收了我们的日志系统的日志。 我们不能仅在此过程中使用stdout。
其中一些容器的寿命很长,并且由于没有日志循环而正在占用磁盘空间。
问题: 防止磁盘空间在这里被填满(不调度pod重新启动)的最简单方法是什么?
我一直试图在我们的Dockerfile中使用RUN apt-get install -y logrotate
安装logrotate并将一个logrotate配置文件放置在/etc/logrotate.d/dynamicproxy
中,但是它似乎没有运行。 /var/lib/logrotate/status
永远不会生成。
我感觉自己在树错了树皮,或者缺少使它正常工作所必需的东西。任何帮助将不胜感激。
答案 0 :(得分:1)
通常,您应该将日志写入stdout并配置日志收集工具,例如ELK stack。这是最佳做法。
但是,如果要在容器中将logrotate作为一个单独的进程运行-您可以使用Supervisor,它是一个非常简单的初始化系统,并允许您在容器中运行任意数量的并行进程。
使用Supervisor旋转Nginx日志的简单示例可以在这里找到:https://github.com/misho-kr/docker-appliances/tree/master/nginx-nodejs
答案 1 :(得分:0)
如果您写入文件系统,则创建日志的应用程序应负责轮换。如果您正在运行带有logback或log4j的Java应用程序,则只需进行简单的配置更改即可。对于其他语言/框架,通常是相似的。
如果不是这样,则可以使用专用工具来处理旋转并将输出通过管道传递给它。一个示例是http://cr.yp.to/daemontools/multilog.html
作为最后的方法,您可以研究登录到命名管道(FIFO)而不是真实文件中,并使用其他一些过程来处理数据的检索和写入-包括循环。
答案 2 :(得分:0)
我们最终编写了自己的守护程序集,以正确地从节点而不是容器级别收集日志。然后,我们停止从容器写入共享卷,并仅记录到stdout。
我们使用流利的日志。