Fluentd/FluentBit K8s日志采集方案介绍

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000 次 1年
日志服务 SLS,月写入数据量 50GB 1个月
简介: Fluent Bit 是一个开源的多平台日志采集器,旨在打造日志采集处理和分发的通用利器。2014 年,Fluentd 团队预测对于嵌入式 Linux 和 Gateways 等受约束的环境,需要更轻量级的日志处理器,于是便开发了Fluent Bit,并把该项目建设成为Fluentd 生态系统的一部分。

Fluentd/FluentBit简介

Fluentd 是一个开源的可观测数据采集器,致力于建设统一的日志采集层,简化用户的数据接入体验。

Fluent Bit 是一个开源的多平台日志采集器,旨在打造日志采集处理和分发的通用利器。2014 年,Fluentd 团队预测对于嵌入式 Linux 和 Gateways 等受约束的环境,需要更轻量级的日志处理器,于是便开发了Fluent Bit,并把该项目建设成为Fluentd 生态系统的一部分。

两者之间的比较:

Fluentd

Fluent Bit

适用场景

容器/服务器

嵌入式 Linux/容器/服务器

开发语言

C & Ruby

C

初始启动内存

~40MB

~650KB

性能

高性能

高性能

依赖

基于 Ruby Gem 构建,依赖gem。

零依赖,除非一些特殊要求的插件。

插件

1000+插件

70左右

协议

Apache License v2.0

Apache License v2.0

Kubernetes采集方案

FluentD、Fluent Bit官方都提供了Kubernetes的部署方案,主要推荐以Deamonset方式部署。

Fluentd

模版仓库:https://github.com/fluent/fluentd-kubernetes-daemonset 该仓库根据数据采集的输出目的,提供了专有的镜像跟部署模版库。

### 镜像

$ll fluentd-kubernetes-daemonset/docker-image/v1.14/

total 76

drwxr-xr-x 20 root root 4096 Jun 30 09:13 arm64

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-azureblob

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-cloudwatch

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-elasticsearch6

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-elasticsearch7

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-forward

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-gcs

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-graylog

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-kafka

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-kafka2

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-kinesis

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-logentries

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-loggly

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-logzio

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-opensearch

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-papertrail

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-s3

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-stackdriver

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-syslog


### 模版

[root@yemo_hongkong fluent]$ll fluentd-kubernetes-daemonset/

-rw-r--r--  1 root root  3571 Jun 30 09:13 fluentd-daemonset-azureblob.yaml

-rw-r--r--  1 root root  2559 Jun 30 09:13 fluentd-daemonset-cloudwatch-rbac.yaml

-rw-r--r--  1 root root  3239 Jun 30 09:13 fluentd-daemonset-elasticsearch-rbac.yaml

-rw-r--r--  1 root root  2845 Jun 30 09:13 fluentd-daemonset-elasticsearch.yaml

-rw-r--r--  1 root root  1872 Jun 30 09:13 fluentd-daemonset-forward.yaml

-rw-r--r--  1 root root  1792 Jun 30 09:13 fluentd-daemonset-gcs.yaml

-rw-r--r--  1 root root  2952 Jun 30 09:13 fluentd-daemonset-graylog-rbac.yaml

-rw-r--r--  1 root root  1960 Jun 30 09:13 fluentd-daemonset-logentries.yaml

-rw-r--r--  1 root root  2999 Jun 30 09:13 fluentd-daemonset-loggly-rbac.yaml

-rw-r--r--  1 root root  2390 Jun 30 09:13 fluentd-daemonset-loggly.yaml

-rw-r--r--  1 root root  3236 Jun 30 09:13 fluentd-daemonset-opensearch.yaml

-rw-r--r--  1 root root  2859 Jun 30 09:13 fluentd-daemonset-papertrail.yaml

-rw-r--r--  1 root root  2563 Jun 30 09:13 fluentd-daemonset-syslog.yaml

