Fluent Bit 轻量级日志采集器:从安装到生产部署

Fluent Bit 轻量级日志采集器:从安装到生产部署

在云原生时代,日志采集是可观测性体系的基础一环。对于 Kubernetes 集群、边缘设备和嵌入式系统而言,日志采集器的资源开销至关重要。Fluent Bit 正是为解决这一问题而生的轻量级日志采集器。本文将从概念、架构到生产部署,带你全面掌握 Fluent Bit。

1. Fluent Bit 介绍

Fluent Bit 是 Fluentd 生态的轻量级日志采集器,由 Treasure Data(现属 Splunk)开源维护。它采用 C 语言编写,核心实现零外部依赖,运行时内存占用通常控制在 1MB 以内(基本模式),远低于 Fluentd 的数十 MB 级别。

Fluent Bit 与 Fluentd 共享相同的插件抽象概念和部分配置风格,但设计哲学截然不同:Fluent Bit 追求极致的轻量和性能,适用于资源受限的环境;Fluentd 则更强调功能和插件生态的丰富性。

2. 架构特点

2.1 插件式架构

Fluent Bit 采用模块化插件架构,核心引擎通过以下组件协同工作:

  • Input(输入):从各种来源采集数据
  • Parser(解析器):对原始数据进行格式化解析
  • Filter(过滤器):对采集的数据进行修改、增强或过滤
  • Output(输出):将处理后的数据发送到目标系统
  • Buffer(缓冲区):内存/文件两级缓冲保障数据安全

2.2 低内存占用

Fluent Bit 的内存管理经过深度优化:

  • 基础运行内存 < 1MB(无输出插件时约 450KB)
  • 即使加载多个输入/输出插件,内存通常 < 10MB
  • 支持内存限制功能(mem_buf_limit),防止日志暴增打崩节点
  • 零拷贝数据传递机制减少不必要的内存分配

3. 安装方式

3.1 二进制安装(Linux)

# Ubuntu / Debian
curl -s https://packages.fluentbit.io/fluentbit.key | gpg --dearmor > /usr/share/keyrings/fluentbit-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/fluentbit-keyring.gpg] https://packages.fluentbit.io/ubuntu/jammy jammy main" > /etc/apt/sources.list.d/fluentbit.list
apt-get update && apt-get install -y fluent-bit

# CentOS / RHEL
wget -q https://packages.fluentbit.io/fluentbit.key -O /etc/pki/rpm-gpg/RPM-GPG-KEY-fluentbit
cat > /etc/yum.repos.d/fluentbit.repo << EOF
[fluentbit]
name=Fluent Bit
baseurl=https://packages.fluentbit.io/centos/\$releasever/\$basearch/
gpgcheck=1
gpgkey=https://packages.fluentbit.io/fluentbit.key
enabled=1
EOF
yum install -y fluent-bit

3.2 Docker 运行

# 快速启动(输出到 stdout)
docker run -ti fluent/fluent-bit:latest /fluent-bit/bin/fluent-bit -i cpu -o stdout -f 1

# 自定义配置挂载
docker run -d \
  --name fluent-bit \
  -v $(pwd)/fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf \
  -v /var/log:/var/log:ro \
  fluent/fluent-bit:latest

3.3 Kubernetes DaemonSet 部署

这是 Kubernetes 环境中最推荐的部署方式:在每个节点上以一个 Pod 的形式运行,采集节点所有容器的日志。

# 使用官方 Helm Chart 部署
helm repo add fluent https://fluent.github.io/helm-charts
helm repo update
helm upgrade --install fluent-bit fluent/fluent-bit \
  --namespace logging --create-namespace \
  --set backend.es.host=elasticsearch-master \
  --set backend.es.port=9200

DaemonSet YAML 核心配置要点:

  • 挂载 /var/log/var/lib/docker/containers 用于读取容器日志
  • 使用 hostNetwork 或在 Pod 中访问日志目标地址
  • 设置 resources.requests 通常为 100m CPU / 64Mi 内存
  • 配置 mem_buf_limit 防止内存溢出

4. 配置详解

Fluent Bit 的配置使用 INI 风格的配置文件fluent-bit.conf),通过段([SERVICE][INPUT][FILTER][OUTPUT])组织。这是典型的配置结构:

[SERVICE]
    flush           1
    log_level       info
    daemon          off
    parsers_file    parsers.conf

[INPUT]
    name            tail
    path            /var/log/syslog
    tag             syslog.*

[FILTER]
    name            grep
    match           syslog.*
    regex           log ^(?!.*DEBUG).*$

[OUTPUT]
    name            es
    match           *
    host            elasticsearch.logging.svc.cluster.local
    port            9200
    index           fluentbit-%Y.%m.%d

4.1 SERVICE 段

  • flush:数据刷出间隔(秒),默认 1
  • log_level:日志级别(error / warn / info / debug / trace)
  • parsers_file:解析器配置文件路径
  • daemon:是否以守护进程模式运行
  • storage.path:持久化存储路径,配合文件缓冲使用

4.2 INPUT 段

每个 [INPUT] 段定义一个数据源。可以通过多个 [INPUT] 块采集不同类型的日志。

4.3 FILTER 段

[FILTER] 段对匹配特定 tag 的数据进行过滤、修改或增强。多个 Filter 按顺序执行。

4.4 OUTPUT 段

[OUTPUT] 段定义数据最终发送的目的地。可以配置多个同类型或不同类型的 Output 实现数据扇出。

5. 常用输入(INPUT)

5.1 tail — 文件尾随采集

最常用的输入插件,类似 tail -F,持续追踪日志文件变化:

