-
Notifications
You must be signed in to change notification settings - Fork 0
fluentbit 部署文档
fluentbit是用于 Linux,OSX,Windows 和 BSD 系列操作系统的快速轻量级日志处理器,流处理器和转发器。它非常注重性能,允许对不同来源的事件进行收集且简单易用。
在 MO-Observability 的设计中,我们将使用fluentbit作为一个采集器采集一个VM(通常是K8S中的一个节点)的os log和metric,并将采集到的记录通过HTTP发送到MO-Agent中,由后者进行后续的持久化操作

本文档将提供以下环境的部署流程以及基本运维操作,若以下的一些服务或者组建版本有较大差异,则不保证适用
本文档的fluentbit是配置在k8s上的,使用了helm管理工具来部署应用,所使用的k8s环境版本是 v1.22.15
,helm的版本是 3.10.1
,fluentbit版本是 v1.9.8
注:以下的配置均基于v1.9的fluentbit文档
在使用chart包一键部署时,在包内部的 values.yaml
是该应用的默认配置,通常我们会通过 -f xxx.yaml
指定额外的配置文件来覆盖 values.yaml
中的特定配置条目,其他未覆盖到的则保持默认,推荐的配置 mo.yaml
见文末附录
上图是fluentbit的数据管道,Input采集到的原始记录经过一系列的解析、过滤后最终经过路由输出到指定的地方,上图中所有的组件都被fluentbit集成到一个个插件(plugins)里,我们只需要在配置文件的 config
项下声明需要安装的插件即可
fluentbit 提供了不同的输入插件来收集不同来源的信息,其中一些是从日志文件中收集数据,另一些可以从操作系统中收集指标信息。根据不同的需求有许多不同的插件,例如我们想要采集主机的CPU和磁盘使用信息,只需要在 mo.yaml
中 config
项的 inputs
子项中添加相应的 [INPUT]
项即可,每一个 [INPUT]
项对应同一时刻采集的一条记录,如果配置多个不同类别的 [INPUT]
项,将会产生多条采集记录
config:
## https://docs.fluentbit.io/manual/pipeline/inputs
inputs: |
[INPUT]
Name cpu
Tag my_cpu
[INPUT]
Name disk
Tag disk
Interval_Sec 1
Interval_NSec 0
更多其他采集指标的配置方法也都是添加相应的 [INPUT]
项,详情请见官方文档
过滤是一项重要功能,可让我们在将数据传递到某个目的地之前对其进行修改,过滤器作用的范围是 Tail 或 Systemd 类型的 Input
过滤是通过插件实现的,每个可用的过滤器都可用于通过某些特定的元数据来匹配,排除或丰富我们的日志。
过滤器的一个常见应用场景为采集记录添加 Kubernetes Deployments 信息,依然是通过在配置文件中声明来添加过滤器
# 这里以docker容器的tail输出为input
config:
inputs: |
[INPUT]
Name tail
Tag kube.*
Path /var/log/containers/*.log
Parser docker
filters: |
[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.
Merge_Log On
Merge_Log_Key log_processed
更多其他过滤器的配置方法也都是添加相应的 [FILTER]
项,详情请见官方文档
output 接口让我们能够定义数据的目的地。常见的目标是远程服务,本地文件系统或其它服务的标准接口。输出被实现为插件,并且包含众多可用插件。
在 MO-Observability 的设计中,我们需要获取其 HTTP 输出,官网称fluentbit的 HTTP 输出功能还比较基础
The http output plugin allows to flush your records into a HTTP endpoint. For now the functionality is pretty basic and it issues a POST request with the data records in MessagePack (or JSON) format.
这里以 JSON 格式为例,在配置中添加 [output]
项即可:
config:
outputs: |
[OUTPUT]
Name http
Match *
Host 10.96.3.118
Port 9090
URI /send
Format json
更多其他输出形式的配置方法也都是添加相应的 [OUTPUT]
项,详情请见官方文档
在k8s上使用helm的部署流程非常简单,只需要在k8s的master节点使用以下命令即可:
helm install [-f 配置文件.yaml] 发布名称 chart包目录
由于我们是使用本地的Chart包(包内含有 mo.yaml
作为配置文件),通常我们只需要在chart包目录中输入以下命令即可:
helm install -f mo.yaml fluentbit ./
取消部署
helm uninstall fluentbit
以下是 mo.yaml
:
image:
repository: sea.hub:5000/fluent/fluent-bit
testFramework:
image:
repository: sea.hub:5000/library/busybox
tag: 1.33.1
## https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/configuration-file
config:
service: |
[SERVICE]
Daemon Off
Flush {{ .Values.flush }}
Log_Level {{ .Values.logLevel }}
Parsers_File parsers.conf
Parsers_File custom_parsers.conf
HTTP_Server On
HTTP_Listen 0.0.0.0
HTTP_Port {{ .Values.metricsPort }}
Health_Check On
## https://docs.fluentbit.io/manual/pipeline/inputs
inputs: |
[INPUT]
Name cpu
Tag my_cpu
# [INPUT]
# Name disk
# Tag disk
# Interval_Sec 1
# Interval_NSec 0
# [INPUT]
# Name kmsg
# Tag kernel
# [INPUT]
# Name mem
# Tag memory
# [INPUT]
# Name netif
# Tag netif
# Interval_Sec 1
# Interval_NSec 0
# Interface eth0
# [INPUT]
# Name systemd
# Tag host.*
# Systemd_Filter _SYSTEMD_UNIT=kubelet.service
# Read_From_Tail On
[INPUT]
Name tail
Path /var/log/containers/*.log
multiline.parser docker, cri
Tag kube.*
Mem_Buf_Limit 5MB
Skip_Long_Lines On
# [INPUT]
# Name syslog
# Path /tmp/in_syslog
# Buffer_Chunk_Size 32000
# Buffer_Max_Size 64000
## https://docs.fluentbit.io/manual/pipeline/filters
filters: |
[FILTER]
Name kubernetes
Match kube.*
Merge_Log On
Keep_Log Off
K8S-Logging.Parser On
K8S-Logging.Exclude On
## https://docs.fluentbit.io/manual/pipeline/outputs
outputs: |
# [OUTPUT]
# Name forward
# Match *
# Host fluentd
# Port 24224
[OUTPUT]
Name http
Match *
Host 10.96.3.38
Port 9090
URI /fluent-write
Format json
## https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/classic-mode/upstream-servers
upstream: {}
# upstream.conf: |
# [UPSTREAM]
# upstream1
#
# [NODE]
# name node-1
# host 127.0.0.1
# port 43000
## https://docs.fluentbit.io/manual/pipeline/parsers
customParsers: |
[PARSER]
Name docker_no_time
Format json
Time_Keep Off
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%L
# This allows adding more files with arbitary filenames to /fluent-bit/etc by providing key/value pairs.
# The key becomes the filename, the value becomes the file content.
extraFiles: {}
# example.conf: |
# [OUTPUT]
# Name example
# Match foo.*
# Host bar