如何配置 Fluent Bit 来收集 K8s 集群的日志

介绍如何在 Kubernetes 集群中使用 Fluent Bit 收集 Pod 日志,理解 INPUT、PARSER、FILTER、OUTPUT 插件、DaemonSet 部署、CRD 动态配置和 Fluent Bit 与 Fluentd 的差异。

作者 译文

fluentbit

Fluent Bit 被广泛认为是 Fluentd 的小弟,但它同样强大、灵活,在构建时不但考虑了物理机、虚拟机环境,也考虑到了云原生环境。

在本教程中,我们将在 K8s 集群中部署 Fluent Bit 以从 pod 收集日志。首先,我们将使用Loki来存储日志;然后,我们将部署标准 Fluent Bit 并将其配置为将日志流发送到 Dynatrace。这是一个完美的练习,可以了解构建日志流管道的各种可能性。

核心要点

  • Fluent Bit 可以作为 Kubernetes 日志收集器,把 Pod、容器和节点上的日志采集、解析、丰富并转发到后端。
  • 在 K8s 中部署 Fluent Bit 通常会创建 DaemonSet 和 ConfigMap,每个节点运行一个 agent 处理本机日志。
  • Fluent Bit pipeline 由 INPUT、PARSER、FILTER、OUTPUT 组成,分别负责采集、解析、处理和发送。
  • 与 Fluentd 相比,Fluent Bit 更轻量,更适合云原生和大规模节点场景;两者也可以组合使用。
  • 在生产环境中,日志管道不只是“能采到日志”,还要关注上下文、路由、安全输出和配置变更方式。

Fluent Bit 是什么?

Fluent Bit 是日志收集器/转发器大家族中的日志处理工具。它是 Fluentd 的兄弟姐妹,也是性能最高、最轻量级的日志处理器。

日志在可观察性方面很有价值,因为它们扩展了您分析数据、排除故障等的能力。在前面的几集中,我们主要讨论了应用程序日志。但许多其他类型的解决方案也会生成日志:

  • 数据库日志
  • 系统日志
  • Web Server 日志
  • 访问日志
  • 等等

收集和关联所有这些日志对于在正确的背景下准确了解我们的环境中当前发生的情况至关重要。这就是 Fluent Bit 发挥作用的地方。

Fluent Bit 从各种来源收集日志,即传统服务器、Linux 环境、容器、Kubernetes 或 Pod。然后,它向数据添加上下文 Context(标签),并将日志流转换为键值对格式,以发送到日志存储解决方案(Elasticsearch、Kafka、Dynatrace 等)。

就像 Fluentd 一样,Fluent Bit 也使用了很多插件。要构建用于摄取和转换日志的管道,您将需要许多插件。

这是一个简要概述:

    1. INPUT 插件用来收集日志和指标(statsd、collectd、CPU metrics、Disk IO、docker metrics、docker events)
    1. PARSER 插件用于做数据转换和数据结构化(JSON、Regexp、LTSV、Logfmt 等)
    1. FILTER 插件用于修改、丰富、删除一些日志信息(Nest、Throttle、Expect、Geoplp、Grep、K8s 等)对于过滤,您还可以使用 LUA 脚本。
    1. OUTPUT 插件将日志流发送到多个输出,这些输出将负责存储日志流并将其可视化。 Fluent Bit 的奇妙之处在于,您可以为管道使用多个输出插件,并指定定义日志发送位置的规则。 (Loki、Azure Blob、Azure Log Analytics、Google Cloud Big Query、Elasticsearch 等)
插件阶段 作用 Kubernetes 日志场景中的关注点
INPUT 读取日志或指标 从容器日志路径、systemd 或其他来源采集
PARSER 把原始文本解析成结构化字段 JSON、Regexp、Logfmt、容器运行时日志格式
FILTER 增强、过滤或改写日志 添加 Kubernetes 元数据、删除无用字段、限流
OUTPUT 把日志发往后端 Loki、Elasticsearch、Kafka、Dynatrace 等

如何配置 Fluent Bit?

Fluent Bit 可以使用 Helm chart 快速部署。在幕后,将会创建一个 DaemonSet 和 Fluent Bit 的配置文件,配置文件将存储在 ConfigMap 中。您可以在此配置文件中定义 pipeline,用于说明您希望如何收集和发送数据的一系列步骤:

[Input]
[Parser]
[Filter]
[Output]

