"本文主要介绍了CNCF官方社区轻量级日志收集工具"
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种类型的插件:输入、解析器、过滤器、输出、格式化程序、存储和缓冲区。
总结下
4、收集步骤
其中fluent-bit充当客户端,fluentd充当服务端,客户端定时根据某种特定策略收集日志传递到服务端,服务端存储日志,这一次不在说ES或者Kafaka,而是直接把日志文件集中收集存储磁盘文件中,当然大数据分析和展示工具fluentd本身是支持的,而且fluentd支持高可用配置。
5、收集方式
具体如何选择还要看业务场景收集日志详细程度。
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的安装和使用过程我会尽快完善补充,敬请关注,也可以加入圈子我们一起讨论。