在kubernetes上进行流畅的日志记录会跳过日志轮换上的日志

时间:2018-06-29 08:56:54

标签: logging kubernetes fluentd log-rotation

目前,我在kubernetes中具有以下架构:

  • 在pod中,服务和Sidecar容器(称为logger)正在运行。
  • 服务写入文件,sidecar容器读取该文件并将其写入stdout。
  • 配置fluentd守护程序集以读取输出(收集在/var/log/containers/*_logger-*.log中的文件中,该输出是到另一个文件的链接(自上次文件旋转以来的最新文件,到较旧的文件,没有链接)点)。
  • 总是3条日志消息属于同一字段(某些字段相同)

此配置可正常处理数千条消息。

但是,这里有问题:

我注意到,尽管所有3条消息都是由服务和sidecar容器编写的,但流利的有时仅转发属于3条消息的logmessage 1或2。

为便于说明,假设转发1,不转发2和3。经过研究后,我发现在这种情况下,消息1是日志旋转之前的最后一条消息,消息2和3在另一个文件中(自旋转以来,符号链接指向该文件,因此应该读取)。

因此,看起来fluentd跳过了几行,然后在kubernetes日志轮换后继续读取新文件。

  • 这是一个已知问题吗?
  • 为什么流利并且kubernetes如此?
  • 主要问题:为了接收所有日志消息,我该怎么做才能防止这种情况发生?

我正在使用docker-image fluent/fluentd-kubernetes-daemonset:v0.12.33-elasticsearch

如果需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

TLDR

理论上,这应该与最新版本的fluentd-kubernetes-daemonset一起使用。如果不是默认值rotate_wait,可能由于时序问题而需要为in_tail_container_logs配置覆盖。

为此,您需要创建一个自定义docker映像,该映像将覆盖kubernetes.conf文件,或将配置映射与您的自定义配置一起使用,将其安装在容器中并将FLUENT_CONF设置为安装目录中的主配置文件。

说明

泊坞窗进程正在从容器的stdout和stderr中读取。 在将流刷新到日志文件时,它还将跟踪设置的限制。达到限制后,它将开始日志轮换。

同时流利的看着符号链接。当符号链接更改时,由于新创建的日志文件为空,因此会触发fluentd的文件查看器将其内部指针更新为实际日志文件,并重置pos文件中的位置。

使用配置参数rotate_wait,我们告诉fluentd等待设置的秒数(默认为5),以便可以将刷新到文件(或即将删除)的最后一条日志行在继续新创建的日志文件之前,请先进行选择。这还将确保以正确的顺序处理日志行。