ECK Filebeat按Kubernetes Namespace自动发现过滤不生效问题咨询
问题根因分析
你当前配置过滤不生效的核心原因有2个:
- 你开启了
hints.enabled: true,但未禁用默认采集配置,未匹配到你写的模板的容器,会触发hints的默认采集规则,采集所有容器日志 - 你仅在模板层面配置了匹配命名空间时的采集规则,未对不匹配的容器做丢弃处理,自动发现会默认生成全量容器的采集配置
排查思路
- 先确认Filebeat配置是否正确加载,进入Filebeat Pod执行
filebeat test config验证配置语法,同时检查/etc/filebeat/filebeat.yml中是否存在你配置的过滤规则 - 查看Filebeat运行日志,执行
kubectl logs <filebeat-pod-name> -n <filebeat所在命名空间>,确认自动发现规则加载无报错 - 检查是否存在其他Filebeat实例运行在集群中,不同配置的Filebeat将其他命名空间的日志写入了相同索引
- 确认你查询的索引是否为配置修改后新生成的索引,旧索引中可能存在配置修改前采集的历史数据,会导致查询结果显示存在非目标命名空间的日志
- 取一条非目标命名空间的日志详情,确认命名空间字段的完整路径是否为
kubernetes.namespace,避免字段名写错导致条件不匹配
解决方案
推荐的配置修正如下,从三个层面做过滤,保证规则生效:
- 在Kubernetes自动发现Provider层面直接限定只监控的命名空间,从源头过滤非目标命名空间的资源
- 禁用hints默认采集配置,未匹配模板的容器不会被自动采集
- 新增Processor层面的丢弃规则,做双层保险
修正后的完整配置:
filebeatConfig: filebeat.yml: |- filebeat.autodiscover: providers: - type: kubernetes node: ${NODE_NAME} hints.enabled: true # Provider层面限定只采集目标命名空间资源 namespaces: include: - "ingress" - "kube-system" # 禁用默认采集配置,未匹配模板的容器不采集 hints.default_config.enabled: false templates: - condition.or: - equals: kubernetes.namespace: "ingress" - equals: kubernetes.namespace: "kube-system" config: - type: container paths: - /var/lib/docker/containers/*/${data.kubernetes.container.id}-json.log exclude_lines: ["^\\s+[\\-`('.|_]"] processors: - add_cloud_metadata: ~ - add_host_metadata: ~ # Processor层面兜底过滤,非目标命名空间的事件直接丢弃 - drop_event: when.not: or: - equals: kubernetes.namespace: "ingress" - equals: kubernetes.namespace: "kube-system" # 合并重复的cloud配置 cloud: id: '${ELASTIC_CLOUD_ID}' auth: '${ELASTIC_CLOUD_AUTH}' output: elasticsearch: enabled: true hosts: "elasticsearch-es-http.monitoring.svc.cluster.local:9200" username: '${ELASTICSEARCH_USERNAME}' password: '${ELASTICSEARCH_PASSWORD}' protocol: https ssl: verification_mode: "none" setup.ilm.enabled: auto setup.ilm.rollover_alias: "filebeat-testing-v8-%{[agent.version]}" setup.ilm.pattern: "{now/d}-000001"
配置修改完成后重启Filebeat Pod,查询新生成的索引验证过滤效果即可。
内容的提问来源于stack exchange,提问作者Theo Sweeny
相关产品推荐
相关产品推荐