下面以Kafka Docker镜像详细说明下:

  • fluent.conf: 采集输出目录的配置,例如Kafka就是brokers地址、Topic等信息。
  • kubernetes.conf: k8s的采集配置。包含了tail input插件及kubernetes_metadata filter插件。
  • tail_container_parse.conf: 标准输出的解析方式,默认json parser,适用于Docker场景;如果是containerd或者CRI-O场景,需要设置为cri parser。
  • prometheus.conf: fluentd的prometheus监控插件。
  • systemd.conf: systemd-journal的采集插件配置。

# 创建configmap

kubectl create configmap fluentd-conf --from-file=kubernetes.conf --namespace=kube-system


# 更改Fluentd部署yaml,添加挂载部分的配置项。

     containers:

     - name: fluentd

       image: fluent/fluentd:v1.2-debian

       resources:

         limits:

           memory: 200Mi

         requests:

           cpu: 100m

           memory: 200Mi

       volumeMounts:

       - name: config-volume

         mountPath: /fluentd/etc/kubernetes.conf

         subPath: kubernetes.conf

       - name: varlog

         mountPath: /var/log

       - name: varlibdockercontainers

         mountPath: /var/lib/docker/containers

         readOnly: true

     terminationGracePeriodSeconds: 30

     volumes:

     - name: config-volume

       configMap:

         name: fluentd-conf

     - name: varlog

       hostPath:

         path: /var/log

     - name: varlibdockercontainers

       hostPath:

         path: /var/lib/docker/containers

Fluent Bit

模版仓库:https://github.com/fluent/fluent-bit-kubernetes-logging

Fluent Bit是一个轻量级且可扩展的日志处理器,在Kubernetes场景下支持:

  • 从文件系统或 Systemd/Journaled采集日志。
  • 可以通过关联Kubernetes元数据富化日志。
  • 支持采集到第三方存储服务。例如 Elasticsearch、Kafka等。


Fluent Bit以Daemonset 运行时,会通过API Server获取Pod及容器的信息(例如,Pod信息、Container信息、Labels等)。

部署方式(以Kafka为例):

  • 配置ConfigMap
  • ConfigMap fluent-bit-config中包含了采集配置文件fluent-bit.conf、input-kubernetes.conf、output-kafka.conf等。

$ kubectl create -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/output/kafka/fluent-bit-configmap.yaml

  • 以Daemonset方式部署Fluent Bit,并挂在上述的ConfigMap到/fluent-bit/etc/目录。

$ kubectl create -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/output/kafka/fluent-bit-ds.yaml

同样的,Fluent Bit提供的模版默认假定日志由 Docker 接口标准格式化。如果对于CRI的场景,需要手动调整解析器。

# CRI Parser

[PARSER]

   # http://rubular.com/r/tjUt3Awgg4

   Name cri

   Format regex

   Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<message>.*)$

   Time_Key    time

   Time_Format %Y-%m-%dT%H:%M:%S.%L%z

   

