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

本文涉及的产品
对象存储 OSS,20GB 3个月
阿里云盘企业版 CDE,企业版用户数5人 500GB空间
对象存储 OSS,恶意文件检测 1000次 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社区

目录
相关文章
|
16天前
|
监控 测试技术 开发者
一行代码改进:Logtail的多行日志采集性能提升7倍的奥秘
一个有趣的现象引起了作者的注意:当启用行首正则表达式处理多行日志时,采集性能出现下降。究竟是什么因素导致了这种现象?本文将探索Logtail多行日志采集性能提升的秘密。
|
11天前
|
人工智能 Kubernetes 安全
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
51 13
|
1月前
|
存储 数据采集 监控
开源日志Fluentd
【10月更文挑战第21天】
47 7
|
1月前
|
消息中间件 存储 监控
微服务日志监控的挑战及应对方案
【10月更文挑战第23天】微服务化带来模块独立与快速扩展,但也使得日志监控复杂。日志作用包括业务记录、异常追踪和性能定位。
|
2月前
|
存储 数据采集 分布式计算
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
56 1
|
3月前
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
|
2月前
|
Kubernetes 监控 测试技术
k8s学习--OpenKruise详细解释以及原地升级及全链路灰度发布方案
k8s学习--OpenKruise详细解释以及原地升级及全链路灰度发布方案
|
存储 JSON Kubernetes
Kubernetes 中日志的正确输出姿势
本文我们将从实践角度出发来一步步构建K8s中的日志监控体系。构建日志系统的第一步是如何去产生这些日志,而这也往往是最繁杂最困难的一步。
1514 0
Kubernetes 中日志的正确输出姿势
|
存储 JSON Kubernetes
系列文章:Kubernetes中日志的正确输出姿势
上一期主要和大家介绍从全局维度考虑如何去构建K8s中的日志系统,本期我们从实践角度出发来一步步构建K8s中的日志监控体系。构建日志系统的第一步是如何去产生这些日志,而这也往往是最繁杂最困难的一步。
5115 0
|
10天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。

相关产品

  • 日志服务
  • 下一篇
    DataWorks