PerfectScalePerfectScale

PerfectScale

Kubernetes DaemonSet: Tutorial, Use Cases und Best Practices

Diese Seite ist auch in English, Español, Français, Italiano, 日本語 und Português verfügbar.

Tania Duggal
By Tania Duggal
Oct 14, 202615 min read

Was ist ein Kubernetes DaemonSet?

Ein DaemonSet ist ein zentraler Kubernetes-Workload-Controller, der sicherstellt, dass eine Kopie eines bestimmten Pods auf allen (oder ausgewählten) Nodes eines Clusters läuft. Wird dem Cluster ein neuer Node hinzugefügt, startet das DaemonSet darauf automatisch einen Pod; wird ein Node entfernt, wird der zugehörige Pod per Garbage Collection bereinigt.

Im Gegensatz zu Deployments, die eine bestimmte Anzahl von Replikaten über das gesamte Cluster hinweg aufrechterhalten, konzentrieren sich DaemonSets auf Abdeckung auf Node-Ebene und koppeln das Pod-Scheduling an die Node-Topologie des Clusters. So ist garantiert, dass bestimmte Workloads – etwa Monitoring-Agents oder Log-Collectors – gleichmäßig und konsistent über die Infrastruktur verteilt werden und überall dieselbe Abdeckung und Funktionalität bieten. DaemonSets sind unverzichtbar für Workloads, die aus Gründen der betrieblichen Konsistenz auf allen oder auf bestimmten Nodes laufen müssen.

Hier ein Beispiel für ein YAML-Manifest eines DaemonSets:

Das folgende Beispiel definiert ein DaemonSet, das einen fluentd-Logging-Agent im Cluster ausführt:

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-logging
namespace: kube-system
spec:
selector:
matchLabels:
name: fluentd-logging
template:
metadata:
labels:
name: fluentd-logging
spec:
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
containers:
- name: fluentd
image: quay.io/fluentd_elasticsearch/fluentd:v5.0.1

Typische Use Cases für DaemonSets:

  • Log-Erfassung: Agents wie Fluentd, Filebeat oder Logstash laufen auf jedem Node, um Container- und Systemlogs zu sammeln und weiterzuleiten.
  • Node-Monitoring: Tools wie Prometheus Node Exporter oder der Datadog Agent werden auf jedem Node bereitgestellt, um Metriken zu Zustand, Ressourcen und Workloads zu erfassen.
  • Security- und Observability-Agents: Intrusion-Detection-, Tracing- oder Observability-Agents laufen auf allen Nodes und gewährleisten eine konsistente Cluster-Abdeckung.
  • Kubernetes Device Plugins: Device Plugins laufen auf Nodes mit spezieller Hardware wie GPUs oder FPGAs, damit Kubernetes diese Ressourcen Workloads zur Verfügung stellen kann.

Dieser Artikel ist Teil einer Serie über Kubernetes-Objekte.

In diesem Artikel:

Wie funktioniert ein DaemonSet?

Diagramm zur Funktionsweise eines DaemonSets: Der DaemonSet-Controller prüft jeden Node anhand seines Node-Selektors und seiner Affinity-Regeln, führt auf passenden Nodes einen Pod aus, überspringt Nodes mit nicht passenden Labels und erstellt auf einem neuen Node automatisch einen Pod

Wird ein DaemonSet erstellt, bewertet die Kubernetes Control Plane jeden Node anhand der Scheduling-Kriterien des DaemonSets. Passt ein Node, erstellt der DaemonSet-Controller den angegebenen Pod auf diesem Node. Wird der Node später aus dem Cluster entfernt, wird sein DaemonSet-Pod per Garbage Collection bereinigt.

Ändern sich die Labels eines Nodes, sodass er nicht mehr zum Node-Selektor oder zu den Affinity-Regeln des DaemonSets passt, löscht der Controller den Pod. Der Controller fügt automatisch eine Toleration für den Taint node.kubernetes.io/unschedulable hinzu, sodass DaemonSet-Pods auf abgesperrten (cordoned) Nodes weiterlaufen und sogar darauf eingeplant werden können. Dieser Mechanismus sorgt dafür, dass DaemonSet-Pods dem Zustand des Clusters eng folgen und sich ohne Eingriff der Nutzer an Node-Änderungen anpassen.