[INPUT]

   Name tail

   Path /var/log/containers/*.log

   Parser cri

   Tag kube.*

   Mem_Buf_Limit 5MB

   Skip_Long_Lines On

鉴权问题

Fluentd/FluentBIt 将从用户应用程序和集群组件(如 kube-apiserver 和 kube-scheduler)收集日志,需要赋予一些K8s的权限。两者的实现方式类似,这里以FluentBIt为例进行说明。

  • 首先创建ServiceAccount

apiVersion: v1

kind: ServiceAccount

metadata:

 name: fluent-bit

 namespace: logging

  • 为了保证FluentBit在K8s集群中有read、list、watch的全新,需要授予一些权限,通过创建ClusterRole实现。

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRole

metadata:

 name: fluent-bit-read

rules:

- apiGroups: [""]

 resources:

 - namespaces

 - pods

 verbs: ["get", "list", "watch"]

  • 绑定ServiceAccount与ClusterRole

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: logging

  • Fluent Bit Daemonset yaml中通过serviceAccountName关联

serviceAccountName: fluent-bit

总结

对于Fluentd/Fluent Bit官方都建议采用Daemonset部署,都是通过ConfigMap来管理采集配置,Fluentd/Fluent Bit容器挂载ConfigMap来进行配置读取。不同的是,Fluentd提供的模版集成度更高,对于每种输出场景,都有定制的镜像,一般情况用户只需要注入一些环境变量即可完成采集。

此外,两者也都提供了Docker、CRI的标准输出采集支持,但是都需要手动修改模版才可以。

Fluentd/Fluent Bit官方虽然提供了一些K8s的采集部署方案,但是总体来说自动化程度不高,操作也比较繁琐。所以也就催生出了各类Operator,比较有名的是Fluent Operator、Logging Operator,后续文章会展开进一步介绍。

参考文档

Kubernetes Fluentd官方文档

Kubernetes FluentBit官方文档

Cluster-level Logging in Kubernetes with Fluentd

关于iLogtail

iLogtail作为阿里云SLS提供的可观测数据采集器,可以运行在服务器、容器、K8s、嵌入式等多种环境,支持采集数百种可观测数据(日志、监控、Trace、事件等),已经有千万级的安装量。目前,iLogtail已正式开源,欢迎使用及参与共建。

GitHub:https://github.com/alibaba/ilogtail

社区版文档:https://ilogtail.gitbook.io/ilogtail-docs/about/readme

企业版官网:https://help.aliyun.com/document_detail/65018.html

钉钉群:iLogtail社区

目录
相关文章
|
存储 运维 开发工具
警惕日志采集失败的 6 大经典雷区:从本地管理反模式到 LoongCollector 标准实践
本文探讨了日志管理中的常见反模式及其潜在问题,强调科学的日志管理策略对系统可观测性的重要性。文中分析了6种反模式:copy truncate轮转导致的日志丢失或重复、NAS/OSS存储引发的采集不一致、多进程写入造成的日志混乱、创建文件空洞释放空间的风险、频繁覆盖写带来的数据完整性问题,以及使用vim编辑日志文件导致的重复采集。针对这些问题,文章提供了最佳实践建议,如使用create模式轮转日志、本地磁盘存储、单线程追加写入等方法,以降低日志采集风险,提升系统可靠性。最后总结指出,遵循这些实践可显著提高故障排查效率和系统性能。
290 20
|
23天前
|
存储 运维 开发工具
警惕日志采集失败的 6 大经典雷区:从本地管理反模式到 LoongCollector 标准实践
本文总结了日志管理中的六大反模式及优化建议,涵盖日志轮转、存储选择、并发写入等常见问题,帮助提升日志采集的完整性与系统可观测性,适用于运维及开发人员优化日志管理策略。
|
2月前
|
存储 缓存 Apache
StarRocks+Paimon 落地阿里日志采集:万亿级实时数据秒级查询
本文介绍了阿里集团A+流量分析平台的日志查询优化方案,针对万亿级日志数据的写入与查询挑战,提出基于Flink、Paimon和StarRocks的技术架构。通过Paimon存储日志数据,结合StarRocks高效计算能力,实现秒级查询性能。具体包括分桶表设计、数据缓存优化及文件大小控制等措施,解决高并发、大数据量下的查询效率问题。最终,日志查询耗时从分钟级降至秒级,显著提升业务响应速度,并为未来更低存储成本、更高性能及更多业务场景覆盖奠定基础。
|
11天前
|
存储
WGLOG日志管理系统可以采集网络设备的日志吗
WGLOG日志审计系统提供开放接口,支持外部获取日志内容后发送至该接口,实现日志的存储与分析。详情请访问:https://www.wgstart.com/wglog/docs9.html
|
2月前
|
消息中间件 存储 JSON
日志采集 Agent 性能大比拼——LoongCollector 性能深度测评
为了展现 LoongCollector 的卓越性能,本文通过纵向(LoongCollector 与 iLogtail 产品升级对比)和横向(LoongCollector 与其他开源日志采集 Agent 对比)两方面对比,深度测评不同采集 Agent 在常见的日志采集场景下的性能。
373 33
|
8月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
2460 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
7月前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
200 9
|
5月前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
427 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
9月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
845 3
|
4月前
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
261 13

相关产品

  • 日志服务