WEBKT

Kubernetes 日志终极指南:Fluent Bit 多路输出到 Elasticsearch 和 Kafka

191 0 0 0

各位 Kubernetes 开发者和运维老铁们,大家好!今天咱们来聊聊 Kubernetes 集群里一个让人又爱又恨的话题——日志管理。相信不少人都遇到过这样的场景:应用日志散落在各个 Pod 里,出了问题排查起来就像大海捞针;想把日志收集起来分析吧,又不知道该用什么工具,怎么配置。别慌,今天我就来给大家支支招,教你用 Fluent Bit 轻松搞定 Kubernetes 日志,还能实现多路输出,把日志同时发送到 Elasticsearch 和 Kafka,满足你不同的需求。

为什么我们需要多路输出日志?

在实际的生产环境中,我们对日志的需求往往是多样化的:

  • 实时监控和告警: 我们需要将日志实时发送到 Elasticsearch 这样的搜索引擎,方便我们快速检索、分析日志,及时发现问题并触发告警。
  • 离线分析和归档: 我们可能还需要将日志发送到 Kafka 这样的消息队列,用于后续的离线分析、数据挖掘、安全审计等。
  • 不同团队的需求: 不同的团队可能对日志有不同的需求,例如安全团队需要将日志发送到专门的安全审计平台,开发团队需要将日志发送到自己的调试工具。

如果只将日志发送到一个地方,显然无法满足这些多样化的需求。因此,我们需要一种能够将日志多路输出的解决方案,而 Fluent Bit 正是这样一款强大的工具。

Fluent Bit:轻量级日志收集利器

Fluent Bit 是一个开源的、高性能的日志处理器和转发器,专为 Kubernetes 等容器化环境设计。它具有以下优点:

  • 轻量级: Fluent Bit 的资源占用非常小,对集群性能的影响微乎其微。
  • 高性能: Fluent Bit 采用 C 语言编写,具有极高的处理性能,能够轻松应对海量日志。
  • 插件化: Fluent Bit 提供了丰富的插件,支持各种输入、过滤和输出方式,可以灵活地满足各种日志处理需求。
  • 易于配置: Fluent Bit 的配置文件简单易懂,即使是新手也能快速上手。

实战:配置 Fluent Bit 多路输出到 Elasticsearch 和 Kafka

接下来,我们就来实战一下,看看如何配置 Fluent Bit 将日志同时发送到 Elasticsearch 和 Kafka。

1. 准备工作

在开始之前,我们需要先准备好以下环境:

  • 一个运行中的 Kubernetes 集群
  • 安装好 Elasticsearch 和 Kafka(可以部署在 Kubernetes 集群内部或外部)

2. 部署 Fluent Bit

我们可以使用 Fluent Bit 官方提供的 DaemonSet 来部署 Fluent Bit:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluent-bit
  labels:
    k8s-app: fluent-bit
spec:
  selector:
    matchLabels:
      k8s-app: fluent-bit
  template:
    metadata:
      labels:
        k8s-app: fluent-bit
    spec:
      containers:
      - name: fluent-bit
        image: fluent/fluent-bit:latest
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: fluent-bit-config
          mountPath: /fluent-bit/etc/
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
          readOnly: true
      - name: fluent-bit-config
        configMap:
          name: fluent-bit-config

这个 DaemonSet 会在每个 Kubernetes 节点上运行一个 Fluent Bit Pod,负责收集该节点上的所有容器日志。

3. 创建 Fluent Bit 配置文件

