WEBKT

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

35 0 0 0

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

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

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

1. 准备工作

2. 部署 Fluent Bit

3. 创建 Fluent Bit 配置文件

4. 设置环境变量

5. 部署 ConfigMap 和 DaemonSet

6. 验证日志输出

进阶:配置路由规则

总结

各位 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日志管理

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/7864