DaemonSets unterstützen erweiterte Scheduling-Funktionen wie Node Affinity, Tolerations und Selektoren, mit denen Administratoren gezielt bestimmte Node-Gruppen ansteuern können. So lassen sich DaemonSets etwa auf Nodes mit einem bestimmten Label oder mit spezieller Hardware beschränken. Wenn sich das Cluster verändert (Nodes werden hinzugefügt, neu gelabelt oder gelöscht), gleicht der DaemonSet-Controller den Ist-Zustand kontinuierlich mit dem Soll-Zustand ab und stellt sicher, dass Pods immer dort laufen, wo sie gebraucht werden.

Use Cases für Kubernetes DaemonSets

Log-Erfassung

Die Log-Erfassung ist ein klassischer Use Case für DaemonSets. Zentralisierte Logging-Lösungen benötigen häufig einen Agent auf jedem Node, um Logs von Containern und Systemkomponenten zu sammeln und weiterzuleiten. Indem Administratoren einen Log-Collector wie Fluentd oder Filebeat als DaemonSet bereitstellen, stellen sie sicher, dass jeder Node abgedeckt ist – ohne Agents manuell zu deployen oder sich Sorgen zu machen, dass neuen Nodes die Logging-Komponente fehlt. Dieser Ansatz vereinfacht das Log-Management und sorgt für Konsistenz im gesamten Cluster.

Der Einsatz von DaemonSets für die Log-Erfassung vereinfacht auch das Skalieren von Clustern. Treten neue Nodes bei, stellt der DaemonSet-Controller den Logging-Agent automatisch bereit, wodurch manuelle Schritte entfallen und das Risiko fehlender Logs von neu hinzugefügter Infrastruktur sinkt. Diese automatisierte Bereitstellung auf Node-Ebene macht DaemonSets zur bevorzugten Methode für clusterweite Log-Aggregation in Kubernetes-Umgebungen und unterstützt Compliance- und Troubleshooting-Initiativen.

Verwandte Inhalte: Lesen Sie unseren Leitfaden zu Kubernetes-Logs

Node-Monitoring

Node-Monitoring ist ein weiteres Szenario, in dem DaemonSets ihre Stärken ausspielen. Monitoring-Tools wie Prometheus Node Exporter oder der Datadog Agent werden typischerweise als DaemonSets bereitgestellt, um Metriken zu Node-Zustand, Ressourcennutzung und laufenden Workloads zu erfassen. Über DaemonSets werden diese Agents automatisch auf jeden Node verteilt und bieten umfassende Transparenz über den Betriebszustand des Clusters.

Die automatische Bereitstellung über DaemonSets stellt sicher, dass das Monitoring auch bei Cluster-Änderungen konsistent bleibt. Werden Nodes hinzugefügt oder entfernt, passt der DaemonSet-Controller die Bereitstellung des Monitoring-Agents entsprechend an. Dieses dynamische Management vereinfacht den Cluster-Betrieb und stellt sicher, dass Administratoren jederzeit aktuelle Metriken für jeden Node haben – entscheidend für effektive Kapazitätsplanung und Incident Response.

Verwandte Inhalte: Lesen Sie unseren Leitfaden zu Kubernetes-Monitoring

Security- und Observability-Agents

Security- und Observability-Agents, etwa Intrusion-Detection-Systeme oder Collector für Distributed Tracing, müssen oft auf jedem Node laufen, um das gesamte Cluster abzudecken. Mit DaemonSets lassen sich diese Agents unkompliziert und einheitlich bereitstellen, sodass der gesamte Traffic und alle Aktivitäten auf Bedrohungen oder Performance-Engpässe überwacht werden. Diese einheitliche Bereitstellung ist entscheidend für eine sichere und beobachtbare Kubernetes-Umgebung.

Der Einsatz von DaemonSets für Security-Agents unterstützt zudem Compliance-Anforderungen, da garantiert kein Node unüberwacht bleibt. Entwickelt sich das Cluster weiter, passt sich das DaemonSet automatisch an und hält die Security-Abdeckung ohne manuelle Eingriffe aufrecht. So halten Security- und Observability-Maßnahmen mit der Dynamik von Kubernetes-Clustern Schritt, und betriebliche Lücken und Risiken werden reduziert.

