Skip to content

fluentbit 部署文档

EZ4BRUCE edited this page Dec 1, 2022 · 2 revisions

简介

fluentbit是用于 Linux,OSX,Windows 和 BSD 系列操作系统的快速轻量级日志处理器,流处理器和转发器。它非常注重性能,允许对不同来源的事件进行收集且简单易用。

在 MO-Observability 的设计中,我们将使用fluentbit作为一个采集器采集一个VM(通常是K8S中的一个节点)的os log和metric,并将采集到的记录通过HTTP发送到MO-Agent中,由后者进行后续的持久化操作

企业微信截图_d990fca0-1149-4f4e-beeb-61029efe8ca7-20221128165457-99z8z1g

部署环境

本文档将提供以下环境的部署流程以及基本运维操作,若以下的一些服务或者组建版本有较大差异,则不保证适用

本文档的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​ 见文末附录

数据管道

image-20221128124400-gkgp85y

上图是fluentbit的数据管道,Input采集到的原始记录经过一系列的解析、过滤后最终经过路由输出到指定的地方,上图中所有的组件都被fluentbit集成到一个个插件(plugins)里,我们只需要在配置文件的 config​ 项下声明需要安装的插件即可

Input

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]​ 项,详情请见官方文档

Filter

过滤是一项重要功能,可让我们在将数据传递到某个目的地之前对其进行修改,过滤器作用的范围是 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

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

Clone this wiki locally