[INPUT]
    name            tail
    path            /var/log/containers/*.log
    multiline.parser  docker, cri
    tag             container.*
    mem_buf_limit   50MB
    skip_long_lines On
    refresh_interval 10

5.2 cpu / mem — 系统指标采集

[INPUT]
    name            cpu
    tag             metric.cpu
    interval_sec    10

[INPUT]
    name            mem
    tag             metric.mem
    interval_sec    10

5.3 kafka — 从 Kafka 消费日志

[INPUT]
    name            kafka
    brokers         192.168.1.100:9092,192.168.1.101:9092
    topics          app-logs,nginx-logs
    group_id        fluent-bit-consumer
    poll_ms         500

5.4 syslog — Syslog 日志接收

[INPUT]
    name            syslog
    path            /dev/log
    mode            unix_gram
    parser          syslog-rfc3164

6. 常用输出(OUTPUT)

6.1 Elasticsearch

[OUTPUT]
    name            es
    match           *
    host            192.168.1.50
    port            9200
    index           myapp-${NODE_NAME:-unknown}-%Y.%m.%d
    type            _doc
    tls             On
    tls.verify      On
    http_user       elastic
    http_passwd     ${ES_PASSWORD}
    logstash_format Off
    replace_dots    On
    retry_limit     False

6.2 Kafka

[OUTPUT]
    name            kafka
    match           container.*
    brokers         192.168.1.100:9092
    topics          processed-logs
    timestamp_key   @timestamp
    message_key     message
    rdkafka.request.required.acks 1

6.3 S3(对象存储)

[OUTPUT]
    name            s3
    match           archive.*
    bucket          my-archive-bucket
    region          ap-northeast-1
    total_file_size 50M
    upload_timeout  10m
    compression     gzip
    store_dir       /tmp/fluent-bit/s3
    static_file_path On
    s3_key_format   /logs/%Y/%m/%d/%H/%M_$UUID.gz

6.4 Prometheus Exporter

[OUTPUT]
    name            prometheus_exporter
    match           metric.*
    host            0.0.0.0
    port            2021

# 配合 Prometheus 抓取
# scrape_configs:
#   - job_name: fluent-bit
#     static_configs:
#       - targets: ['fluent-bit.logging:2021']

7. Fluentd vs Fluent Bit 选型建议

对比维度 Fluentd Fluent Bit
语言 Ruby + C 插件 C
内存占用 ~30-60 MB ~650 KB - 5 MB
CPU 开销 相对较高 极低
插件数量 1000+(社区丰富) ~120(精选核心)
吞吐量 ~50K msg/s ~150K msg/s(单核)
配置复杂度 较复杂,配置量大 简洁,段式组织
适用场景 复杂路由、数据管道、大型集群 边缘设备、K8s Sidecar、嵌入式
数据缓冲 内存 + 文件缓冲 内存 + 文件 + 磁盘回写

选型建议

  • 优先选择 Fluent Bit:Kubernetes 节点日志采集、边缘计算、IoT 设备、嵌入式系统、需要极致性能的场景
  • 优先选择 Fluentd:需要丰富的输入/输出/Filter 插件(如 GraphQL、MongoDB)、复杂的数据路由和转换管道、已有 Fluentd 生态投资
  • 混用策略:Fluent Bit 做节点层采集(DaemonSet)→ 输出到 Kafka/Fluentd → Fluentd 做聚合路由和格式转换 → 输出到 Elasticsearch/S3 等存储后端

8. 生产部署最佳实践

8.1 内存控制

必须设置 mem_buf_limit 防止日志暴涨耗尽节点内存:

[INPUT]
    name            tail
    path            /var/log/containers/*.log
    mem_buf_limit   50MB
    # 达到限制后的行为:丢弃旧数据或停止采集
    storage.type    filesystem  # 启用文件缓冲溢出

8.2 缓冲与可靠性

  • 启用 文件系统缓冲(storage.type filesystem),在网络故障时数据不丢失
  • 设置 storage.path 指向持久化卷(K8s 中使用 PVC 或 hostPath)
  • 配置 retry_limitretry_backoff 控制重试策略
  • 对于关键日志,使用 S3 作为最终备份输出

8.3 多路输出(Route)

通过 Tag 匹配实现不同的日志走不同的路径:

[INPUT]
    name            tail
    path            /var/log/nginx/access.log
    tag             nginx.access

[INPUT]
    name            tail
    path            /var/log/nginx/error.log
    tag             nginx.error

[OUTPUT]
    name            es
    match           nginx.*
    host            elasticsearch.logging
    index           nginx-%Y.%m.%d

[OUTPUT]
    name            stdout
    match           nginx.error
    # error 日志额外打到 stdout 方便调试

8.4 Kubernetes 集成

  • 使用 kubernetes Filter 自动注入 Pod 元数据:namespace、pod_name、container_name、labels 等
  • 启用 multiline parser 处理堆栈跟踪等跨行日志
  • 设置 buffer 大小 匹配节点日志量级,避免 OOMKill
  • 使用 ConfigMap 管理配置,支持热更新
  • 监控 Fluent Bit 本身:启用 Prometheus Exporter,配置 健康检查端点

8.5 监控 Fluent Bit 自身

[OUTPUT]
    name            prometheus_exporter
    match           metric.*
    host            0.0.0.0
    port            2021

# 在 Grafana 中监控的关键指标:
# fluentbit_input_bytes_total
# fluentbit_filter_dropped_records_total
# fluentbit_output_proc_records_total
# fluentbit_output_errors_total
# fluentbit_storage_volume_total_bytes

8.6 安全最佳实践

  • 所有远程输出启用 TLS/SSL 加密
  • 敏感信息(密码、Token)通过环境变量传入,不硬编码在配置文件中
  • 使用 HTTP 认证 或 mTLS 与服务端建立信任
  • 限制日志内容:使用 grep 或 record_modifier Filter 脱敏敏感字段
  • 最小权限原则:Fluent Bit 进程只赋予其所需的文件读取权限

总结

Fluent Bit 以不到 5MB 的内存占用实现了生产级的日志采集能力,是云原生日志管道中不可或缺的一环。通过合理的配置和最佳实践,它能够在最严苛的资源约束下稳定运行,为 Elasticsearch、Kafka、S3 等后端持续输送结构化日志数据。

在 ELK/EFK 栈中,Fluent Bit 越来越多地取代 Filebeat 和 Fluentd 成为首选的节点层采集器。结合 Kubernetes 生态和 Prometheus 监控,你可以构建一套高性能、高可靠的日志基础设施。


系列文章:

  • ELK 第 1 篇:Elasticsearch 基础入门
  • ELK 第 2 篇:Logstash 数据管道
  • ELK 第 3 篇:Kibana 数据可视化
  • ELK 第 4 篇:Elasticsearch 集群管理与优化
  • ELK 第 5 篇:Elasticsearch 索引生命周期管理
  • ELK 第 6 篇:Logstash 高级配置与插件开发
  • ELK 第 7 篇:Kibana 告警与机器学习
  • ELK 第 8 篇:Elasticsearch 安全与权限控制
  • ELK 第 9 篇:Fluent Bit 轻量级日志采集器:从安装到生产部署

发表回复

后才能评论