请问大家在 k8s 集群里是如何部署 filebeat 的?
业务场景
我们使用的是 Laravel
框架开发的应用程序,每天都会产生大量的服务器日志、业务日志和异常日志。之前服务采用单机部署,没有做日志收集和监控,导致在业务增长后,对系统情况的感知严重滞后,也很难定位问题。
现在准备采用k8s
集群对服务进行部署,经过前一段时间的调研,在没有日志收集的情况下,查找系统中的问题简直就是灾难,要到各种pod
的各个副本中查询日志定位问题。
我们准备采用ELK
的方案来进行日志收集,收集的日志主要分为两种,一种是容器日志,这部分日志会在容器主进程启动是直接输出到控制台。另一种是文件日志,一般是业务产生的,比如访问第三方接口的参数和响应结果。
我的思路
方案一:使用deployment
绑定应用容器
关于部署filebeat
我们之前尝试的方案是将其容器和php
应用的容器组合到一个deployment
对象里面,并共享日志临时卷,这样部署的时候就会跟随应用程序部署到各个节点上。但这样有两个缺点,其一是我们的php
应用为了让业务之间互不影响又能快速进行大量数据的处理,会拆成很多消化队列的消费者(大概会有上百个)分开部署,这样filebeat
也会随着php
应用部署大量容器,消耗系统资源;其二是由于deployment
是无状态的,使用的是临时卷,导致在pod
释放时,如果存在未成功投递的数据,将无法找回。
方案二:使用statefulset
绑定应用容器
如果想解决方案一中的第二个缺陷,我能想到的就是采用statefuleset
做成有状态的应用,但大量有状态的应用有增加了集群的成本,尤其在使用自动伸缩后。且我还没有搞明白,如果业务峰值过去后,在集群自动释放副本时,如何消化那些失去了容器但还存在于持久卷上的未发送的数据。
方案三:使用daemonset
部署filebeat
这个方案还在空想阶段:filebeat
貌似可以通过docker
访问容器日志,不清楚是否也可以直接访问容器在宿主机上的临时卷,我还没试过,不知道在k8s
里面可否这样使用。
请教一下论坛里的各位
请问大家是如何在k8s
集群中部署filebeat
的,请帮我参考一下。
安装 EFK,然后把 Laravel 容器的日志模式改为 “标准输出” (stdout),F 默认是按 daemonset 安装的,每个node 有一个,监控转发 laravel 容器的日志。