如何在Kubernetes容器/吊舱内进行日志轮转?

时间:2019-04-18 18:19:02

标签: kubernetes google-cloud-platform logrotate

我们的设置:

我们在GCP中使用kubernetes。 我们有一个Pod,用于将日志写入共享卷,并带有一个sidecar容器,该容器吸收了我们的日志系统的日志。 我们不能仅在此过程中使用stdout。

其中一些容器的寿命很长,并且由于没有日志循环而正在占用磁盘空间。

问题: 防止磁盘空间在这里被填满(不调度pod重新启动)的最简单方法是什么?

我一直试图在我们的Dockerfile中使用RUN apt-get install -y logrotate安装logrotate并将一个logrotate配置文件放置在/etc/logrotate.d/dynamicproxy中,但是它似乎没有运行。 /var/lib/logrotate/status永远不会生成。

我感觉自己在树错了树皮,或者缺少使它正常工作所必需的东西。任何帮助将不胜感激。

3 个答案:

答案 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。

我们使用流利的日志。

https://github.com/splunk/splunk-connect-for-kubernetes/tree/master/helm-chart/splunk-kubernetes-logging