Fluent-bit 配置参考

1. 环境准备

  • Kubernetes 集群
  • 已部署好 clickvisual
  • 已通过 DaemonSet 部署好 fluent-bit

先简单介绍下 fluent-bit 工作流程(官方文档Fluent-bit 配置参考 - 图1 (opens new window)):

img.png

日志通过数据管道从数据源发送到目的地,一个数据管道可以由 Input、Parser、Filter、Buffer、Routing、Output 等组成。

  • Input 插件:用于从数据源抽取数据,一个数据管道中可以包含多个 Input。
  • Parser 组件:负责将 Input 抽取的非结构化数据转化为标准的结构化数据,每个 Input 均可以定义自己的 Parser。
  • Filter 插件:负责对格式化数据进行过滤和修改。一个数据管道中可以包含多个 Filter,多个 Filter 执行顺序与配置文件中的顺序一致。
  • Buffer 组件:用户缓存经过 Filter 处理的数据,默认情况下Buffer把Input插件的数据缓存到内存中,直到路由传递到output为止。
  • Routing 组件:将 Buffer 中缓存的数据路由到不同的 Output。
  • Output 插件:负责将数据发送到不同的目的地,一个数据管道中可以包含多个 Output。

假设你是采用的 DaemonSet 方式部署 Fluent-bit,你的目标是采集 Kubernetes 集群的 Nginx Ingress 日志和业务标准输出日志,那么你可以参考如下样例来配置你的 Fluent-bit。

你可以通过 clickvisual 的可视化配置界面来对 Fluent-bit 进行配置的删改,具体操作方法是:点击顶部导航栏,选择 配置。然后在页面中两个联动选择器中选择已部署 Fluent-bit 的集群 / 命名空间 / ConfigMap。如还未录入集群数据,可以参考 系统配置Fluent-bit 配置参考 - 图3 (opens new window) 进行录入。

下图是选择 xxx-dev 集群下的 kube-system 命名空间下 fluent-bit-config 这个 ConfigMap 来进行更新。

img.png

点击配置编辑区域上方『开始编辑』按钮,即编辑配置文件,编辑完成后,点击『保存』按钮,随后点击左侧img_1.png按钮,选择指定配置文件和版本之后,点击『发布』按钮,即可将配置同步至 ConfigMap。修改 ConfigMap 配置后,重启 fluent-bit 生效。

2. 配置说明

假设你是采用的 DaemonSet 方式部署 Fluent-bit,如果你希望采集 Kubernetes 集群的 Nginx Ingress 日志和业务标准输出日志,那么你可以参考如下样例来配置你的 Fluent-bit。

2.1. fluent-bit.conf 配置

flient-bit.conf 存储层配置全局环境配置。

  1. [SERVICE]
  2. # 刷新output输出的时间间隔,单位秒
  3. Flush 1
  4.    # 日志级别,可设置为(error/warning/info/debug/trace)
  5. Log_Level info
  6.    # 是否守护运行
  7. Daemon off
  8. # 指定配置parse的配置文件
  9. Parsers_File parsers.conf
  10. # 是否启动HTTP Server
  11. HTTP_Server On
  12.    # HTTP Server 监听Host
  13. HTTP_Listen 0.0.0.0
  14. # HTTP Server 监听Port
  15. HTTP_Port 2020
  16. # 引用 input-kubernetes.conf
  17. @INCLUDE input-kubernetes.conf
  18. # 引用 filter-kubernetes.conf
  19. @INCLUDE filter-kubernetes.conf
  20. # 引用 filter-modify.conf
  21. @INCLUDE filter-modify.conf
  22. # 引用 output-kafka.conf
  23. @INCLUDE output-kafka.conf

2.2. parse.conf 配置