Helm 安装使用 DaemonSet,因此,日志流管道(Pipeline)上的任何更新都需要重新启动所有 Fluent Bit 代理。运维人员通过引入几个CRD 来解决这个问题:

  • Fluentbit
  • Fluentbitconfig
  • Input
  • Filter
  • Parser
  • Output

每个 CRD 都允许我们动态更新日志流管道。

为了简化日志流管道的创建,我们建议使用工具来帮助您配置 Fluent Bit。在本教程中,我们将使用 Calyptia ,它验证您的语法并为您提供管道的可视化。

Calyptia

如果团队经常调整日志采集规则,CRD 方式可以降低每次变更都重启 agent 的成本;如果配置较少且变更频率低,Helm + ConfigMap 也足够清晰。

为什么 Fluent Bit 在 K8s 中如此强大?

Fluent Bit 的一大功能是您可以直接在 Deployment 上添加 Annotation,从而允许您定义需要使用哪种类型的解析器来从特定 pod 收集日志。

apiVersion: v1
kind: Pod
metadata:
  name: apache-logs
  labels:
  app: apache-logs
  annotations:
    fluentbit.io/exclude: "true"
spec:
  containers:
  - name: apache
    image: eclipser/apache_logs

与 Promtail 等其他解决方案相比,插件架构使 Fluent Bit 更强大且更易于定制。它还支持许多安全概念,特别是对于输出插件。大家都希望将数据发送到存储时能确保安全。

在 Kubernetes 中,Annotation 的价值在于把日志采集策略贴近工作负载本身。应用团队可以通过约定告诉日志管道哪些 Pod 需要排除、哪些日志需要特殊解析,从而减少平台团队集中维护所有规则的压力。

Fluent Bit 和 Fluentd 有什么区别?

正如已经提到的,Fluent Bit 是 Fl​​uentd 的兄弟姐妹,从某种意义上说,它们实现了许多相同的事情,但范围大小不同。

Fluentd 是为服务器设计的,而 Fluent Bit 是云原生的,可以与 Kubernetes 配合使用。它可以处理许多节点、Pod、组件等,并且与服务器、容器和嵌入式系统兼容。

此外,Fluent Bit 的优势在于其重量较轻(与 Fluentd 的 40MB 相比为 650kb),并且已针对大规模和低成本运行进行了优化。

值得一提的是,Fluent Bit 和 Fluentd 并不是相互排斥的——它们也可以是互补的。结合使用这两个工具,您可以构建更复杂的管道来收集和提取日志。

简单理解:Fluent Bit 更适合跑在节点边缘做轻量采集和初步处理,Fluentd 更适合承担更复杂的聚合、转换和转发逻辑。具体选择要看日志量、处理复杂度和团队维护能力。

教程:如何配置 Fluent Bit 收集日志

完整教程可以在 YouTube 上找到视频格式,也可以在 GitHub 上找到书面分步说明。以下是链接:

生产落地检查清单

在把 Fluent Bit 用于 Kubernetes 日志采集前,建议确认以下问题:

  1. 日志后端是谁:Loki、Elasticsearch、Kafka、Dynatrace 或其他系统。
  2. 是否需要多输出:例如一份日志用于排障,一份日志进入长期归档。
  3. 是否需要 Kubernetes 元数据:namespace、pod、container、label 是否必须进入日志字段。
  4. 是否存在多行日志:Java 堆栈、Python Traceback 等是否需要多行解析。
  5. 是否有排除规则:哪些 namespace、pod 或容器不应该采集。
  6. 配置如何变更:使用 Helm ConfigMap,还是引入 CRD 动态更新。
  7. 如何观测 agent:是否有 Fluent Bit 自身日志、指标和健康检查。

FAQ

Q1:Fluent Bit 在 Kubernetes 中通常怎么部署?

A:原文介绍的方式是通过 Helm chart 部署,背后会创建 DaemonSet 和 ConfigMap。DaemonSet 让每个节点运行 Fluent Bit agent,ConfigMap 保存 pipeline 配置。

Q2:Fluent Bit 与 Fluentd 是替代关系吗?

A:不一定。Fluent Bit 更轻量,适合云原生节点侧采集;Fluentd 可以承担更复杂的处理逻辑。二者可以单独使用,也可以组合构建日志管道。

Q3:为什么需要 FILTER 插件?

A:FILTER 用来修改、丰富或删除日志字段。在 K8s 场景中,常见用途是添加 Kubernetes 元数据、过滤无用日志、改写字段或做限流。

原文连接:https://isitobservable.io/observability/kubernetes/how-to-configure-fluent-bit-to-collect-logs-for-your-k8s-cluster

联系我们交流

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云