K8s容器日志实时收集FileBeat+ES+Kibana

本文介绍了在Kubernetes(K8s)环境中,利用FileBeat收集容器日志并配合Elasticsearch(ES)和Kibana进行实时分析的流程。首先讲解了FileBeat的工作原理,包括harvester和prospector组件,然后详细阐述了从Tomcat镜像制作、FileBeat镜像构建到Elasticsearch和Kibana的安装过程。最后,文章通过k8s测试验证了日志收集的正确性和实时性。

K8s容器日志实时收集FileBeat+ES+Kibana

www.i4t.com

标签(空格分隔): ELK

k8s日志收集第一种方式
filebeat.png-197.6kB
k8s日志收集第二种方式
filebeat.png-197.6kB

环境说明

IP地址 服务 主机名
10.4.82.119 docker、k8s_master|node、 master
10.4.82.120 docker、 k8s_node、kibana node
10.4.82.115 es、Harbor镜像仓库、docker (主要作用就是打一个filebeat镜像) i4t

提示:filebeat跑在k8s容器内部,所以没有单独创建服务

一、FileBeat

作为 Beats 家族的一员,Filebeat 是一个轻量级的日志传输工具,它的存在正弥补了 Logstash 的缺点:Filebeat 作为一个轻量级的日志传输工具可以将日志推送到中心 Logstash。

在版本 5.x 中,Elasticsearch 具有解析的能力(像 Logstash 过滤器)— Ingest。这也就意味着可以将数据直接用 Filebeat 推送到 Elasticsearch,并让 Elasticsearch 既做解析的事情,又做存储的事情。也不需要使用缓冲,因为 Filebeat 也会和 Logstash 一样记住上次读取的偏移:
image_1d6v3v2fn29s1oa932m3nf1i0n9.png-24.1kB
如果需要缓冲(例如,不希望将日志服务器的文件系统填满),可以使用 Redis/Kafka,因为 Filebeat 可以与它们进行通信:
image_1d6v3vfrn16g7bmp18ct1cm7pvom.png-32.1kB

Filebeat 优点

Filebeat 只是一个二进制文件没有任何依赖。它占用资源极少,尽管它还十分年轻,正式因为它简单,所以几乎没有什么可以出错的地方,所以它的可靠性还是很高的。它也为我们提供了很多可以调节的点,例如:它以何种方式搜索新的文件,以及当文件有一段时间没有发生变化时,何时选择关闭文件句柄。

Filebeat 缺点

Filebeat 的应用范围十分有限,所以在某些场景下我们会碰到问题。例如,如果使用 Logstash 作为下游管道,我们同样会遇到性能问题。正因为如此,Filebeat 的范围在扩大。开始时,它只能将日志发送到 Logstash 和 Elasticsearch,而现在它可以将日志发送给 Kafka 和 Redis,在 5.x 版本中,它还具备过滤的能力。

典型应用场景

Filebeat 在解决某些特定的问题时:日志存于文件,我们希望

① 将日志直接传输存储到 Elasticsearch。这仅在我们只是抓去(grep)它们或者日志是存于 JSON 格式(Filebeat 可以解析 JSON)。或者如果打算使用 Elasticsearch 的 Ingest 功能对日志进行解析和丰富。

② 将日志发送到 Kafka/Redis。所以另外一个传输工具(例如,Logstash 或自定义的 Kafka 消费者)可以进一步丰富和转发。这里假设选择的下游传输工具能够满足我们对功能和性能的要求。

1.1 FileBeat工作原理

Filebeat是本地文件的日志数据采集器。作为服务器上的代理安装,Filebeat监视日志目录或特定的日志文件tail -f file并将它们转发给ES、Logstash、Kafka

Filebeat由二个主要组件组成:prospectorhavvester 这些组件一起工作读取文件并将时间数据发送到指定的输出

启动Filebeat时,它会启动一个或多个查找器,查看您的日志文件指定的本地路径。对**prospector**所在的每个日志文件,prospector启动harvester。每个harvester都会为新内容读取单个日志文件,并将新日志数据发送到libbeat,后者将聚合事件合并聚合数据发送到Filebeat配置的输出

kafka-img.png-83.3kB

harvester

负载读取单个文化的内容。读取每个文件,并将内容发送到the output。每个文件启动一个harvester,负责打开和关闭文件,这意味着在运行时文件描述符保持打开状态
如果文件在读取时被删除或重命名,Filebeat将继续读取文件。在harvester关闭之前,磁盘上的空间被保留。默认情况下,Filebeat将文件保持打开状态,直到达到close_inactive状态

关闭harvester会产生以下结果