Kubernetes Device Plugins

Kubernetes Device Plugins ermöglichen es, spezielle Hardware wie GPUs oder FPGAs für Pods verfügbar zu machen. Diese Plugins werden typischerweise als DaemonSets bereitgestellt, damit jeder Node mit der entsprechenden Hardware den nötigen Device-Plugin-Pod ausführt. So kann Kubernetes Workloads einplanen, die bestimmte Hardware-Ressourcen benötigen – etwa für Machine Learning oder Hardware-Beschleunigung.

Die Bereitstellung von Device Plugins als DaemonSets garantiert, dass Hardware-Ressourcen auf allen relevanten Nodes konsistent verwaltet werden. Kommen neue Nodes mit spezieller Hardware hinzu, stellt der DaemonSet-Controller das entsprechende Device Plugin automatisch bereit und macht die Ressource für den Scheduler verfügbar. Dieser automatisierte Ansatz vereinfacht den Cluster-Betrieb und maximiert die Auslastung spezialisierter Hardware.

Kubernetes DaemonSet vs. Deployment

DaemonSets und Deployments verwalten beide Pods in Kubernetes, unterscheiden sich aber deutlich in Zweck und Verhalten. Deployments sind darauf ausgelegt, eine festgelegte Anzahl von Pod-Replikaten aufrechtzuerhalten und über die verfügbaren Nodes zu verteilen, um Hochverfügbarkeit und Lastverteilung zu erreichen. Deployments eignen sich daher für zustandslose Anwendungen, bei denen es primär um Redundanz und Skalierbarkeit geht – unabhängig davon, wie viele Nodes das Cluster hat.

DaemonSets stellen sicher, dass genau ein Pod (oder eine festgelegte Anzahl) auf jedem Node oder auf einer Teilmenge von Nodes läuft. Das ist ideal für Workloads, die auf jedem Node präsent sein müssen, etwa Monitoring-Agents, Log-Collectors oder Device Plugins. DaemonSets passen sich automatisch an, wenn Nodes hinzugefügt oder entfernt werden, während Deployments manuell skaliert werden müssen, um Node-Änderungen abzubilden. Diesen Unterschied zu verstehen ist entscheidend, um den richtigen Controller für den jeweiligen Workload in Kubernetes zu wählen.

Aspekt Deployment DaemonSet
Hauptzweck Führt eine festgelegte Anzahl von Replikaten einer Anwendung aus Führt auf jedem Node oder auf ausgewählten Nodes einen Pod aus
Skalierungsverhalten Manuelle Skalierung oder Autoscaling anhand der Replikatanzahl Passt sich automatisch an, wenn Nodes hinzugefügt oder entfernt werden
Ideal für Zustandslose Apps, APIs, Webservices, skalierbare Workloads Monitoring-Agents, Log-Collectors, Dienste auf Node-Ebene
Pod-Platzierung Der Kubernetes-Scheduler verteilt Pods über die Nodes Stellt sicher, dass Pods auf jedem passenden Node platziert werden

Kubernetes-DaemonSet-Tutorial

Dieses Tutorial erklärt, wie Sie ein DaemonSet erstellen und damit arbeiten. Es basiert auf der Kubernetes-Dokumentation.

1. Ein Kubernetes DaemonSet erstellen

Um ein Kubernetes DaemonSet zu erstellen, definieren Sie es in einem YAML-Manifest mit apiVersion: apps/v1 und kind: DaemonSet. Das Manifest muss Standard-Kubernetes-Felder wie metadata und spec enthalten sowie ein Pod-Template unter .spec.template. Der .spec.selector des DaemonSets muss mit den Labels des Pod-Templates übereinstimmen; nach der Erstellung des DaemonSets kann dieser Selektor nicht mehr geändert werden. Kubernetes verlangt außerdem, dass die Restart-Policy des Pods auf Always gesetzt ist – entweder explizit oder über die Standardeinstellung.

