欢迎光临
我们一直在努力

云原生环境下的日志统一管理:ELK 与 Fluentd 在 K8s 中的架构选型分析

在云原生环境中,尤其是 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 架构是当前云原生日志管理领域的事实标准。

【本站文章皆为原创,未经允许不得转载】:汤不热吧 » 云原生环境下的日志统一管理:ELK 与 Fluentd 在 K8s 中的架构选型分析
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址