AKS集群部署Fluentd采集日志出现重复写入Elasticsearch问题求助
问题根因
当前Fluentd采用DaemonSet模式部署,每个AKS集群节点都会运行一个Fluentd实例。你配置的日志采集路径为所有节点统一挂载的Azure文件共享路径,所有节点的Fluentd都会读取同一份日志文件,每条日志被每个实例各采集上报一次,最终重复次数和集群节点数完全一致。
解决方案
方案1(最优推荐,符合Kubernetes日志采集规范)
调整应用输出配置,将自定义日志直接打印到stdout/stderr,无需写入共享文件存储。Fluentd默认仅采集当前节点上运行的容器的标准输出日志,不会出现跨节点重复采集的问题。
方案2(必须保留日志写入共享文件存储的场景)
修改Fluentd部署模式,将DaemonSet改为单实例Deployment,仅运行一个Fluentd实例专门负责读取共享存储内的日志文件,从根源上避免多实例重复采集。如果日志量较大可配置HPA弹性扩缩容,注意将pos文件挂载到独立共享存储,避免实例重启后重复读取历史日志。
方案3(无需调整部署和应用配置,快速修复)
通过配置去重逻辑避免Elasticsearch存储重复日志:
- 先在Fluentd镜像中预装
fluent-plugin-record-modifier、fluent-plugin-digest插件 - 调整Fluentd ConfigMap,新增Filter段生成日志唯一标识:
<filter kubernetes.**> @type record_modifier <record> _unique_id ${Digest::SHA256.hexdigest(record.to_json + time.to_i.to_s)} </record> </filter>
- 修改Elasticsearch输出配置,指定用生成的唯一标识作为文档ID:
<match **> @type elasticsearch # 原有其余配置保持不变 id_key _unique_id </match>
配置生效后,重复上报的同一条日志会因为文档ID一致被Elasticsearch自动覆盖,不会出现重复条目。
内容的提问来源于stack exchange,提问作者Hitesh Nayyar
相关产品推荐
相关产品推荐

