目前,我在 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
如果需要更多信息,请告诉我。