【问题标题】:Fluentd logging on kubernetes skips logs on log rotationKubernetes 上的 Fluentd 日志记录跳过日志轮换的日志
【发布时间】:2018-12-08 10:12:18
【问题描述】:

目前,我在 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 位于另一个文件中(符号链接自轮换以来指向的位置,因此应该阅读)。

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

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

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

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

【问题讨论】:

    标签: logging kubernetes fluentd log-rotation


    【解决方案1】:

    TLDR

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

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

    解释

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 2021-02-02
      相关资源
      最近更新 更多