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.