Fluentd/FluentBit K8s日志采集方案介绍

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: Fluent Bit 是一个开源的多平台日志采集器,旨在打造日志采集处理和分发的通用利器。2014 年,Fluentd 团队预测对于嵌入式 Linux 和 Gateways 等受约束的环境,需要更轻量级的日志处理器,于是便开发了Fluent Bit,并把该项目建设成为Fluentd 生态系统的一部分。

Fluentd/FluentBit简介

Fluentd 是一个开源的可观测数据采集器,致力于建设统一的日志采集层,简化用户的数据接入体验。

Fluent Bit 是一个开源的多平台日志采集器,旨在打造日志采集处理和分发的通用利器。2014 年,Fluentd 团队预测对于嵌入式 Linux 和 Gateways 等受约束的环境,需要更轻量级的日志处理器,于是便开发了Fluent Bit,并把该项目建设成为Fluentd 生态系统的一部分。

两者之间的比较:

Fluentd

Fluent Bit

适用场景

容器/服务器

嵌入式 Linux/容器/服务器

开发语言

C & Ruby

C

初始启动内存

~40MB

~650KB

性能

高性能

高性能

依赖

基于 Ruby Gem 构建,依赖gem。

零依赖,除非一些特殊要求的插件。

插件

1000+插件

70左右

协议

Apache License v2.0

Apache License v2.0

Kubernetes采集方案

FluentD、Fluent Bit官方都提供了Kubernetes的部署方案,主要推荐以Deamonset方式部署。

Fluentd

模版仓库:https://github.com/fluent/fluentd-kubernetes-daemonset 该仓库根据数据采集的输出目的,提供了专有的镜像跟部署模版库。

### 镜像

$ll fluentd-kubernetes-daemonset/docker-image/v1.14/

total 76

drwxr-xr-x 20 root root 4096 Jun 30 09:13 arm64

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-azureblob

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-cloudwatch

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-elasticsearch6

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-elasticsearch7

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-forward

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-gcs

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-graylog

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-kafka

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-kafka2

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-kinesis

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-logentries

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-loggly

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-logzio

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-opensearch

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-papertrail

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-s3

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-stackdriver

drwxr-xr-x  5 root root 4096 Jun 30 09:13 debian-syslog


### 模版

[root@yemo_hongkong fluent]$ll fluentd-kubernetes-daemonset/

-rw-r--r--  1 root root  3571 Jun 30 09:13 fluentd-daemonset-azureblob.yaml

-rw-r--r--  1 root root  2559 Jun 30 09:13 fluentd-daemonset-cloudwatch-rbac.yaml

-rw-r--r--  1 root root  3239 Jun 30 09:13 fluentd-daemonset-elasticsearch-rbac.yaml

-rw-r--r--  1 root root  2845 Jun 30 09:13 fluentd-daemonset-elasticsearch.yaml

-rw-r--r--  1 root root  1872 Jun 30 09:13 fluentd-daemonset-forward.yaml

-rw-r--r--  1 root root  1792 Jun 30 09:13 fluentd-daemonset-gcs.yaml

-rw-r--r--  1 root root  2952 Jun 30 09:13 fluentd-daemonset-graylog-rbac.yaml

-rw-r--r--  1 root root  1960 Jun 30 09:13 fluentd-daemonset-logentries.yaml

-rw-r--r--  1 root root  2999 Jun 30 09:13 fluentd-daemonset-loggly-rbac.yaml

-rw-r--r--  1 root root  2390 Jun 30 09:13 fluentd-daemonset-loggly.yaml

-rw-r--r--  1 root root  3236 Jun 30 09:13 fluentd-daemonset-opensearch.yaml

-rw-r--r--  1 root root  2859 Jun 30 09:13 fluentd-daemonset-papertrail.yaml

-rw-r--r--  1 root root  2563 Jun 30 09:13 fluentd-daemonset-syslog.yaml

下面以Kafka Docker镜像详细说明下:

  • fluent.conf: 采集输出目录的配置,例如Kafka就是brokers地址、Topic等信息。
  • kubernetes.conf: k8s的采集配置。包含了tail input插件及kubernetes_metadata filter插件。
  • tail_container_parse.conf: 标准输出的解析方式,默认json parser,适用于Docker场景;如果是containerd或者CRI-O场景,需要设置为cri parser。
  • prometheus.conf: fluentd的prometheus监控插件。
  • systemd.conf: systemd-journal的采集插件配置。