parse.conf 配置了解析 INPUT 的 parser,Parse 组件主要是将非结构化消息转换为结构化消息。

  1. [PARSER]
  2. Name nginx
  3. Format regex
  4. Regex ^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$
  5. Time_Key time
  6. Time_Format %d/%b/%Y:%H:%M:%S %z
  7. [PARSER]
  8. Name json
  9. Format json
  10. Time_Key time
  11. Time_Format %d/%b/%Y:%H:%M:%S %z
  12. [PARSER]
  13. Name docker
  14. Format json
  15. Time_Key time
  16. Time_Format %Y-%m-%dT%H:%M:%S.%L
  17. Time_Keep On
  18. # 与FILTER 阶段中Merge_Log=On 效果类似,解析log字段的json内容,但无法提到根层级
  19. #Decode_Field_As escaped_utf8 kubernetes do_next
  20. #Decode_Field_As json kubernetes
  21. [PARSER]
  22. # http://rubular.com/r/tjUt3Awgg4
  23. Name cri
  24. Format regex
  25. Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<message>.*)$
  26. Time_Key time
  27. Time_Format %Y-%m-%dT%H:%M:%S.%L%z
  28. [PARSER]
  29. Name syslog
  30. Format regex
  31. Regex ^\<(?<pri>[0-9]+)\>(?<time>[^ ]* {1,2}[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?(?:[^\:]*\:)? *(?<message>.*)$
  32. Time_Key time
  33. Time_Format %b %d %H:%M:%S

2.3. input-kubernetes.conf 配置

input-kubernetes.conf 配置 fluent-bit 具体采集哪些日志(Nginx Ingress、业务标准输出日志、节点系统日志等),以及采集的具体参数。

  1. # 采集ingress access日志,目前不区分access和error日志,后面通过filter插件分离
  2. [INPUT]
  3. # 使用 tail 插件
  4. Name tail
  5. # Tag 标识数据源,用于后续处理流程Filter,output时选择数据
  6. Tag ingress.*
  7. # Nginx Ingress 日志采集路径
  8. Path /var/log/containers/nginx-ingress-controller*.log
  9. # 使用 docker parser
  10. Parser docker
  11. # 指定监控的文件名及offsets持久化的数据库
  12. DB /var/log/flb_ingress.db
  13. # 指定tail插件使用的最大内存,如果达到限制,插件会停止采集,刷新数据后会恢复
  14. Mem_Buf_Limit 15MB
  15. # 初始buffer size
  16. Buffer_Chunk_Size 32k
  17. # 每个文件的最大buffer size
  18. Buffer_Max_Size 64k
  19. # 跳过长度大于 Buffer_Max_Size 的行,Skip_Long_Lines 若设为Off遇到超过长度的行会停止采集
  20. Skip_Long_Lines On
  21. # 监控日志文件 refresh 间隔
  22. Refresh_Interval 10
  23. # 采集文件没有数据库偏移位置记录的,从文件的头部开始读取,日志文件较大时会导致fluent内存占用率升高出现oomkill
  24. #Read_from_Head On
  25. # 采集ingress error日志,目前不区分access和error日志,后面通过filter插件分离
  26. [INPUT]
  27. Name tail
  28. Tag ingress_stderr.*
  29. Path /var/log/containers/nginx-ingress-controller*.log
  30. Parser docker
  31. DB /var/log/flb_ingress_stderr.db
  32. Mem_Buf_Limit 15MB
  33. Buffer_Chunk_Size 32k
  34. Buffer_Max_Size 64k
  35. Skip_Long_Lines On
  36. Refresh_Interval 10
  37. #Read_from_Head On
  38. # 采集容器stdout、stderr日志
  39. [INPUT]
  40. Name tail
  41. Tag kube.*
  42. Path /var/log/containers/*.log
  43. Exclude_path *fluent-bit-*,*mongo-*,*minio-*,*mysql-*
  44. Parser docker
  45. DB /var/log/flb_kube.db
  46. Mem_Buf_Limit 15MB
  47. Buffer_Chunk_Size 1MB
  48. Buffer_Max_Size 5MB
  49. Skip_Long_Lines On
  50. Refresh_Interval 10

2.4. filter-kubernetes.conf 配置

filter-kubernetes.conf 主要在 Kubernetes 环境下对采集的日志追加 Kubernetes 元数据,比如 kubernetes_hostkubernetes_namespace_namekubernetes_container_namekubernetes_pod_name 等。

  1. [FILTER]
  2. # 使用kubernetes过滤器
  3. Name kubernetes
  4. # 匹配ingress.*这个Tag对应的 INPUT
  5. Match ingress.*
  6. # kubernetes API Server 地址
  7. Kube_URL https://kubernetes.default.svc:443
  8. # kubernetes 上serviceAccount的CA证书路径
  9. Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
  10. # kubernetes 上serviceAccount的token路径
  11. Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
  12. # 当源日志来自tail插件,这个配置用于指定tail插件使用的前缀值
  13. Kube_Tag_Prefix ingress.var.log.containers.
  14. # Merge_Log=On 解析log字段的json内容,提取到根层级, 附加到Merge_Log_Key指定的字段上
  15. Merge_Log Off
  16. # 合并log字段后是否保持原始log字段
  17. Keep_Log Off
  18. # 允许Kubernetes Pod 建议预定义的解析器
  19. K8S-Logging.Parser Off
  20. # 允许Kubernetes Pod 从日志处理器中排除其日志
  21. K8S-Logging.Exclude Off
  22. # 是否在额外的元数据中包含 Kubernetes 资源标签信息
  23. Labels Off
  24. # 是否在额外的元数据中包括 Kubernetes 资源信息
  25. Annotations Off
  26. [FILTER]
  27. Name kubernetes
  28. Match ingress_stderr.*
  29. Kube_URL https://kubernetes.default.svc:443
  30. Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
  31. Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
  32. Kube_Tag_Prefix ingress_stderr.var.log.containers.
  33. Merge_Log Off
  34. Keep_Log Off
  35. K8S-Logging.Parser Off
  36. K8S-Logging.Exclude Off
  37. Labels Off
  38. Annotations Off
  39. [FILTER]
  40. Name kubernetes
  41. Match kube.*
  42. Kube_URL https://kubernetes.default.svc:443
  43. Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
  44. Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
  45. Kube_Tag_Prefix kube.var.log.containers.
  46. Merge_Log Off
  47. Keep_Log Off
  48. K8S-Logging.Parser Off
  49. K8S-Logging.Exclude Off
  50. Labels Off
  51. Annotations Off

2.5. filter-modify.conf 配置

filter-modify.conf 主要是修改和调整日志字段。

  1. # nest过滤器此处主要是对包含pod_name的日志,在其字段中追加kubernetes_前缀
  2. [FILTER]
  3. Name nest
  4. Match *
  5. Wildcard pod_name
  6. Operation lift
  7. Nested_under kubernetes
  8. Add_prefix kubernetes_
  9. # modify过滤器此处主要是调整部分kubernetes元数据字段名,同时追加一些额外的字段
  10. [FILTER]
  11. # 使用modify过滤器
  12. Name modify
  13. # 匹配所有INPUT
  14. Match *
  15. # 将stream字段重命名为_source_
  16. Rename stream _source_
  17. # 将log字段重命名为_log_
  18. Rename log _log_
  19. # 将kubernetes_host字段重命名为_node_name_
  20. Rename kubernetes_host _node_name_
  21. # 将kubernetes_namespace_name字段重命名为_namespace_
  22. Rename kubernetes_namespace_name _namespace_
  23. # 将kubernetes_container_name字段重命名为_container_name_
  24. Rename kubernetes_container_name _container_name_
  25. # 将kubernetes_pod_name字段重命名为_pod_name_
  26. Rename kubernetes_pod_name _pod_name_
  27. # 移除所有匹配kubernetes_的字段
  28. Remove_wildcard kubernetes_
  29. # 追加_cluster_配置,其值为fluent-bit daemonset中配置的CLUSTER_NAME环境变量
  30. Add _cluster_ ${CLUSTER_NAME}
  31. # 追加_log_agent_配置,其值为fluent-bit daemonset中配置的HOSTNAME环境变量
  32. Add _log_agent_ ${HOSTNAME}
  33. # 追加_node_ip_配置,其值为fluent-bit daemonset中配置的NODE_IP环境变量
  34. Add _node_ip_ ${NODE_IP}
  35. # grep过滤器此处是对ingress.*这个INPUT进行过滤,排除包含"stderr"的原始日志,以保证所有日志均是access
  36. [FILTER]
  37. Name grep
  38. Match ingress.*
  39. Exclude _source_ ^stderr$
  40. # grep过滤器此处是对ingress_stderr.*这个INPUT进行过滤,排除包含"stdout"的原始日志,以保证所有日志均是stderr
  41. [FILTER]
  42. Name grep
  43. Match ingress_stderr.*
  44. Exclude _source_ ^stdout$

2.6. output-kafka.conf 配置

output-kafka.conf 主要定义日志如何推送到 Kafka。

  1. # 此处kafka output插件将Nginx Ingress access日志推送到Kafka
  2. [OUTPUT]
  3. # 使用kafka插件
  4. Name kafka
  5. # 匹配Nginx access日志
  6. Match ingress.*
  7. # 指定Kafka Brokers地址
  8. Brokers ${KAFKA_BROKERS}
  9. # 指定Kafka topic,如果需要推送到多个topic,多个topic通过','分隔
  10. Topics ingress-stdout-logs-${CLUSTER_NAME}
  11. # 将Timestamp_Key设置为_time_,原默认值为@timestamp
  12. Timestamp_Key _time_
  13. # 指定时间戳转成成的时间字符串格式
  14. Timestamp_Format iso8601
  15. # 设置为false表示不限制重试次数
  16. Retry_Limit false
  17. # 当kafka结束空闲连接时,隐藏"Receive failed: Disconnected"报错
  18. rdkafka.log.connection.close false
  19. # Kafka生产者队列中总消息容量最大值,此处设置为10MB,producer buffer is not included in http://fluentbit.io/documentation/0.12/configuration/memory_usage.html#estimating
  20. rdkafka.queue.buffering.max.kbytes 10240
  21. # Kafka生产者在leader已成功收到的数据并得到确认后才发送下一条message。
  22. rdkafka.request.required.acks 1
  23. [OUTPUT]
  24. Name kafka
  25. Match ingress_stderr.*
  26. Brokers ${KAFKA_BROKERS}
  27. Topics ingress-stderr-logs-${CLUSTER_NAME}
  28. Timestamp_Key _time_
  29. Timestamp_Format iso8601
  30. Retry_Limit false
  31. rdkafka.log.connection.close false
  32. rdkafka.queue.buffering.max.kbytes 10240
  33. rdkafka.request.required.acks 1
  34. [OUTPUT]
  35. Name kafka
  36. Match kube.*
  37. Brokers ${KAFKA_BROKERS}
  38. Topics app-stdout-logs-${CLUSTER_NAME}
  39. Timestamp_Key _time_
  40. Timestamp_Format iso8601
  41. Retry_Limit false
  42. rdkafka.log.connection.close false
  43. rdkafka.queue.buffering.max.kbytes 10240
  44. rdkafka.request.required.acks 1