Das folgende Manifest erstellt beispielsweise ein einfaches DaemonSet, das auf jedem passenden Node einen Container ausführt:

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: example-daemonset
spec:
selector:
matchLabels:
app.kubernetes.io/name: example
template:
metadata:
labels:
app.kubernetes.io/name: example
spec:
containers:
- name: pause
image: registry.k8s.io/pause

Administratoren können das Pod-Template um Optionen wie Resource Requests, Volume Mounts, Tolerations, Node-Selektoren und Node Affinity erweitern. Diese Einstellungen bestimmen, wie die DaemonSet-Pods laufen und – sofern Scheduling-Einschränkungen definiert sind – welche Nodes als Host infrage kommen. Die Kubernetes-Dokumentation zeigt ein einfaches Beispiel, in dem das DaemonSet auf jedem passenden Node einen Pod einplant.

2. Ein DaemonSet bereitstellen

Sobald das DaemonSet-Manifest erstellt ist, stellen Sie es mit kubectl apply im Cluster bereit. Ist das Manifest lokal als daemonset.yaml gespeichert, führen Sie aus:

Terminal window
kubectl apply -f daemonset.yaml

Die Kubernetes-Dokumentation zeigt auch, wie sich ein DaemonSet direkt aus einem gehosteten YAML-Manifest anwenden lässt. Zum Beispiel:

Terminal window
kubectl apply -f https://k8s.io/examples/application/basic-daemonset.yaml

Der Befehl kubectl apply übermittelt die Konfiguration an die Kubernetes-API. Anschließend ermittelt der DaemonSet-Controller die passenden Nodes und erstellt die erforderlichen Pods. Treten weitere passende Nodes dem Cluster bei, erstellt der Controller automatisch DaemonSet-Pods für sie. Pods entfernter Nodes werden anschließend per Garbage Collection bereinigt.

Nach der Bereitstellung lassen sich Änderungen am DaemonSet in der Regel verwalten, indem Sie das Manifest anpassen und erneut kubectl apply ausführen. Bei DaemonSets mit der Strategie RollingUpdate lösen Änderungen am Pod-Template ein Rolling Update der verwalteten Pods aus. Kubernetes unterstützt außerdem die Update-Strategie OnDelete, wenn Ersatz-Pods erst erstellt werden sollen, nachdem die vorhandenen manuell gelöscht wurden.

3. DaemonSet-Pods überprüfen

Prüfen Sie nach der Bereitstellung eines DaemonSets, ob seine Pods auf den erwarteten Nodes laufen. Die Kubernetes-Dokumentation empfiehlt, Pods mit der Option -o wide aufzulisten, die den jedem Pod zugewiesenen Node mit ausgibt:

Terminal window
kubectl get pods -o wide

Bei einem DaemonSet, das im gesamten Cluster laufen soll, sollte die Ausgabe auf jedem passenden Node einen DaemonSet-Pod zeigen. Anhand der Spalte NODE lässt sich leicht bestätigen, dass die Pods wie erwartet verteilt sind.

In Umgebungen mit vielen Workloads können Sie die Ergebnisse über die im Pod-Template des DaemonSets definierten Labels einschränken. Für das obige Beispiel lautet der Befehl:

Terminal window
kubectl get pods -l app.kubernetes.io/name=example -o wide

Sie können auch die DaemonSet-Ressource selbst inspizieren:

Terminal window
kubectl get daemonset example-daemonset

oder den abgekürzten Ressourcennamen verwenden:

Terminal window
kubectl get ds example-daemonset

Der DaemonSet-Status hilft Administratoren, die gewünschte Anzahl an Pods mit der Anzahl der aktuellen, einsatzbereiten und verfügbaren Pods zu vergleichen. Laufen einzelne Pods nicht korrekt, lassen sich mit Befehlen wie kubectl describe pod <pod-name> und kubectl logs <pod-name> Scheduling- oder Container-Probleme untersuchen. Das grundlegende DaemonSet-Tutorial von Kubernetes verifiziert eine erfolgreiche Bereitstellung, indem es prüft, ob die resultierende Pod-Liste für jeden passenden Node genau einen Pod enthält.

Best Practices für Kubernetes DaemonSets

