目前,我在kubernetes中具有以下架构:
logger
)正在运行。 /var/log/containers/*_logger-*.log
中的文件中,该输出是到另一个文件的链接(自上次文件旋转以来的最新文件,到较旧的文件,没有链接)点)。此配置可正常处理数千条消息。
但是,这里有问题:
我注意到,尽管所有3条消息都是由服务和sidecar容器编写的,但流利的有时仅转发属于3条消息的logmessage 1或2。
为便于说明,假设转发1,不转发2和3。经过研究后,我发现在这种情况下,消息1是日志旋转之前的最后一条消息,消息2和3在另一个文件中(自旋转以来,符号链接指向该文件,因此应该读取)。
因此,看起来fluentd跳过了几行,然后在kubernetes日志轮换后继续读取新文件。
我正在使用docker-image fluent/fluentd-kubernetes-daemonset:v0.12.33-elasticsearch
如果需要更多信息,请告诉我。
答案 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),以便可以将刷新到文件(或即将删除)的最后一条日志行在继续新创建的日志文件之前,请先进行选择。这还将确保以正确的顺序处理日志行。