# 创建configmap

kubectl create configmap fluentd-conf --from-file=kubernetes.conf --namespace=kube-system


# 更改Fluentd部署yaml,添加挂载部分的配置项。

     containers:

     - name: fluentd

       image: fluent/fluentd:v1.2-debian

       resources:

         limits:

           memory: 200Mi

         requests:

           cpu: 100m

           memory: 200Mi

       volumeMounts:

       - name: config-volume

         mountPath: /fluentd/etc/kubernetes.conf

         subPath: kubernetes.conf

       - name: varlog

         mountPath: /var/log

       - name: varlibdockercontainers

         mountPath: /var/lib/docker/containers

         readOnly: true

     terminationGracePeriodSeconds: 30

     volumes:

     - name: config-volume

       configMap:

         name: fluentd-conf

     - name: varlog

       hostPath:

         path: /var/log

     - name: varlibdockercontainers

       hostPath:

         path: /var/lib/docker/containers

Fluent Bit

模版仓库:https://github.com/fluent/fluent-bit-kubernetes-logging

Fluent Bit是一个轻量级且可扩展的日志处理器,在Kubernetes场景下支持:

  • 从文件系统或 Systemd/Journaled采集日志。
  • 可以通过关联Kubernetes元数据富化日志。
  • 支持采集到第三方存储服务。例如 Elasticsearch、Kafka等。


Fluent Bit以Daemonset 运行时,会通过API Server获取Pod及容器的信息(例如,Pod信息、Container信息、Labels等)。

部署方式(以Kafka为例):

  • 配置ConfigMap
  • ConfigMap fluent-bit-config中包含了采集配置文件fluent-bit.conf、input-kubernetes.conf、output-kafka.conf等。

$ kubectl create -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/output/kafka/fluent-bit-configmap.yaml

  • 以Daemonset方式部署Fluent Bit,并挂在上述的ConfigMap到/fluent-bit/etc/目录。

$ kubectl create -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/output/kafka/fluent-bit-ds.yaml

同样的,Fluent Bit提供的模版默认假定日志由 Docker 接口标准格式化。如果对于CRI的场景,需要手动调整解析器。

# CRI Parser

[PARSER]

   # http://rubular.com/r/tjUt3Awgg4

   Name cri

   Format regex

   Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<message>.*)$

   Time_Key    time

   Time_Format %Y-%m-%dT%H:%M:%S.%L%z

   

