Zum Hauptinhalt springen
  1. Beiträge/
  2. Kleines Homelab/
  3. k3s-prod: Kubernetes Cluster Konfiguration und Anwendungsbereitstellung/

Fluent Bit

Inhaltsverzeichnis

Fluent Bit
#

Fluent Bit sammelt Logs auf jedem Cluster-Knoten und liefert sie an OpenObserve. Es ist der Einlieferungsteil des Log-Stapels; ausgewertet wird dort.

Quelle
#

Helm-Chart fluent-bit-collector aus der OCI-Registry ghcr.io/fluent/helm-charts.

Dokumentation
#

Funktion
#

Drei Eingänge, drei Ausgänge, ein Ziel:

Eingang Quelle Tag
tail /var/log/containers/*.log kube.<namespace>.<pod>.<container>
kubernetes_events Kubernetes-API, alle 5 s k8s_events
systemd Journal des Hosts host.*

Container-Logs werden über einen Prozessor mit Kubernetes-Metadaten angereichert — Namespace, Pod, Container, Labels. Die Abfrage läuft dabei gegen das Kubelet des eigenen Knotens und nicht gegen den API-Server. Auf einem Cluster mit vielen Pods ist das der Unterschied zwischen einer lokalen Abfrage je Knoten und einer Dauerlast auf dem API-Server.

Jeder Ausgang schickt seinen Tag-Bereich per HTTPS an die JSON-Einlieferungsschnittstelle von OpenObserve.

Lokale Anpassungen
#

Die Konfiguration erfolgt vollständig über values.yaml.

Zwischenspeicherung auf Platte
#

storage.type: filesystem mit Ablage unter /var/fluent-bit/data auf dem Host. Das ist der wichtigste Unterschied zur Standardkonfiguration: Ist OpenObserve nicht erreichbar, laufen die Daten auf Platte auf, statt im Arbeitsspeicherpuffer verloren zu gehen. Der Fortschritt je Datei steht in einer tail.db, sodass ein Neustart nicht von vorn beginnt und nichts doppelt liefert.

Einstellungen des tail-Eingangs
#

Einstellung Wert Grund
rotate_wait 30 s Nach einer Rotation werden die Reste noch ausgelesen
refresh_interval 10 s Entlastet die Inotify-Liste bei schnellen Pod-Wechseln
ignore_older 5 m Beim Start werden alte Überbleibsel nicht neu eingelesen
mem_buf_limit 10 M Begrenzt den Arbeitsspeicher je Eingang
multiline.parser cri Setzt vom Laufzeitsystem zerlegte Zeilen wieder zusammen

mem_buf_limit ist der Schutz davor, dass ein Pod mit ausuferndem Logaufkommen den Knoten in den Speichermangel treibt.

Host-Einhängungen
#

Pfad Zweck
/var/log Container-Logs und Journal
/run/log/journal Flüchtiges Journal
/etc/machine-id Ordnet Journal-Einträge dem Knoten zu

Weiteres
#

  • RBAC: Zusätzlich zu den Chart-Vorgaben Leserechte auf events, ohne die der Ereignis-Eingang nichts liefert.
  • NODE_NAME: Wird per Downward API gesetzt und von einem modify-Filter als Feld k8s_node_name an jede Container-Logzeile gehängt.
  • keel: Die Annotationen lassen das Image automatisch aktualisieren.
  • Zugangsdaten: Ziel-Host und die Anmeldedaten für OpenObserve stehen in den outputs-Blöcken der values.yaml.

Installation
#

Bereitgestellt über ArgoCD mit Kustomize und Helm. Von Hand:

1kubectl kustomize --enable-helm apps/fluent-bit | kubectl apply -n fluent-bit -f -

Abhängigkeiten
#

  • OpenObserve als Ziel. Ist es nicht erreichbar, puffert Fluent Bit auf Platte, bis der Platz ausgeht.
  • Zugriff auf das Kubelet jedes Knotens (Port 10250) für die Metadaten.
Fabrice Kirchner
Autor
Fabrice Kirchner
stolzer Vater, Nerd, Admin