使用Fluent-bit将容器标准输入和输出的日志发送到Kafka

 什么是fluent-bit?

         Fluent Bit 是一款开源的轻量级日志处理器与转发器,专为嵌入式系统、容器化环境及分布式架构设计。其核心功能包括日志收集、过滤、聚合和传输,支持多种输入源(如文件、系统日志、HTTP接口)和输出目标(如Elasticsearch、Kafka、云存储服务)

 工作流程

日志通过数据管道从数据源发送到目的地,一个数据管道可以由input,paser,filter,buffer,routing,output等组成。

  • input插件:用于从数据源抽取数据,一个数据管道中可以包含多个input

  • parser组件:负责将input抽取的非结构化数据转化为标准的结构化数据,每个input均可以定义自己的parser

  • filter插件:负责对格式化数据进行过滤和修改。一个数据管道中可以包含多个filter,多个filter执行顺序与配置文件中的顺序一致

  • buffer组件:用户缓存经过filter处理的数据,默认情况下buffer把input插件的数据缓存到内存中,直到路由传递到output为止

  • routing组件:将buffer中缓存的数据路由到不同的output

  • output插件:负责将数据发送到不同的目的地,一个数据管道中可以包含多个output

部署kafka集群

安装JDK

[root@k8s-master ~]# java -version
java version "21.0.6" 2025-01-21 LTS
Java(TM) SE Runtime Environment (build 21.0.6+8-LTS-188)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.6+8-LTS-188, mixed mode, sharing)

部署kafka

[root@k8s-master kafaka-zookeeper]# tar -xvf kafka_2.12-3.8.0.tgz 

[root@k8s-master kafaka-zookeeper]#  mkdir -p /home/kafaka-zookeeper/kafka_2.12-3.8.0/{data,logs}
[root@k8s-master kafaka-zookeeper]#  cd /home/kafaka-zookeeper/kafka_2.12-3.8.0/config/
[root@k8s-master config]#  cp server.properties server.properties.bak
[root@k8s-master config]# sed -i "/#/d" server.properties
[root@k8s-master config]# ll
total 80
-rw-r--r-- 1 root root  906 Jul 23  2024 connect-console-sink.properties
-rw-r--r-- 1 root root  909 Jul 23  2024 connect-console-source.properties
-rw-r--r-- 1 root root 5475 Jul 23  2024 connect-distributed.properties
-rw-r--r-- 1 root root  883 Jul 23  2024 connect-file-sink.properties
-rw-r--r-- 1 root root  881 Jul 23  2024 connect-file-source.properties
-rw-r--r-- 1 root root 2063 Jul 23  2024 connect-log4j.properties
-rw-r--r-- 1 root root 2540 Jul 23  2024 connect-mirror-maker.properties
-rw-r--r-- 1 root root 2262 Jul 23  2024 connect-standalone.properties
-rw-r--r-- 1 root root 1221 Jul 23  2024 consumer.properties
drwxr-xr-x 2 root root 4096 Jul 23  2024 kraft
-rw-r--r-- 1 root root 4917 Jul 23  2024 log4j.properties
-rw-r--r-- 1 root root 2065 Jul 23  2024 producer.properties
-rw-r--r-- 1 root root  544 Mar 14 14:27 server.properties
-rw-r--r-- 1 root root 6896 Mar 14 14:27 server.properties.bak
-rw-r--r-- 1 root root 1094 Jul 23  2024 tools-log4j.properties
-rw-r--r-- 1 root root 1169 Jul 23  2024 trogdor.conf
-rw-r--r-- 1 root root 1205 Jul 23  2024 zookeeper.properties
[root@k8s-master config]# vim server.properties
[root@k8s-master config]# cd ..
[root@k8s-master kafka_2.12-3.8.0]# cd bin/
[root@k8s-master bin]#  nohup bin/kafka-server-start.sh config/server.properties > kafka.log 2>&1 &
[1] 16270

部署zookeeper

