在云原生环境中,尤其是 Kubernetes 集群中,日志管理面临巨大的挑战:容器的短暂生命周期、日志输出的分散性以及对高性能、低延迟的需求。日志的统一收集、存储和分析是保障系统稳定运行和快速排障的关键。
本文将聚焦于最流行的云原生日志架构:使用 Fluent Bit 作为日志收集器,搭配 Elasticsearch (ES) 进行存储和搜索,以及 Kibana 进行可视化分析(即 FBE Stack)。我们将分析 Fluentd/Fluent Bit 在 K8s 中的定位,并提供具体的部署实践。
1. 架构选型分析:ELK 与 Fluentd/Fluent Bit 的角色
很多人会将 ELK(Elasticsearch, Logstash, Kibana)与 Fluentd/Fluent Bit 进行比较,但这并非严格意义上的竞争关系,而是功能互补。
- ELK Stack (Backend): 提供日志的存储、索引、搜索和可视化能力。
- Elasticsearch: 分布式、高可扩展的搜索和分析引擎。
- Kibana: 强大的数据可视化和管理工具。
- Logstash: 传统上作为日志处理和转发器。但在 K8s 中,由于资源消耗较大,它经常被更轻量级的 Fluent Bit 所取代,或用于复杂的 ETL 管道。
- Fluentd/Fluent Bit (Collector/Shipper): 负责从 K8s 节点收集日志,进行初步解析和过滤,然后转发到后端存储(如 ES)。
- Fluent Bit: 推荐用于 K8s。它是一个超轻量级、资源占用极低的日志处理器和转发器,通常以 DaemonSet 的形式部署在每个 K8s 节点上,直接读取 /var/log/containers/ 下的日志文件。
结论: 在 K8s 生产环境中,最佳实践是采用 Fluent Bit (收集器) + Elasticsearch + Kibana (FBE) 架构。
2. 实践:Fluent Bit DaemonSet 部署
为了让 Fluent Bit 能够高效地收集集群日志,我们通常将其部署为一个 DaemonSet,确保每个节点上都有一个实例运行。
步骤 1: 配置 ConfigMap
首先,定义 Fluent Bit 的配置,指定日志的输入源和输出目标(Elasticsearch)。
apiVersion: v1
kind: ConfigMap
metadata:
name: fluent-bit-config
namespace: logging
data:
fluent-bit.conf: |
[SERVICE]
Flush 5
Daemon off
Log_Level info
@INCLUDE input-tail.conf
@INCLUDE output-es.conf
# 输入配置:从 Kubernetes 容器日志目录读取
input-tail.conf: |
[INPUT]
Name tail
Path /var/log/containers/*.log
Tag kube.*
Parser docker
Mem_Buf_Limit 5MB
Skip_Long_Lines On
# 输出配置:发送到 Elasticsearch
output-es.conf: |
[OUTPUT]
Name es
Match kube.*
Host elasticsearch-service.logging.svc.cluster.local
Port 9200
Index k8s-logstash-%
Type flb_type
Logstash_Format On
Time_Key @timestamp
Retry_Limit False
注意: 这里的 Host 假定您已将 Elasticsearch 部署在 logging 命名空间下,并且其 Service 名称为 elasticsearch-service。
步骤 2: 部署 Fluent Bit DaemonSet
通过 DaemonSet 确保 Fluent Bit 运行在集群的每个节点上。我们需要挂载 /var/log 目录,以便 Fluent Bit 能够访问宿主机上的容器日志文件。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluent-bit
namespace: logging
labels:
k8s-app: fluent-bit-logging
spec:
selector:
matchLabels:
k8s-app: fluent-bit-logging
template:
metadata:
labels:
k8s-app: fluent-bit-logging
spec:
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
- name: fluent-bit
image: fluent/fluent-bit:1.9.9
resources:
limits:
memory: 100Mi
requests:
cpu: 10m
memory: 50Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
- name: fluent-bit-config
mountPath: /fluent-bit/etc/
terminationGracePeriodSeconds: 10
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: fluent-bit-config
configMap:
name: fluent-bit-config
步骤 3: 部署 Elasticsearch 和 Kibana
ES 和 Kibana 的部署通常较为复杂,推荐使用 Elasticsearch Operator 或官方 Helm Chart 进行部署,以确保其高可用性和持久性存储(PV/PVC)。
部署完成后,通过 Kibana 即可配置索引模式(例如 **k8s-logstash-***),并开始搜索和分析来自 K8s 集群的实时日志。
总结
在 Kubernetes 环境下,高效的日志统一管理是通过解耦各个组件实现的。Fluent Bit 提供了轻量级且高性能的日志收集入口,完美解决了云原生环境中资源受限的问题,而 ELK Stack 则提供了强大的后端存储和分析能力。这种 FBE 架构是当前云原生日志管理领域的事实标准。
汤不热吧