1.如果在harvester仍在读取文件时文件被删除,则关闭文件句柄,释放底层资源。
2.文件的采集只会在scan_frequency过后重新开始
3.如果在harvester关闭的情况下移动文件,则不会继续处理文件
prospector

负责管理harvester并找到所有要读取的文件来源。
如果输入类型为日志,则查找器将查找路径匹配的所有文件,并为每个文件启动一个harvester。每个prospector都在自己的Go斜程中运行

以下示例将Filebeat配置为从与指定的匹配的所有日志文件中收集行:

filebeat.prospectors:
- type: log
  paths:
    - /data/log/*.log
    - /data/log4j/*.log

Filebeat目前支持两种prospector类型:logstdin
每个prospector类型可以定义多次
日志prospector检查每个文件以查看harvester是否需要启动,是否已经运行

只有在harvest关闭后文件大小发生了变化,才会读到新行

注:Filebeat prospector只能读取本地文件,没有功能可以连接到远程主机来读取存储的日志或文件

Filebeat 保持文件状态

Filebeat 保存每个文件的状态并经常讲状态刷新到磁盘上的注册中心中。该状态用于记录harvest正在读取的最后偏移量,并确保发送所有日志行。

如果输出(例如ES或Logstash)无法访问,Filebeat会跟踪最后发送的行,并在输出再次可用时继续读取文件。

在Filebeat运行时,

### K8s 容器日志收集与管理解决方案 在 Kubernetes 环境中,容器日志管理是一个重要的运维环节。以下是一些推荐的解决方案及其优缺点分析: #### 1. **Sidecar 容器模式** Sidecar 容器模式通过在每个 Pod 中添加一个专门用于日志收集容器来实现日志管理。这种方案部署简单且对宿主机友好[^1],但可能会消耗较多资源,甚至拖垮应用容器。此外,由于日志未输出到标准输出(stdout),因此无法通过 `kubectl logs` 查看日志内容[^1]。 示例 Dockerfile: ```dockerfile FROM logstash:7.6.2 LABEL author="admin@163.com" WORKDIR /usr/share/logstash COPY logstash.yml /usr/share/logstash/config/logstash.yml COPY logstash.conf /usr/share/logstash/pipeline/logstash.conf USER root RUN usermod -a -G root logstash ``` #### 2. **ELK + Filebeat 方案** ELK(Elasticsearch、Logstash、Kibana)结合 Filebeat 是一种常见且灵活的日志收集方案。Filebeat 运行在应用 Pod 中,负责收集日志并转发给 Logstash,最终存储到 Elasticsearch 中以供查询和分析[^3]。此方案的优点包括资源消耗少、扩展性强,并支持大集群系统的运维需求。然而,需要额外部署和维护 ELK 堆栈,增加了复杂性。 #### 3. **Fluentd 集成方案** Fluentd 是一种流行的开源数据收集器,广泛应用于 Kubernetes 日志管理。它可以直接运行在节点上或作为 sidecar 容器,将日志数据发送到多种后端存储(如 Elasticsearch、S3 等)。Fluentd 支持插件扩展,能够处理复杂的日志格式和数据流[^4]。 示例 Dockerfile: ```dockerfile FROM fluent/fluentd:v1.14-1 USER root RUN apk add --no-cache build-base ruby-devel && \ gem install fluent-plugin-elasticsearch && \ apk del build-base ``` #### 4. **基于 Node 的集中式日志收集** 在节点层面部署集中式日志收集服务(如 Fluentd 或 Filebeat),统一收集所有容器日志并转发到后端存储系统。这种方式无需为每个 Pod 添加 sidecar 容器,减少了资源开销,但也可能因单点故障导致日志丢失[^2]。 #### 5. **云原生日志解决方案** 如果使用的是托管 Kubernetes 服务(如 GKE、EKS 或 AKS),可以考虑利用其内置的日志管理功能。例如,Google Cloud Operations Suite 提供了与 Kubernetes 集成的日志收集和监控服务,简化了日志管理流程[^5]。 --- ### 总结 每种方案都有其适用场景和局限性。对于小型项目或资源受限环境,sidecar 容器模式可能是最简单的选择;而对于大规模生产环境,ELK + Filebeat 或 Fluentd 集成方案则更为合适。如果使用托管 Kubernetes 服务,建议优先考虑其内置的日志管理功能。 ```python # 示例代码:通过 Python 调用 Kubernetes API 获取 Pod 日志 from kubernetes import client, config config.load_kube_config() v1 = client.CoreV1Api() log_response = v1.read_namespaced_pod_log(name="example-pod", namespace="default") print(log_response) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值