有很多的方案备选,下面列出了几种:
1、sidecar边车模式,在每一个pod部署一个filebeat sidecar容器(共享empty dir卷进行日志采集)
2、应用容器pod内直接部署日志采集agent进行采集;
3、打印到console,从宿主机的docker log文件去采集(读取本地文件,不推荐)
4、打印到console,通过宿主机的docker log driver去采集(二进制直接输出);
5、挂载k8s的flex volume,将日志文件写到这个flex volume目录下,然后从宿主机去采集日志文件。
……
备注:上面说的宿主机,都是以DaemonSet的方式部署,即一个Node节点(通常为物理机)部署一个DaemonSet pod节点。
主要从性能、方便运维、满足多种需求几个角度去考虑。5这个方案(FlexVolume)是比较好的:
1)性能上,基于挂载卷,日志直接落盘,容器内无agent、无任何开销,且日志不经过docker log driver,不会再另外保存一份。
2)采集都是要占宿主机资源的,相比每个pod部署一个agent,只在宿主机部署一个agent集中采集当前宿主机的所有pod,效率很高。
3)运维上,每个应用配置挂一个日志挂载目录即可,实际挂载目录会根据pod区分(自动的)。也就是说,对应用来说,只需要配一个日志目录路径(这个是必须的),然后运维再在宿主机上配该应用的日志采集即可。两个都是必须步骤,简单得不能再简单了。
满足需求上,
1、日志文件落盘,可永久归档(有些业务有这个需求),而且很方便、直接文件备份即可。
2、查看日志,在统一日志平台查看,或者登录到容器内或宿主机上,tail查看,都可以。
3、日志收集配置,可根据应用名称等灵活处理,跟普通日志文件收集是一样的模式。
然后我们再说一说其他几种方案的缺点:
1)sidecar模式上面已经说了,每个pod都部署一个agent,估计要占用30M资源,相比一个宿主机一个agent而言,总的资源占用率要高很多倍,假设一个宿主机部署100个pod,那么对宿主机的总内存消耗就是30×100M。
2)容器内部署日志采集agent的模式,跟sidecar模式的缺点一样,总占用资源高,而且不方便统一管理。
3)基于宿主机DaemonSet log driver模式,日志一方面会被agent收集,另一方面还会通过log driver写入本地日志系统,双重消耗,不适合日志量大的情况,而且最致命的是,只能收集控制台打印的日志!(所有日志混在一起无法分类),容器内的日志文件怎么办?
市面上各种日志方案,我们都研究了,像阿里云这样的logtail功能强大,但是很多是定制的,需要定制的k8s组件。
阿里k8s日志收集方案的“底层原理”,暂时没看到介绍,但看起来和方案5的FlexVolume非常像,它也是配置一个日志路径就能收集。不像是sidecar,因为这样会在pod中新增一个agent容器。
备注:我们用的FlexVolume方案是Rancher fluentd提供的,它提供了自动创建FlexVolume卷并挂载到pod的日志目录的功能,非常方便使用。
另外,我遇到了一个特殊需求:
1、测试和运维,还是习惯在linux控制台看日志,并且他们同时开10多个ssh界面一起看。
我的回答是:使用统一日志平台,比如kibana,配置好之后,看日志的体验和console其实差不多,可以准实时刷新,且功能比tail命令强大,比如说你看到某段关键日志,可以暂停,可以前后翻页、查询,这是tail不具备的。而且在同一个页面的下拉菜单,可以切换不同的应用,跟切换SSH tab页的方便程度差不多。如果想一个页面“同时”显示多个应用,其实也可以做到,给你要看的多个应用建聚合索引,特别的可以建"*"匹配所有应用,然后再自己筛选。非要挑刺的话,就是实时性不如console,然后是有一定的学习成本。关于实时性,EFK(filebeat)延时问题:kibana页面最多只能5秒刷新一次,采集有3秒左右延迟,然后还有传输、处理、存储等耗时,实测总延时约15秒左右,挺难受,但是应该有很大的优化空间,比如接入kafka、使用SSD硬盘等。
还有一个方案,容器内外通用,我认为是最佳方案:(需要具备实施条件)
应用直接通过日志组件Appender把日志发送到最近的高速Loghub上
参见:https://yq.aliyun.com/articles/409045
阿里云开源的Java各种日志组件的appender:
https://github.com/aliyun/aliyun-log-java-producer
上面是Java的,同样,其他语言也都有自己的日志组件,也都能实现类似的功能。
总结,最佳方案就是上面的 方案5挂载FlexVolume+应用内日志组件直采,等价于阿里云目前最先进的采集方案(阿里云只是在方案5上结合自己的平台做了定制,而应用内日志采集用到了自家的Logtail服务)。