乐趣区

KubeCon 2018 参会记录 —— FluentBit Deep Dive

在最近的上海和北美 KubeCon 大会上,来自于 Treasure Data 的 Eduardo Silva(Fluentd Maintainer)带来了最期待的关于容器日志采集工具 FluentBit 的最新进展以及深入解析的分享;我们知道 Fluentd 是在 2016 年底正式加入 CNCF,成为 CNCF 项目家族的一员,其被广泛用于容器集群中进行应用日志的采集、处理和聚合,但今天主要是跟大家分享一下同样来自于 Treasure Data 新开源的日志采集工具——FluentBit。

FluentBit vs Fluentd
既然已经有了 Fluentd,那么为什么还要开发一个 FluentBit 呢?我们知道,Fluentd 是基于 Ruby 语言的,在一些应用日志量较大或者单节点日志量较大的场景下,通过 Fluentd 采集日志的速率会远落后于应用日志的产生速率,进而导致日志采集的延迟时间较大,这对于一些实时性要求较高的业务系统或者监控系统来说是不可接受的;另外一方面,也是由于 Fluentd 自身的日志处理逻辑越来越复杂,全部放置在一个组件里来完成会导致越来越臃肿,因此 Treasure Data 在基于 Fluentd 优秀的架构和设计理念上重新开发了一个更加轻量级、更加高性能的日志采集工具——FluentBit,其主要采用 C 语言进行开发。

从上面我们可以清晰地看到 FluentBit 本身占用的内存资源会比 Fluentd 少很多,且基本没有其他额外的环境依赖,但是支持的插件数相较于 Fluentd 会少很多,需要时间来慢慢丰富。
FluentBit Workflow

FluentBit 内置了一个 Service Engine,其每采集到一条日志时都会执行从 Input 到 Output 的整个 Action Chain:
– Input

日志数据入口,FluentBit 支持多种不同数据来源类型的 Input Plugin,不仅能采集容器日志、内核日志、syslog、systemd 日志,还支持通过 TCP 监听接收远程客户端的日志,同时还能够采集系统的 CPU、内存和 DISK 的使用率情况以及本机 Network 流量日志。
– Parser

通过情况下我们的应用日志都是非结构化的,那么 Parser 主要是负责将采集到的非结构化日志解析成结构化的日志数据,一般为 JSON 格式;FluentBit 默认已经预置了下面几种 Parser:

JSON:按照 JSON 格式来进行日志数据解析;
Regex:依据配置的正则表达式来进行日志数据解析;
Apache:遵循 Apache 日志格式来进行解析;
Nginx:遵循 Nginx 日志格式来进行解析;
Docker:遵循 Docker 标准输出日志格式进行解析;
Syslog rfc5424:按照 syslog rfc5424 规范格式进行日志解析;
Syslog rfc3164:按照 syslog rfc3164 规范格式进行日志解析;

– Filter

在实际的生产应用中,我们通常需要对采集到的应用日志记录进行修改或者添加一些关键信息,这都可以 Filter Plugin 来完成;目前 FluentBit 也已预置了多种 Filter 插件:

Grep:允许匹配或者过滤掉符合特定正则表达式的日志记录;
Record Modifier:允许对日志数据进行修改或者添加新的 KV 数据,通过此可以方便我们对日志数据进行打标;
Throttle:支持采用漏桶和滑动窗口算法进行日志采集速率控制;
Kubernetes:自动提取容器或者 POD 相关信息并添加到日志数据中;
Modify:基于设置的规则来对日志数据进行修改;
Standard Output:允许将日志数据直接打印到标准输出;
Lua:支持通过嵌入 Lua Script 来修改添加日志数据;

– Buffer

FluentBit 内部本身提供了 Buffer 机制,会将采集到的日志数据暂存在 Memory 中直到该日志数据被成功路由转发到指定的目标存储后端。
– Routing

路由是 FluentBit 的一个核心功能,它允许我们配置不同的路由规则来将同一条日志数据记录转发到一个或多个不同的接收后端,其内部主要是基于每条日志数据的 Tag 来进行路由转发,同时支持正则匹配方式;如下面配置则表示希望将 Tag 满足正则表达式 my_* 的日志直接打印到标准输出中:
[INPUT]
Name cpu
Tag my_cpu

[INPUT]
Name mem
Tag my_mem

[OUTPUT]
Name stdout
Match my_*
– Output

Output 主要是用来配置采集到的日志数据将要被转发到哪些日志存储服务中,目前已支持多种主流的存储服务,如 ElasticSearch、NATS、InfluxDB、Kafka、Splunk、File、Console 等,同样也支持将日志数据继续通过 HTTP(S) 协议将其传输到其他服务接口中;另外这里有一个比较特殊的 Output 就是 Fluentd,可能大家会比较奇怪,其实在未来的日志架构模型中,FluentBit 主要是在采集端专职负责日志的高性能采集,然后可以将采集到的日志在 Fluentd 中进行较复杂的聚合处理(同 Filebeat 和 Logstash):
Other Features

Event Driven 内置的 Service Engine 采用完全异步的事件驱动模型来进行日志的采集和分发。
Configuration 简单灵活的、高可读性的配置方式,FluentBit 的 Workflow 模型可完全通过配置文件的方式清晰制定。
Upstream Manager 采用统一的日志上游服务的网络连接管理,包括 Keepalive 和 IO Error 处理。
TLSv1.2 / Security 对于安全敏感的日志数据,支持通过 TLS 加密通道进行日志传输。

Upcoming Features

Filesystem buffering mode 当前 FluentBit 只支持 Memory 的 buffer 方式,但考虑到内存的易失性,未来也将会支持基于 Filesystem 的 buffer 机制。
Optional plugins as shared libraries 未来会将一些已内置的但又不是必需的插件以共享链接库的方式来进行动态加载。
Kubernetes Filter improvements 未来会继续深度整合 Kubernetes,通过 API 获取更多 POD 关键信息并自动添加到日志数据记录中。

Summary
这两次的 KubeCon 大会上 Eduardo Silva 对日志采集工具 FluentBit 都进行了深度的解析分享,不仅介绍了 FluentBit 的整个架构模型,而且还分享了未来的发展方向,从整个分享来看 FluentBit 会侧重在日志的高性能采集方面;而阿里云容器服务在 2017 年初开源的 Log-Pilot:https://github.com/AliyunContainerService/log-pilot,其不仅能够采集容器的标准输出日志,而且还能动态地发现采集容器内文件日志,同时支持简单高效的日志声明式配置、支持日志路由、日志数据打标以及多种日志采集插件,未来我们将进一步与社区紧密结合,整合 FluentBit 的高性能采集特性以及 Log-Pilot 的动态发现和声明式配置优势来进一步增强容器化应用日志的配置采集效率。

本文作者:chenqz 阅读原文
本文为云栖社区原创内容,未经允许不得转载。

退出移动版