[root@k8s-node2 ~]# mkdir -p /home/kafaka-zookeeper
[root@k8s-node2 ~]# cd /home/kafaka-zookeeper/
[root@k8s-node2 kafaka-zookeeper]# mv apache-zookeeper-3.8.4-bin apache-zookeeper-3.8.4
[root@k8s-node2 kafaka-zookeeper]# mkdir -p /home/kafaka-zookeeper/apache-zookeeper-3.8.4/{data,logs}
[root@k8s-node2 kafaka-zookeeper]# cd /home/kafaka-zookeeper/apache-zookeeper-3.8.4/conf/
[root@k8s-node2 conf]#  mv zoo_sample.cfg zoo.cfg
[root@k8s-node2 data]# /home/kafaka-zookeeper/apache-zookeeper-3.8.4/bin/zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/kafaka-zookeeper/apache-zookeeper-3.8.4/bin/../conf/zoo.cfg
Starting zookeeper ... already running as process 11484.

配置时间同步:

sudo ntpdate ntp.aliyun.com

使用k8s部署fluent-bit

fluent-bit-config.yaml 

[root@k8s-master ~]# cat fluent-bit-config.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-config
  namespace: kube-system
data:
  fluent-bit.conf: |
    [SERVICE]
        Flush        5
        Log_Level    info
        Daemon       off
        Parsers_File parsers.conf

    [INPUT]
        Name              tail
        Path              /var/log/containers/*.log
        Parser            docker
        Tag               k8s.*
        Refresh_Interval  5
        Mem_Buf_Limit     5MB
        Skip_Long_Lines   On

    [FILTER]
        Name                kubernetes
        Match               k8s.*
        Kube_URL            https://kubernetes.default.svc:443
        Kube_CA_File        /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        Kube_Token_File     /var/run/secrets/kubernetes.io/serviceaccount/token
        Kube_Tag_Prefix     k8s.
        Merge_Log           On
        Keep_Log            Off

    [OUTPUT]
        Name            kafka
        Match           *
        Brokers         192.168.9.128:9092,192.168.9.129:9092,192.168.9.130:9092
        Topics          k8s-logs
        rdkafka.compression.codec snappy

  parsers.conf: |
    [PARSER]
        Name        docker
        Format      json
        Time_Key    time
        Time_Format %Y-%m-%dT%H:%M:%S.%LZ
        Decode_Field_As   escaped_utf8    log

fluent-bit-daemonset.yaml 

[root@k8s-master ~]# cat fluent-bit-daemonset.yaml 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluent-bit
  namespace: kube-system
  labels:
    app: fluent-bit
spec:
  selector:
    matchLabels:
      app: fluent-bit
  template:
    metadata:
      labels:
        app: fluent-bit
    spec:
      serviceAccountName: fluent-bit
      tolerations:  # 允许在所有节点(包括 Master)部署
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      containers:
      - name: fluent-bit
        image: fluent/fluent-bit:1.9.10
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: dockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: fluent-bit-config
          mountPath: /fluent-bit/etc/
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: dockercontainers
        hostPath:
          path: /var/lib/docker/containers  # 如果使用 Containerd,路径为 /var/log/pods
      - name: fluent-bit-config
        configMap:
          name: fluent-bit-config
---
# 创建 RBAC 权限
apiVersion: v1
kind: ServiceAccount
metadata:
  name: fluent-bit
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: fluent-bit-read
rules:
- apiGroups: [""]
  resources: ["pods", "namespaces"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: fluent-bit-read
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: fluent-bit-read
subjects:
- kind: ServiceAccount
  name: fluent-bit
  namespace: kube-system
[root@k8s-master ~]# kubectl get pod -n kube-system | grep flu
fluent-bit-4rvfx                           1/1     Running   0          31d
fluent-bit-lqhcm                           1/1     Running   0          31d
fluent-bit-r6xrh                           1/1     Running   0          31d

查看pod日志检查是否连接成功:

[root@k8s-master bin]# kubectl logs fluent-bit-lqhcm -n kube-system
Fluent Bit v1.9.10
* Copyright (C) 2015-2022 The Fluent Bit Authors
* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
* https://fluentbit.io

[2025/02/11 08:58:15] [ info] [fluent bit] version=1.9.10, commit=760956f50c, pid=1
[2025/02/11 08:58:15] [ info] [storage] version=1.3.0, type=memory-only, sync=normal, checksum=disabled, max_chunks_up=128
[2025/02/11 08:58:15] [ info] [cmetrics] version=0.3.7
[2025/02/11 08:58:15] [ info] [filter:kubernetes:kubernetes.0] https=1 host=kubernetes.default.svc port=443
[2025/02/11 08:58:15] [ info] [filter:kubernetes:kubernetes.0]  token updated
[2025/02/11 08:58:15] [ info] [filter:kubernetes:kubernetes.0] local POD info OK
[2025/02/11 08:58:15] [ info] [filter:kubernetes:kubernetes.0] testing connectivity with API server...
[2025/02/11 08:58:15] [ info] [filter:kubernetes:kubernetes.0] connectivity OK
[2025/02/11 08:58:15] [ info] [output:kafka:kafka.0] brokers='192.168.9.128:9092,192.168.9.129:9092,192.168.9.130:9092' topics='k8s-logs'
[2025/02/11 08:58:15] [ info] [sp] stream processor started

测试:

在生产者主机上发布消息:

[root@k8s-master bin]#  echo "test message" | /home/kafaka-zookeeper/kafka_2.12-3.8.0/bin/kafka-console-producer.sh   --broker-list 192.168.9.128:9092,192.168.9.129:9092,192.168.9.130:9092   --topic k8s-logs

在消费者主机进行查看:

/home/kafaka-zookeeper/kafka_2.12-3.8.0/bin/kafka-console-consumer.sh \
--bootstrap-server 192.168.9.128:9092,192.168.9.129:9092,192.168.9.130:9092 \
--topic k8s-logs \
--from-beginning

可以看到容器的日志被输出到kafka当中:

 

<think>我们正在讨论在嵌入式系统中使用Fluent Bit进行日志收集处理。根据引用,Fluent Bit特别适合嵌入式、边缘其他资源受限的环境,因为它具有精益的运行时广泛的输入/输出选项(引用[1])。同时,Fluent Bit是一个轻量级的日志处理器与转发器,专为嵌入式系统、容器化环境及分布式架构设计(引用[2])。在嵌入式系统中,资源(如内存CPU)通常有限,而FluentBit的内存占用只有约1MB(引用[4]),这使其成为理想选择。部署与使用步骤: 1. **获取Fluent Bit**:根据嵌入式系统的架构(如ARM),从FluentBit官网下载预编译的二进制文件,或者从源代码编译。由于嵌入式系统可能使用不同的架构,编译时需指定目标平台。```bash$ gitclone https://github.com/fluent/fluent-bit$ cdfluent-bit$mkdir build&& cdbuild$cmake-DCMAKE_TOOLCHAIN_FILE=../cmake/toolchain.cmake-DFLB_HTTP_SERVER=On-DFLB_STREAM_PROCESSOR=On ..$make```注意:根据嵌入式系统的具体需求,可以启用或禁用某些插件(如HTTP服务器、流处理器等)以减少资源占用。2.**配置FluentBit**:创建一个配置文件(如`fluent-bit.conf`),指定输入、过滤输出。例如,从系统日志收集并输出到文件:```conf[INPUT]Name systemdTagsystemd.logs[OUTPUT]NamefileMatch*Path/var/log/embedded/Format templateTemplate {time}{log}```在嵌入式系统中,可能还需要从其他来源(如串口、自定义传感器)收集日志,这时可以编写自定义输入插件(引用[3])。 3. **启动Fluent Bit**:在嵌入式系统上运行FluentBit,指定配置文件:```bash$ ./fluent-bit-cfluent-bit.conf```4.**优化与扩展**:- **性能优化**:在资源受限的嵌入式系统中,可以调整缓冲区大小、降低采样率或减少插件数量。-**自定义插件**:如果需要处理特定格式的日志,可以编写C语言插件(引用[3])。- **安全性**:若日志需要通过网络传输,启用TLS加密。5.**监控与维护**:使用Fluent Bit内置的HTTP服务器监控运行状态(需在编译时启用):```conf[SERVICE]HTTP_Server OnHTTP_Listen0.0.0.0HTTP_PORT2020```然后通过浏览器访问`http://<嵌入式设备IP>:2020`查看状态。注意事项: -**资源消耗**:虽然Fluent Bit轻量,但仍需监控其CPU内存使用情况,避免影响嵌入式系统的主功能。- **可靠性**:在网络不稳定的环境中,使用内置的队列机制防止数据丢失。- **与Fluentd协作**:如果嵌入式设备需要将日志转发到中央服务器,可以将FluentBit配置为转发到Fluentd(引用[1])。通过以上步骤,可以在嵌入式系统中高效部署Fluent Bit进行日志收集处理。</think>### Fluent Bit 在嵌入式系统中的日志收集部署与使用指南 Fluent Bit 是专为资源受限环境设计的轻量级日志处理器,在嵌入式系统中部署需重点关注以下方面: #### 一、嵌入式环境适配要点 1. **资源优化配置** - 内存占用:默认约1MB(引用[4]),通过禁用非必要插件进一步缩减 ```conf [SERVICE] # 禁用HTTP监控服务 HTTP_Server Off # 使用单工作线程 Workers 1 ``` - CPU优化:调整刷新频率降低负载 ```conf [INPUT] Name mem Interval_Sec 30 # 采样间隔从1秒改为30秒 ``` 2. **输入源配置** - 系统日志采集(通过journald): ```conf [INPUT] Name systemd Tag embedded.syslog ``` - 串口日志采集(自定义插件开发参考引用[3]): ```conf [INPUT] Name serial Device /dev/ttyS0 BaudRate 115200 ``` #### 二、部署流程 1. **交叉编译**(以ARMv7为例): ```bash $ cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchain-arm.cmake \ -DFLB_OUT_KAFKA=Off \ # 禁用非必需插件 -DFLB_HTTP_SERVER=Off .. $ make -j4 ``` 2. **最小化文件部署**: ``` /opt/fluent-bit/ ├── bin/fluent-bit ├── conf/fluent-bit.conf └── plugins/ └── in_serial.so # 自定义串口插件 ``` #### 三、日志处理流水线示例 ```conf [SERVICE] Flush 5 Daemon Off [INPUT] Name syslog Path /dev/log Parser docker [FILTER] Name grep Match * Regex log ERROR|WARN # 仅转发错误/警告日志 [OUTPUT] Name file Match * Path /mnt/sd/logs/ Format template Template {time} {message} ``` #### 四、资源监控与调优 1. **实时状态检查**: ```bash $ fluent-bit -i cpu -o stdout -m '*' -R null # 空运行测试资源消耗 ``` 2. **内存保护机制**: ```conf [SERVICE] # 内存上限保护 Mem_Buf_Limit 5M # 文件缓冲回退 storage.path /var/log/flb-storage/ ``` #### 五、企业级实践建议(引用[3]) 1. **可靠性保障**: - 启用断点续传:`storage.sync normal` - 网络异常重试:`Retry_Limit 10` 2. **安全加固**: ```conf [OUTPUT] Name forward Host 192.168.1.100 Port 24224 tls On tls.verify Off # 嵌入式设备省去证书验证 ``` > **性能对比参考**:在Raspberry Pi 4(ARMv8)测试中,Fluent Bit处理10,000条日志仅消耗15MB内存,而Fluentd需60MB+(引用[4]) #### 六、调试技巧 1. 启动诊断模式: ```bash $ fluent-bit -c config.conf -vv -o stdout ``` 2. 实时指标监控: ```bash $ curl http://localhost:2020/api/v1/metrics # 需启用HTTP服务 ``` **部署验证**:通过`dmesg | grep Fluent`检查内核日志,确认无资源告警后,向系统注入测试日志`logger "Fluent Bit TEST"`,观察目标输出端是否正常接收。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元气满满的热码式

感谢您的支持!我会继续努力发布

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值