1

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

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

对于数千条消息,此配置按预期工作。

但是,这里有问题:

我注意到 fluentd 有时只转发属于一起的 3 条消息中的 1 或 2 条日志消息,尽管所有 3 条消息都是由服务和 sidecar 容器编写的。

为了解释,假设 1 被转发,2 和 3 不被转发。经过一番研究,我发现,在这种情况下,消息 1 是日志轮换之前的最后一条消息,消息 2 和 3 位于另一个文件中(符号链接自轮换以来指向的位置,因此应该阅读)。

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

  • 这是一个已知问题吗?
  • 为什么fluentd和kubernetes会这样?
  • 主要问题是:为了接收所有日志消息,我能做些什么来防止这种行为?

我正在使用泊坞窗图像fluent/fluentd-kubernetes-daemonset:v0.12.33-elasticsearch

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

4

1 回答 1

1

TLDR

理论上,这应该适用于最新版本的fluentd-kubernetes-daemonset. 如果它不是默认值,则可能由于时间问题rotate_wait需要覆盖配置。in_tail_container_logs

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

说明

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

同时 fluentd 正在查看符号链接。当符号链接更改时,fluentd 的文件观察器将被触发以更新其指向实际日志文件的内部指针并重置 pos 文件中的位置,因为新创建的日志文件是空的。

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

于 2019-02-04T16:40:42.547 回答