我怎样才能让日志轮换在 kubernetes container/pod 中工作?

How can I get log rotation working inside a kubernetes container/pod?

我们的设置:

我们在 GCP 中使用 kubernetes。 我们有 pods 将日志写入共享卷,并使用一个 sidecar 容器为我们的日志系统吸取日志。 我们不能只使用 stdout 代替此过程。

其中一些 pods 长期存在并且由于没有日志轮换而正在填满磁盘 space。

问题: 防止磁盘 space 填满的最简单方法是什么(无需安排 pod 重启)?

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

我觉得我找错人了,或者错过了一些让这项工作不可或缺的东西。任何帮助将不胜感激。

如果您写入文件系统,则创建日志的应用程序应负责轮换。如果您是 运行 具有 logback 或 log4j 的 java 应用程序,则配置更改很简单。对于其他 languages/frameworks 通常是类似的。

如果这不是一个选项,您可以使用专门的工具来处理旋转并将输出传递给它。一个例子是 http://cr.yp.to/daemontools/multilog.html

作为万不得已的方法,您可以调查登录到命名管道 (FIFO) 而不是真实文件,并让一些其他进程处理数据的检索和写入 - 包括轮换。

一般情况下,您应该将日志写入stdout,并配置ELK stack等日志收集工具。这是最佳实践。

但是,如果您想 运行 将 logrotate 作为容器中的一个单独进程 - 您可以使用 Supervisor,它作为一个非常简单的初始化系统并允许您 运行 尽可能多的并行根据需要在容器中处理。

可以在此处找到使用 Supervisor 轮换 Nginx 日志的简单示例:https://github.com/misho-kr/docker-appliances/tree/master/nginx-nodejs

我们最终编写了自己的守护程序集,以正确地从节点而不是容器级别收集日志。然后我们停止从容器写入共享卷并仅记录到标准输出。

我们使用 fluentd 来记录周围的日志。

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