接下来,我们需要创建一个 ConfigMap 来保存 Fluent Bit 的配置文件:

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-config
data:
  fluent-bit.conf: |
    [SERVICE]
        Flush        1
        Log_Level    info
        Daemon       off
        Parsers_File  parsers.conf

    [INPUT]
        Name              tail
        Path              /var/log/containers/*.log
        Parser            docker
        Tag               kube.*
        Refresh_Interval  5

    [FILTER]
        Name                kubernetes
        Match               kube.*
        Kube_URL            https://kubernetes.default.svc:443
        Kube_CA_File        /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        Kube_Token_File     /var/run/secrets/kubernetes.io/serviceaccount/token
        Kube_Tag_Prefix     kube.var.log.containers.

    [OUTPUT]
        Name            es
        Match           kube.*
        Host            ${FLUENT_ELASTICSEARCH_HOST}
        Port            ${FLUENT_ELASTICSEARCH_PORT}
        Logstash_Format On
        Logstash_Prefix kubernetes
        Type            _doc

    [OUTPUT]
        Name            kafka
        Match           kube.*
        Brokers         ${FLUENT_KAFKA_BROKERS}
        Topics          kubernetes-logs
        Format          json

  parsers.conf: |
    [PARSER]
        Name   docker
        Format json
        Time_Key time
        Time_Format %Y-%m-%dT%H:%M:%S.%L

这个配置文件主要包含以下几个部分:

  • [SERVICE]: Fluent Bit 的全局配置,例如刷新间隔、日志级别等。
  • [INPUT]: 定义日志的输入方式,这里我们使用 tail 插件来读取容器日志文件(/var/log/containers/*.log)。
  • [FILTER]: 定义日志的过滤规则,这里我们使用 kubernetes 插件来解析 Kubernetes 相关的元数据,例如 Pod 名称、命名空间等。
  • [OUTPUT]: 定义日志的输出方式,这里我们配置了两个输出:
    • es:将日志发送到 Elasticsearch,需要设置 Elasticsearch 的主机名、端口、索引名称等。
    • kafka:将日志发送到 Kafka,需要设置 Kafka 的 Brokers 地址、Topic 名称等。

4. 设置环境变量

在上面的配置文件中,我们使用了环境变量来配置 Elasticsearch 和 Kafka 的连接信息。我们需要在 Fluent Bit 的 DaemonSet 中设置这些环境变量:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluent-bit
  # ...
spec:
  # ...
  template:
    # ...
    spec:
      containers:
      - name: fluent-bit
        # ...
        env:
        - name: FLUENT_ELASTICSEARCH_HOST
          value: "elasticsearch.default.svc.cluster.local"
        - name: FLUENT_ELASTICSEARCH_PORT
          value: "9200"
        - name: FLUENT_KAFKA_BROKERS
          value: "kafka-broker-1:9092,kafka-broker-2:9092"
        # ...

请根据你的实际环境修改这些环境变量的值。

5. 部署 ConfigMap 和 DaemonSet

将 ConfigMap 和 DaemonSet 的 YAML 文件保存到本地,然后使用 kubectl apply 命令部署:

kubectl apply -f fluent-bit-configmap.yaml
kubectl apply -f fluent-bit-daemonset.yaml

6. 验证日志输出

部署完成后,Fluent Bit 就会开始收集容器日志,并将日志同时发送到 Elasticsearch 和 Kafka。你可以通过以下方式验证日志是否正确输出:

  • Elasticsearch: 使用 Kibana 或 Elasticsearch API 查询 kubernetes-* 索引,查看是否有新的日志数据。
  • Kafka: 使用 Kafka 命令行工具或消费者程序订阅 kubernetes-logs Topic,查看是否有新的日志消息。

进阶:配置路由规则

上面的配置会将所有容器日志都发送到 Elasticsearch 和 Kafka。如果你想根据不同的条件将日志发送到不同的目的地,可以使用 Fluent Bit 的路由规则。

Fluent Bit 的路由规则是通过 Match 字段实现的。Match 字段支持通配符匹配,例如:

  • *:匹配所有日志。
  • kube.*:匹配所有 Kubernetes 相关的日志。
  • kube.namespace.*:匹配特定命名空间下的日志。
  • kube.*.podname:匹配特定 Pod 的日志。

你可以根据自己的需求修改 Match 字段,实现更精细的日志路由。

例如,如果你只想将 prod 命名空间下的日志发送到 Kafka,可以将 Kafka 输出的 Match 字段修改为:

[OUTPUT]
    Name            kafka
    Match           kube.prod.*
    Brokers         ${FLUENT_KAFKA_BROKERS}
    Topics          kubernetes-logs
    Format          json

总结

通过本文的介绍,相信你已经掌握了如何使用 Fluent Bit 将 Kubernetes 日志多路输出到 Elasticsearch 和 Kafka。这只是 Fluent Bit 的冰山一角,它还有很多强大的功能等待你去探索。如果你想深入了解 Fluent Bit,可以参考官方文档:https://docs.fluentbit.io/

希望这篇文章对你有帮助!如果你有任何问题或建议,欢迎在评论区留言。下次再见!

容器老司机 KubernetesFluent Bit日志管理

评论点评