1、介绍
前段时间写了一篇日志收集方案,Kubernetes日志收集解决方案有部分读者反馈说,都是中小企业,哪有那么多资源上ELK或者EFK,大数据这一套平台比我自身服务本身耗费资源还要多,再说了,现阶段我的业务不需要格式转换,不需要数据分析,我的日志顶多就是当线上出现问题时,把我的多个节点日志收集起来排查错误。但是在Kubernetes平台上,pod可能被调度到不可预知的机器上,如果把日志存储在当前计算节点上,难免会出现排查问题效率低下,当然我们也可以选用一些共享文件服务器,比如GFS、NFS直接把日志输出到特定日志服务器,这种情况对于单副本服务没有任何问题,但是对于多副本服务,可能会出现日志数据散乱分布问题(因为多个pod中日志输出路径和名称都是一样的),下面我介绍通过CNCF社区推荐的fluentd进行日志收集。
2、对比
使用fluentd日志收集之前:
使用fluentd日志收集之后:
看到这张图片之后就被fluentd架构清晰程度吸引了;
3、fluentd和fluent-bit介绍
fluentd是一款开源的日志收集工具。基于ruby和C编写,它拥有非常多的插件,可以满足的我们对各种格式的日志进行收集,过滤,解析等。把日志信息变成我们想要的格式。并且,没有找到满足我们的插件,我们可以自己写插件。fluentd收集日志时,将所有日志看做JSON格式的数据。并且用正则表达式去匹配日志。fluentd自带丰富的日志收集格式。以及可以将日志收集到各种存储的数据库。fluentd有7种类型的插件:输入、解析器、过滤器、输出、格式化程序、存储和缓冲区。
总结下
Fluentd是一个集数据的收集、过滤、聚合处理、转发、接收为一体数据收集器。
Fluend-bit是Fluentd的精华版本,纯C编写、大小450kb,更轻量级,主要支持数据的收集和处理功能。
4、收集步骤
其中fluent-bit充当客户端,fluentd充当服务端,客户端定时根据某种特定策略收集日志传递到服务端,服务端存储日志,这一次不在说ES或者Kafaka,而是直接把日志文件集中收集存储磁盘文件中,当然大数据分析和展示工具fluentd本身是支持的,而且fluentd支持高可用配置。
5、收集方式
每个节点以Kubernetes中DaemonSet形式运行fluent-bit,在各个节点进行日志收集,收集完成后发送到fluentd进行统一日志处理和存储。这种方式结构简单清晰,但是收集较为粗略,如果说一个pod的多个副本运行在同一个节点上,可能会出现日志交叉打印问题,当然我们也可以在yaml中配置约束条件,同一个pod调度到不同计算节点,限制这种情况出现。
通过sidercar方式运行fluent-bit,编写业务yaml的同时,把fluentd-bit追加进去,这种收集日志较为详尽,可以收集到pod中container信息,但是会出现跟业务耦合的问题。
具体如何选择还要看业务场景收集日志详细程度。
6、示例
fluentd-bit客户端日志收集配置
[SERVICE]
Flush 1
Daemon OFF
Log_Level debug
[INPUT]
Name tail
Path /home/logs/nginx.log
Db /tmp/ng.db
Db.sync Full
Tag ng-log
[OUTPUT]
Name forward
Match *
Host 112.68.7.95
port 24224
fluentd服务端接收日志配置
<source>
@type forward
port 24224
</source>
<source>
@type http
port 9880
</source>
<match nginx*>
#匹配有tag为mem的类型
@type stdout #匹配成功直接标准输出
</match>
<match nginx*>
@type file
path /data/log/fluent/access
<format>
@type single_value
message_key log
add_newline true
</format>
<buffer>
@type file
chunk_limit_size 1M
# 每隔1分钟写一次日志
flush_interval 1m
flush_at_shutdown true
flush_mode interval
</buffer>
</match>
7、总结
如上主要讲述了fluentd和fluent-bit通过客户端和服务端配合收集日志的使用过程,在使用过程fluentd和fluent-bit采用原生安装的方式,暂时没有通过Kubernetes pod运行,至于fluentd和fluent-bit的安装和使用过程我会尽快完善补充,敬请关注,也可以加入圈子我们一起讨论。