Fluentbit
| Fiche express | |
|---|---|
| Type | Agent de collecte et de transport de logs |
| Écosystème | Projet Fluentd, hébergé par la CNCF |
| Pendant plus lourd | Fluentd (même modèle de pipeline, agrégateur central) |
| Déploiement K8s typique | DaemonSet (un pod par nœud) |
| Voir aussi | Loki · Grafana · OpenTelemetry |
Fluent Bit est un agent de collecte de logs léger du projet Fluentd (hébergé par la CNCF), écrit en C pur sans dépendance externe : un binaire statique de quelques Mo, taillé pour tourner sur chaque nœud d'un cluster ou dans des environnements contraints (edge, IoT) sans peser sur les ressources allouées aux workloads applicatifs. Il partage son modèle de pipeline et sa philosophie avec son grand frère Fluentd, plus riche en fonctionnalités mais nettement plus lourd — les deux se combinent souvent plutôt que de s'exclure : Fluent Bit en agent léger sur chaque nœud, Fluentd en agrégateur central qui reçoit, enrichit et route vers le backend final.
| Caractéristique | Fluentd | Fluent Bit |
|---|---|---|
| Langage | Ruby + C | C pur |
| Empreinte mémoire | ~40 Mo et plus | de l'ordre du Mo |
| Plugins | Environ un millier (gems Ruby) | Une centaine, intégrés au binaire |
| Extensibilité | Plugins Ruby | Plugins C, Go, scripts Lua, WASM |
| Dépendances | Runtime Ruby | Aucune |
| Rôle typique | Agrégateur central | Agent / forwarder sur chaque nœud |
Le pipeline commun
Fluentd et Fluent Bit partagent le même modèle de traitement d'un événement de log : celui-ci entre par un input, est décodé par un parser (texte brut → champs structurés), enrichi ou filtré par des filters, mis en tampon par un buffer, puis aiguillé selon son tag vers le ou les outputs finaux. Un événement porte toujours trois éléments : un tag hiérarchique servant au routage (par exemple kube.var.log.containers.app), un timestamp, et un record (le contenu, en paires clé/valeur).
Fluent Bit en pratique
Pipeline et formats de configuration
Le pipeline se déclare via des sections INPUT / FILTER / OUTPUT, au format classique .conf ou, sur les versions récentes, en YAML :
[SERVICE]
Flush 5
Log_Level info
Parsers_File parsers.conf
storage.path /var/log/flb-storage/
[INPUT]
Name tail
Path /var/log/containers/*.log
Parser cri
Tag kube.*
Mem_Buf_Limit 5MB
DB /var/log/flb_kube.db
[FILTER]
Name kubernetes
Match kube.*
Kube_URL https://kubernetes.default.svc:443
Merge_Log On
K8S-Logging.Exclude On
[OUTPUT]
Name forward
Match *
Host fluentd.logging.svc
Port 24224
L'équivalent YAML, plus lisible sur des pipelines complexes à plusieurs inputs/outputs :
service:
flush: 5
log_level: info
parsers_file: parsers.conf
pipeline:
inputs:
- name: tail
path: /var/log/containers/*.log
parser: cri
tag: kube.*
mem_buf_limit: 5MB
db: /var/log/flb_kube.db
filters:
- name: kubernetes
match: kube.*
merge_log: on
outputs:
- name: forward
match: '*'
host: fluentd.logging.svc
port: 24224
Buffer et persistance
Fluent Bit bufferise en mémoire par défaut, ce qui est rapide mais borné par Mem_Buf_Limit : au-delà, l'input est mis en pause (backpressure) pour ne pas saturer la RAM du nœud, quitte à ralentir la collecte. Activer storage.type filesystem sur un input bascule sa persistance sur disque, ce qui évite la perte de lignes en cas de redémarrage ou de pic de charge côté output, au prix d'un stockage local à surveiller.
Le cas Kubernetes
C'est l'usage le plus répandu de Fluent Bit : déployé en DaemonSet (un pod par nœud), chaque instance monte en lecture seule /var/log/containers/ et /var/log/pods/ du nœud hôte, et suit ces fichiers via un input tail. Le parser cri décode le format écrit par containerd/CRI-O (), puis le filtre kubernetes interroge l'API server pour enrichir chaque ligne avec les métadonnées du pod d'origine (namespace, labels, annotations, nom du conteneur) avant émission.
Quelques points de vigilance récurrents sur ce déploiement :
- Position de lecture — la base
DBde l'inputtailretient l'offset lu, pour reprendre après un redémarrage sans relire ni perdre de lignes. - Multiline — une stack trace Java ou Python s'étale sur plusieurs lignes physiques ; sans un parser/filtre
multiline, chaque ligne remonte comme un événement séparé, rendant le log illisible en aval. - Rotation — containerd applique sa propre rotation de fichiers ; Fluent Bit gère la réouverture, mais un
Rotate_Waitmal calé peut faire perdre les toutes dernières lignes avant rotation. - RBAC — le filtre
kubernetesa besoin d'un ServiceAccount autorisé à lire les pods sur l'API server ; son absence se traduit par des logs non enrichis plutôt que par une erreur bloquante.
Architecture combinée recommandée
[Nœud 1] [Nœud 2] [Nœud N]
Fluent Bit (DS) Fluent Bit (DS) Fluent Bit (DS)
| | |
+-------------------+-------------------+
| (protocole forward)
Fluentd (agrégateur)
- enrichissement, buffer disque, multi-sortie
|
+---------------+----------------+
| | |
Loki / ELK S3 (archivage) Kafka (streaming)
Cette répartition limite le nombre de connexions frappant directement le backend final (Fluent Bit ne parle jamais directement à Elasticsearch depuis N nœuds), tout en gardant la logique de parsing lourd et de routage multi-destination centralisée sur un nombre restreint d'instances Fluentd.
S'intégrer à une chaîne d'observabilité existante
Fluent Bit dispose d'un output natif vers Loki : dans une pile déjà construite autour de Grafana et Loki pour les métriques/logs, il peut pousser directement les lignes de log étiquetées (namespace, pod, labels Kubernetes), sans passer nécessairement par un Fluentd intermédiaire si le volume et la complexité de routage restent modérés. Sur un périmètre observabilité plus large englobant aussi traces et métriques applicatives, voir OpenTelemetry : la collecte de logs et le Collector OpenTelemetry poursuivent un objectif de convergence proche de celui de Fluent Bit, avec un écosystème et des standards différents (à comparer selon le reste de la chaîne déjà en place).
Choisir entre Fluentd et Fluent Bit
| Besoin | Recommandation |
|---|---|
| Agent sur chaque nœud Kubernetes (DaemonSet) | Fluent Bit |
| Contrainte mémoire/CPU forte | Fluent Bit |
| Agrégation centrale, routage multi-destination complexe | Fluentd |
| Plugin très spécifique, écosystème large | Fluentd |
| Transformation personnalisée en Ruby | Fluentd |
Voir aussi
- Loki — backend de logs souvent ciblé en output direct depuis Fluent Bit
- Grafana — visualisation des logs collectés
- OpenTelemetry — convergence logs/métriques/traces, à comparer selon le périmètre visé