请问大家在 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 容器的日志。

1年前 评论
sanders (楼主) 1年前
讨论数量: 3

安装 EFK,然后把 Laravel 容器的日志模式改为 “标准输出” (stdout),F 默认是按 daemonset 安装的,每个node 有一个,监控转发 laravel 容器的日志。

1年前 评论
sanders (楼主) 1年前
sanders

ES 各个组件的知识太匮乏,导致这几周一直在各种踩坑,加上一些 helm 的坑。

最终采用的方案是让容器将日志通过 hostPath 卷都挂在宿主机的固定目录上,因为部分容器的日志由子进程输出,所以无法通过 stdout (还是我认知有问题,请指出)进行抓取。然后通过 daemonset 对象部署的 filebeat 进行抓取,并投递给 logstash (一个供应商需要他们自己研发的 logstash 插件进行处理,所以无法直连 es )。

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!