1. CPU- und Memory-Requests und -Limits richtig dimensionieren

Passende CPU- und Memory-Requests und -Limits sind entscheidend für die Stabilität eines DaemonSets. Requests definieren die Mindestressourcen, die ein Pod benötigt, während Limits das Maximum festlegen, das er verbrauchen darf. Überdimensionierung verschwendet Ressourcen und kann auf Nodes mit knappen Ressourcen zu Scheduling-Fehlern führen. Unterdimensionierung riskiert Pod-Evictions oder Leistungseinbußen. Analysieren Sie das Ressourcenprofil des Workloads, um sinnvolle Standardwerte zu bestimmen, sodass jeder DaemonSet-Pod problemlos auf jeden anvisierten Node passt.

Überprüfen und justieren Sie die Ressourceneinstellungen regelmäßig, wenn sich die Anwendung weiterentwickelt. Der Ressourcenbedarf kann sich durch neue Features, höhere Last oder Änderungen an der zugrunde liegenden Infrastruktur verändern. In dynamischen Kubernetes-Umgebungen verhindert das regelmäßige Feintuning von Requests und Limits Ressourcenkonflikte und unterstützt eine effiziente Cluster-Auslastung. Integrieren Sie Ressourcen-Reviews in Ihr Change-Management, um kontinuierlich zu optimieren.

2. Ressourceneinstellungen auf historische Nutzungsdaten stützen

Resource Requests sollten widerspiegeln, wie sich DaemonSet-Pods unter realen Workloads verhalten, statt sich nur auf erste Schätzungen zu verlassen. Nutzen Sie historische CPU- und Memory-Metriken aus Tools wie Prometheus, Grafana oder Ihrer Cloud-Monitoring-Plattform, um typische Nutzung, Lastspitzen und Unterschiede zwischen Nodes zu erkennen. Setzen Sie Requests hoch genug für den Normalbetrieb, ohne auf jedem anvisierten Node unnötig Ressourcen zu reservieren.

Betrachten Sie perzentilbasierte Metriken über repräsentative Zeiträume statt kurzfristiger Durchschnittswerte. CPU-Requests lassen sich oft an der dauerhaften Nutzung mit Spielraum für Lastspitzen ausrichten, während Memory-Requests die beobachteten Spitzen berücksichtigen sollten. Da sich der Ressourcen-Fußabdruck eines DaemonSets über alle Nodes vervielfacht, können schon kleine Verbesserungen an den Pro-Pod-Einstellungen erhebliche Cluster-Kapazität freisetzen.

3. Memory konservativer behandeln als CPU

CPU- und Memory-Limits haben in Kubernetes unterschiedliche Fehlerbilder. Erreicht ein Container sein CPU-Limit, drosselt Kubernetes seine CPU-Nutzung, was in der Regel zu langsamerer Verarbeitung führt. Überschreitet ein Container jedoch sein Memory-Limit, kann er vom Kernel mit einem Out-of-Memory-Fehler (OOM) beendet werden. Bei Node-Level-Agents können wiederholte Neustarts Lücken in der Logging-, Monitoring- oder Security-Abdeckung verursachen.

Setzen Sie Memory-Requests und -Limits mit genügend Puffer für temporäre Spitzen und wachsende Workloads. Beobachten Sie Memory-Spitzenwerte und OOM-Ereignisse, bevor Sie Zuweisungen reduzieren. Bei Agents mit unvorhersehbarem Memory-Bedarf kann ein restriktives Memory-Limit mehr Störungen verursachen als eine moderate Überdimensionierung – validieren Sie Limits daher anhand realer Nutzungsmuster in der Produktion.

4. Die passende Update-Strategie wählen

DaemonSets unterstützen die Update-Strategien RollingUpdate und OnDelete. RollingUpdate, die Standardstrategie, ersetzt vorhandene Pods automatisch, wenn sich das Pod-Template des DaemonSets ändert. Mit Einstellungen wie maxUnavailable und maxSurge lässt sich steuern, wie viele DaemonSet-Pods während eines Updates nicht verfügbar sind oder temporär hinzugefügt werden.

