Kubernetes basics: DaemonSet
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.