Kubernetes basics: DaemonSet

Posted on Jun 22, 2022

DaemonSet

A DaemonSet ensures that all (or a specific part of) Nodes run a copy of a Pod.

When a new Node is added, then a new Pod is added.

DaemonSets are typically used to run a cluster storage, log collector or node monitor on every node.

Specifying a DaemonSet

A DaemonSet specification consists of the apiVersion, kind, metadata and spec sections.

The spec section is the indivudual one of the DaemonSet and consists the DaemonSetSpec object. The spec.template contains the pod information of the DaemonSet.

Check the following sample from the Kubernetes docs:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template: #  PodTemplateSpec
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
      # this toleration is to have the daemonset runnable on master nodes
      # remove it if your masters can't run pods
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

How DaemonSets are working

Usually when starting a new Pod, the Kubernetes scheduler selects the Node where it should run.

As DaemonSets are running on every Node, the DaemonController is responsible to schedule the Pod on a Node.

To use the default scheduler, we can use the ScheduleDaemonSetPods.

Furthermore some taints and tolerations are added to do Pods created by a DaemonSet and lead to according behaviour.

Further reading

Want to know more?

Keep on reading and choose one of the related articles. You can also check the home page for my latest thoughts, notes and articles.