Lesson 2.4: DaemonSets and StatefulSets


A DaemonSet is a Kubernetes controller that ensures a copy of a specific Pod runs on all or some nodes in a cluster. It is commonly used for system-level services that need to run on every node, such as:

  • Logging agents (e.g., Fluentd, Logstash)
  • Monitoring agents (e.g., Prometheus Node Exporter)
  • Network plugins (e.g., Calico, Weave)
  • Storage daemons (e.g., GlusterFS, Ceph)

Key Features of DaemonSets

  • One Pod Per Node:
    • A DaemonSet ensures that each node in the cluster runs exactly one instance of the specified Pod.
    • If a new node is added to the cluster, the DaemonSet automatically schedules a Pod on that node.
    • If a node is removed, the DaemonSet deletes the Pod from that node.
  • Node Selectors:
    • You can use node selectors or affinity/anti-affinity rules to control which nodes the DaemonSet should run on.
    • For example, you can run a DaemonSet only on nodes with a specific label (e.g., disk=ssd).
  • Taints and Tolerations:
    • DaemonSets can work with tainted nodes by adding tolerations to the Pod spec.
    • This allows DaemonSet Pods to run on nodes that are otherwise restricted.
  • Rolling Updates:
    • DaemonSets support rolling updates, allowing you to update the Pod template in a controlled manner.
  • Automatic Scaling:
    • DaemonSets automatically scale with the cluster. When nodes are added or removed, the DaemonSet adjusts the number of Pods accordingly.

How DaemonSets Work

  • Pod Template:
    • A DaemonSet defines a Pod template, similar to a Deployment or ReplicaSet.
    • This template is used to create Pods on each node.
  • Node Selection:
    • The DaemonSet controller identifies nodes that match the specified criteria (e.g., node labels, taints,and tolerations).
    • It then creates or deletes Pods on those nodes as needed.
  • Pod Management:
    • The DaemonSet ensures that the desired number of Pods (one per node) is always running.
    • If a Pod is deleted, the DaemonSet recreates it.
[root@master daemonset]# cat ds.yml apiVersion: apps/v1 kind: DaemonSet metadata: name: nginx-deploy labels: env: demo spec: template: metadata: name: nginx labels: env: demo spec: containers: - name: nginx image: nginx:1.27.4-alpine selector: matchLabels: env: demo
[root@master daemonset]# kubectl apply -f ds.yml daemonset.apps/nginx-deploy created [root@master ~]# kubectl get ds NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE nginx-deploy 2 2 2 2 2 <none> 13m [root@master daemonset]# kubectl get nodes NAME STATUS ROLES AGE VERSION cka-cluster2-control-plane Ready control-plane 26h v1.29.14 cka-cluster2-worker Ready <none> 26h v1.29.14 cka-cluster2-worker2 Ready <none> 26h v1.29.14 [root@master daemonset]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deploy-4lnck 1/1 Running 0 16s nginx-deploy-cc2tw 1/1 Running 0 16s
[root@master daemonset]# kubectl describe pod nginx-deploy-4lnck | grep Node: Node: cka-cluster2-worker2/172.18.0.5 [root@master daemonset]# kubectl describe pod nginx-deploy-cc2tw | grep Node: Node: cka-cluster2-worker/172.18.0.4
All systems normal

© 2025 2023 Sanjeeb KC. All rights reserved.