Verwenden Sie OnDelete, wenn der Pod-Austausch explizit kontrolliert werden muss. Bei dieser Strategie ersetzt eine Änderung am Pod-Template vorhandene Pods nicht automatisch; Administratoren müssen sie löschen, bevor Kubernetes Pods aus dem neuen Template erstellt. Unabhängig von der gewählten Strategie sollten Sie bedenken, wie sich nicht verfügbare Agents während eines Updates auf Logging, Monitoring, Netzwerk oder Security-Abdeckung auswirken.

5. Effizienz bei Cluster-Änderungen kontinuierlich überwachen

Der Ressourcenverbrauch eines DaemonSets wächst mit der Zahl der passenden Nodes. Ein Pod, der auf einem einzelnen Node nur moderate Ressourcen nutzt, kann in einem großen Cluster in Summe erheblichen CPU- und Memory-Verbrauch verursachen. Verfolgen Sie sowohl die Nutzung pro Pod als auch die Gesamtressourcen jedes DaemonSets, um dessen Auswirkungen auf die Cluster-Kapazität zu verstehen.

Bewerten Sie DaemonSets neu, wenn sich Node-Typen, Workloads oder die Clustergröße ändern. Achten Sie auf ungenutzte Resource Requests, CPU-Throttling, Memory Pressure, OOM-Ereignisse, Neustarts und Pods, die sich nicht einplanen lassen. Kontinuierliches Monitoring hilft zu erkennen, wann Ressourceneinstellungen oder Scheduling-Regeln nicht mehr zu den tatsächlichen Betriebsbedingungen passen.

DaemonSet-Ressourcennutzung mit PerfectScale optimieren

Da ein DaemonSet auf jedem passenden Node einen Pod platziert, vervielfacht sich selbst eine geringe Über- oder Unterdimensionierung über das gesamte Cluster. PerfectScale by DoiT ist eine Kubernetes-Optimierungsplattform, die sich mit einem einzigen Helm-Befehl bereitstellen lässt und anschließend umsetzbare Erkenntnisse und autonome Optimierung über den gesamten K8s-Stack liefert – damit Node-Level-Agents wie Log-Collectors, Monitoring-Exporter und Security-Daemons mit genau den Ressourcen laufen, die sie tatsächlich benötigen.

Zentrale Funktionen von PerfectScale:

  • Autonomes Workload-Right-Sizing: Podfit bietet einen granularen Blick auf Zustand und Kosten des Clusters, priorisiert die Bereiche mit Handlungsbedarf und optimiert Workloads autonom – mit datenbasierten Right-Sizing-Empfehlungen, die sich automatisch anwenden lassen.
  • Optimierung der Node-Auslastung: Infrafit bietet umfassende Transparenz über die Node-Auslastung und granulare Einblicke, die ungenutzte Node-Kapazitäten identifizieren und beseitigen, und hilft bei der Auswahl der richtigen Nodes für Ihre Workloads.
  • Abstimmung mit Autoscalern: Arbeitet mit HPA, KEDA, Karpenter, Cluster Autoscaler, EKS Auto Mode, Fargate, Node Auto Provisioning und Google Autopilot zusammen – inklusive umsetzbarer Empfehlungen zur Verbesserung der jeweiligen Konfiguration.
  • Echtzeit-Alerts mit Priorisierung: Fortschrittliche Auto-Priorisierung macht die folgenreichsten Resilienzrisiken, Kostenspitzen und Anomalien sichtbar, bevor sie Nutzer oder die Cloud-Rechnung treffen – mit Alerts in Slack, Datadog, MS Teams oder PagerDuty.
  • Trend- und Governance-Reporting: Der Trends-Report bietet detaillierte Einblicke in Kosten-, Waste- und Risikometriken im Zeitverlauf – über Cluster, Node-Gruppen, Namespaces und Workloads hinweg – und unterstützt Prognosen sowie Root-Cause-Analysen.
  • Breite Umgebungsunterstützung: Läuft auf On-Premise- und Cloud-Clustern, darunter OpenShift, EKS, GKE und AKS, und unterstützt Windows-basierte Container ebenso wie ephemere und ML-Workloads.

Mehr über die PerfectScale-Plattform erfahren