背景
Fluentd/Fluent Bit作为云原生场景的可观测采集器,致力于打造云原生场景下的日志采集方案。Fluentd/Fluent Bit官方虽然提供了一些K8s的采集部署方案,但是总体来说自动化程度不高,操作也比较繁琐。所以也就催生出了各类Operator,比较有名的是Fluent Operator、Logging Operator,本文将重点介绍Fluent Operator的原理及实战。
Fluent Operator是由KubeSphere 社区于2021年捐献给Fluent 社区的,最初是为了满足以云原生的方式管理 Fluent Bit 的需求。Fluentbit Operator可以灵活且方便地部署、配置及卸载 Fluent Bit 以及 Fluentd。同时, 还提供支持 Fluentd 以及 Fluent Bit 的插件,用户可以根据实际需求进行定制化配置。
Fluent Operator原理
整体部署形态
Fluent Bit 与 Fluentd 都有采集、处理(解析和过滤)以及输出日志的能力,两者差异表现在:Fluent Bit 相对 Fluentd 更为轻量与高效,而 Fluentd借助更丰富的插件提供了更强的数据处理能力。基于Fluent Bit、Fluentd的各自的优点,在K8s日志采集场景下,Fluent Operator 提供了多种部署模式供用户根据实际业务情况进行选择:
- Fluent Bit only 模式:适用于采集日志后仅需要简单处理,即发送到第三方存储系统的场景。
- Fluent Bit + Fluentd 模式:适用于采集日志后需要更高级处理,才发送到第三方存储系统的场景。
- Fluentd only 模式:适用于以 HTTP 或 Syslog 等的方式接收日志,经过日志处理后,发送到第三方存储系统的场景。
以Fluent Bit、Fluentd模式为例,Fluent Bit以DaemonSet用于采集K8s集群内各节点上的容器日志;而Fluentd则部署为StatefulSet,接收来自Fluent Bit的请求,之后经过日志处理后发送到第三方存储系统(例如,ES、Kafka、Loki等)。一个典型的处理pipiline如下图所示,包含了将采集、转发、过滤、输出等阶段。用户可以通过CRD的方式来配置pipiline,进而构建K8s下的日志采集系统。
CRD
Fluent Bit CRDs
Fluent Bit CRDs包含了如下几种类型:
- FluentBit: Fluent Bit DaemonSet配置定义。
- ClusterFluentBitConfig: 选择ClusterInput、ClusterParser、ClusterFilter、ClusterOutput,并生成配置存入Secret Config。
- ClusterInput: 集群粒度的Input插件配置。通过该插件,用户可以自定义采集的日志类型。
- ClusterParser: 集群粒度的Parser插件配置。通过该插件进行日志解析。
- ClusterFilter: 集群粒度的Filter插件配置。通过该插件进行日志的过滤。
- ClusterOutput: 集群粒度的Output插件配置。该插件主要负责将处理后的日志发送到第三方存储系统。
其中,每个ClusterInput、ClusterParser、ClusterFilter、ClusterOutput 代表一个 Fluent Bit 配置段,之后Fluent Operator 根据ClusterFluentBitConfig的标签选择器进行选择。Fluent Operator将符合条件的CRD构建成最终的配置,并存入Secret Config中,最后挂在到Fluent Bit的DaemonSet中。
为了解决Fluent Bit不支持热加载配置的问题,添加了一个名为Fluent Bit watcher的包装器,用于检测到 Fluent Bit 配置更改时立即重新启动 Fluent Bit 进程,而无需重新启动 Fluent Bit的pod。
Fluentd CRDs
Fluentd CRDs包含了如下几种类型:
- Fluentd: Fluentd Statefulset配置定义。
- FluentdConfig: 选择namespace粒度的ClusterInput、ClusterParser、ClusterFilter、ClusterOutput,并生成配置存入Secret Config。
- ClusterFluentdConfig: 选择集群粒度的ClusterInput、ClusterParser、ClusterFilter、ClusterOutput,并生成配置存入Secret Config。
- Filter: namespace粒度的Filter插件配置。
- ClusterFilter: 集群粒度的Filter插件配置。
- Output: namespace粒度的Ouptut插件配置。
- ClusterOutput: 集群粒度的Ouptut插件配置。
ClusterFluentdConfig为集群级别,具有watchedNamespaces字段,可以设置监听的namespace;如果不设置,则表示全局监听。FluentdConfig为namespace级别,只能监听所在的namespace的CR。通过ClusterFluentdConfig、FluentdConfig可以在namespace层面实现多租户日志隔离。
Fluent Operator实战
入门实战
代码仓库:https://github.com/fluent/fluent-operator
通过执行如下命令,可以快速实现上图的采集处理pipeline。
###### 部署Fluent Operator
kubectl apply -f https://raw.githubusercontent.com/fluent/fluentbit-operator/master/manifests/setup/setup.yaml
# You can change the namespace in manifests/setup/kustomization.yaml
# and then use command below to install to another namespace
# kubectl kustomize manifests/setup/ | kubectl apply -f -
###### 部署Kubernetes logging stack
kubectl apply -f manifests/logging-stack
# You can change the namespace in manifests/logging-stack/kustomization.yaml
# and then use command below to install to another namespace
# kubectl kustomize manifests/logging-stack/ | kubectl apply -f -
完整的yaml配置相见链接。不同的yaml配置,通过tag: kube.*进行串联。
进阶实战
代码仓库:https://github.com/kubesphere-sigs/fluent-operator-walkthrough
fluent-operator-walkthrough提供了更上层的封装,针对于不同的业务场景,提供了一键部署能力。
- Fluent Bit Only:只启用轻量级的 Fluent Bit 对日志进行采集、处理以及转发。
- Fluent Bit + Fluentd 模式:借助 Fluentd 丰富的插件,提供更高级的日志处理能力。Fluent Operator 轻松地实现将采集的日志从 Fluent Bit 转发到 Fluentd。
- Fluentd Only 模式:只部署Fluentd statefulset。
参考文档
Fluent Operator:云原生日志管理的一把瑞士军刀
关于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社区