[INPUT]

   Name tail

   Path /var/log/containers/*.log

   Parser cri

   Tag kube.*

   Mem_Buf_Limit 5MB

   Skip_Long_Lines On

鉴权问题

Fluentd/FluentBIt 将从用户应用程序和集群组件(如 kube-apiserver 和 kube-scheduler)收集日志,需要赋予一些K8s的权限。两者的实现方式类似,这里以FluentBIt为例进行说明。

  • 首先创建ServiceAccount

apiVersion: v1

kind: ServiceAccount

metadata:

 name: fluent-bit

 namespace: logging

  • 为了保证FluentBit在K8s集群中有read、list、watch的全新,需要授予一些权限,通过创建ClusterRole实现。

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRole

metadata:

 name: fluent-bit-read

rules:

- apiGroups: [""]

 resources:

 - namespaces

 - pods

 verbs: ["get", "list", "watch"]

  • 绑定ServiceAccount与ClusterRole

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRoleBinding

metadata:

 name: fluent-bit-read

roleRef:

 apiGroup: rbac.authorization.k8s.io

 kind: ClusterRole

 name: fluent-bit-read

subjects:

- kind: ServiceAccount

 name: fluent-bit

 namespace: logging

  • Fluent Bit Daemonset yaml中通过serviceAccountName关联

serviceAccountName: fluent-bit

总结

对于Fluentd/Fluent Bit官方都建议采用Daemonset部署,都是通过ConfigMap来管理采集配置,Fluentd/Fluent Bit容器挂载ConfigMap来进行配置读取。不同的是,Fluentd提供的模版集成度更高,对于每种输出场景,都有定制的镜像,一般情况用户只需要注入一些环境变量即可完成采集。

此外,两者也都提供了Docker、CRI的标准输出采集支持,但是都需要手动修改模版才可以。

Fluentd/Fluent Bit官方虽然提供了一些K8s的采集部署方案,但是总体来说自动化程度不高,操作也比较繁琐。所以也就催生出了各类Operator,比较有名的是Fluent Operator、Logging Operator,后续文章会展开进一步介绍。

参考文档

Kubernetes Fluentd官方文档

Kubernetes FluentBit官方文档

Cluster-level Logging in Kubernetes with Fluentd

关于iLogtail

iLogtail作为阿里云SLS提供的可观测数据采集器,可以运行在服务器、容器、K8s、嵌入式等多种环境,支持采集数百种可观测数据(日志、监控、Trace、事件等),已经有千万级的安装量。目前,iLogtail已正式开源,欢迎使用及参与共建。

GitHub:https://github.com/alibaba/ilogtail

社区版文档:https://ilogtail.gitbook.io/ilogtail-docs/about/readme

企业版官网:https://help.aliyun.com/document_detail/65018.html

钉钉群:iLogtail社区

目录
相关文章
|
5天前
|
Kubernetes 监控 Cloud Native
Kubernetes自动伸缩方案的终极指南
【4月更文挑战第18天】
29 0
Kubernetes自动伸缩方案的终极指南
|
5天前
|
Kubernetes Perl 容器
K8s查看集群 状态事件描述以及Pod日志信息
K8s查看集群 状态事件描述以及Pod日志信息
55 3
|
5天前
|
Prometheus 监控 Kubernetes
Kubernetes 集群监控与日志管理实践
【2月更文挑战第29天】 在微服务架构日益普及的当下,Kubernetes 已成为容器编排的事实标准。然而,随着集群规模的扩大和业务复杂度的提升,有效的监控和日志管理变得至关重要。本文将探讨构建高效 Kubernetes 集群监控系统的策略,以及实施日志聚合和分析的最佳实践。通过引入如 Prometheus 和 Fluentd 等开源工具,我们旨在为运维专家提供一套完整的解决方案,以保障系统的稳定性和可靠性。
|
5天前
|
存储 数据采集 Kubernetes
一文详解K8s环境下Job类日志采集方案
本文介绍了K8s中Job和Cronjob控制器用于非常驻容器编排的场景,以及Job容器的特点:增删频率高、生命周期短和突发并发大。文章重点讨论了Job日志采集的关键考虑点,包括容器发现速度、开始采集延时和弹性支持,并对比了5种采集方案:DaemonSet采集、Sidecar采集、ECI采集、同容器采集和独立存储采集。对于短生命周期Job,建议使用Sidecar或ECI采集,通过调整参数确保数据完整性。对于突发大量Job,需要关注服务端资源限制和采集容器的资源调整。文章总结了不同场景下的推荐采集方案,并指出iLogtail和SLS未来可能的优化方向。
|
5天前
|
Prometheus 监控 Kubernetes
监控 Kubernetes 集群证书过期时间的三种方案
监控 Kubernetes 集群证书过期时间的三种方案
|
5天前
|
存储 Kubernetes 调度
K8S常见的持久化(存储)方案用法详解
K8S常见的持久化(存储)方案用法详解
|
5天前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与日志管理实践
【2月更文挑战第31天】 在微服务架构日益普及的今天,容器编排工具如Kubernetes已成为部署、管理和扩展容器化应用的关键平台。然而,随着集群规模的扩大和业务复杂性的增加,如何有效监控集群状态、及时响应系统异常,以及管理海量日志信息成为了运维人员面临的重要挑战。本文将深入探讨 Kubernetes 集群监控的最佳实践和日志管理的高效策略,旨在为运维团队提供一套系统的解决思路和操作指南。
37 0
|
5天前
|
Web App开发 监控 应用服务中间件
全新架构!日志服务 SLS 自研免登录方案发布
全新架构!日志服务 SLS 自研免登录方案发布
87532 7
|
5天前
|
消息中间件 设计模式 Java
spdlog中的异步日志方案
spdlog中的异步日志方案
268 2
|
5天前
|
存储 Kubernetes 安全
加密 K8s Secrets 的几种方案
加密 K8s Secrets 的几种方案

相关产品

  • 日志服务
  • http://www.vxiaotou.com