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镜像详细说明下:
- 镜像构建配置文件:https://github.com/fluent/fluentd-kubernetes-daemonset/tree/master/docker-image/v1.14/debian-kafka
- 镜像构建时提供了,默认的配置文件,会拷贝到容器的/fluentd/etc/目录下。以下配置,如果是随着用户的实际情况变动的配置,会通过环境变量的形式暴露出来。
- 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的方式覆盖以上配置。更多细节详见Cluster-level Logging in Kubernetes with Fluentd。
# 创建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,后续文章会展开进一步介绍。
参考文档
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社区