容器日志收集ELK+Filebeat+Kafka

本文介绍了一种基于Filebeat、Kafka、Logstash、Elasticsearch和Kibana的Kubernetes容器日志收集方案。该方案利用Daemonset在每个Node节点部署Filebeat收集日志,通过Kafka传递至Logstash,再由Logstash处理后存入Elasticsearch,并最终在Kibana展示。文章详细对比了文件读取、Daemonset和Sidecar三种日志采集方式,推荐使用Daemonset方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

随着容器如火如荼的发展,分布式的业务架构日志收集便也成了我们需要重点考虑之一;传统方式中已经有相对成熟的解决方案,无不外乎容器中我们同样能够采取相同的架构解决容器基于Kubernetes的日志收集问题;

 

组件介绍

对于这套方案,网上已经有无数种介绍,在此就不再对各大组件进行赘述,仅做简单描述

组件作用优点
Filebeat作为客户端收集日志,输送消息至Kafka占用资源少,处理数据快,十分稳定
Kafka接收Filebeat产生的消息,并由Logstash进行消费解决程序异常导致的日志丢失问题
Logstash消费Kafka中的消息,根据规则自动创建索引可配置型高,支持多输入输出方式
Elasticsearch持久化存储数据便于检索查询
Kibana展示日志收集结果便于结果查询

 

架构图

 

容器日志采集方式

  • 文件读取: 容器日志通过程序定义输出到文件然后通过挂载出来

  • Daemonset: 在Node节点部署filebeat采集容器日志

  • Sidercar: 在每个Pod中部署sidecar容器用于收集容器日志

这三种方式各有利弊,从维护性及资源使用上,比较推荐的是Daemonset方式

 

要求

  • 首先需要在每个Node节点上部署filebeat

  • 定义容器中的日志输出到控制台,以nginx为例

         access_log /dev/stdout json;
         error_log  /dev/stderr;
  • 为Pod添加annotations用于收集控制参数

          annotations:
            filebeat.harvest: "true"
            filebeat.index: "elktest"

日志收集效果

场景是否丢日志测试过程
更新nginx/php配置时持续请求2W次,日志有2W条展示
更新k8s yaml模版持续请求2W次,日志有2W条展示
更新代码持续请求2W次,日志展示偶尔少1条、2条,无错误日志;经排查由于脚本执行过程中未发起http请求
Hpa进行弹性伸缩持续请求2W次,日志有2W条展示
Hpa进行弹性伸缩的情况下更新代码是(出现502情况)持续请求2W次,日志有大于2W条展示日志,有短时间502出现(5~20S服务不可达)待调优

服务部署

为防止篇幅过长影响可读性,部署章节分文编写,请见下章

### 集成 KafkaELK 到 Spring Boot 项目 #### 使用 Spring Boot 进行 Kafka 的集成 为了使 Spring Boot 应用程序能够发送和接收消息,可以利用 `spring-kafka` 依赖项来简化这一过程。通过配置文件中的几行设置以及一些简单的 Java 注解就可以实现基本的消息传递功能[^1]。 ```xml <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> ``` 对于生产者端而言,在应用程序属性文件中定义 Kafka broker 地址和其他必要的参数之后,只需要创建一个带有 `@KafkaListener` 注解的方法即可监听特定主题上的消息;而对于消费者,则可以通过注入 `KafkaTemplate` 来轻松地向指定的主题发布新消息。 #### 将日志数据导入到 ELK 堆栈 为了让 Spring Boot 日志能被收集并处理,通常会采用 Logback 或 Log4j2 等框架作为应用的日志记录器,并配合 Filebeat 工具定期扫描这些日志文件并将它们转发给 Logstash 处理。Logstash 可以解析、过滤和转换接收到的数据流,最终将其存储至 Elasticsearch 中供后续查询分析之用[^2]。 ```json input { beats { port => "5044" } } filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601}@%{JAVACLASS}" } } } output { elasticsearch { hosts => ["http://localhost:9200"] } } ``` 上述配置展示了如何让 Logstash 接收来自 Beats 客户端传输过来的日志条目,并运用 Grok 插件提取其中的时间戳与类名信息以便更好地索引文档结构化字段。最后再把整理好的事件写入本地运行着的 ES 实例里去。 #### 结合使用 Alibaba Cloud 提供的服务 如果考虑部署于云端环境的话,那么借助像阿里云这样的平台所提供的托管解决方案将会大大减轻运维负担。例如官方博客提到过可以在其容器服务之上无缝接入自家的日志管理组件——SLS (Simple Logging Service),从而更高效便捷地完成整个监控体系搭建工作[^3]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值