Kubernetes Objects - DaemonSet
Overview
A DaemonSet ensures that all (or some) nodes run a copy of a Pod. As nodes are added to the cluster, Pods will be added to them. As nodes are removed from the cluster, those Pods are garbage collected.
Purpose
DaemonSets are used for:
- Node-level Services: Logging, monitoring, storage
- System Services: Network plugins, security agents
- Cluster Maintenance: Backup tools, maintenance scripts
Basic DaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: k8s.gcr.io/fluentd-elasticsearch:1.20
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
DaemonSet with Node Selector
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ssd-monitor
spec:
selector:
matchLabels:
name: ssd-monitor
template:
metadata:
labels:
name: ssd-monitor
spec:
nodeSelector:
disk: ssd
containers:
- name: ssd-monitor
image: nginx
DaemonSet with Rolling Update
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemon
spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19
ports:
- containerPort: 80
Basic Commands
# Create DaemonSet
kubectl apply -f daemonset.yaml
# List DaemonSets
kubectl get daemonset
kubectl get ds
# Check DaemonSet status
kubectl describe daemonset <daemonset-name>
# Update DaemonSet image
kubectl set image daemonset/<daemonset-name> <container-name>=<new-image>
# Delete DaemonSet
kubectl delete daemonset <daemonset-name>
Common Use Cases
Logging Agent
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: log-aggregator
spec:
selector:
matchLabels:
app: log-aggregator
template:
metadata:
labels:
app: log-aggregator
spec:
containers:
- name: log-aggregator
image: fluentd:latest
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
hostPath:
path: /var/log
Monitoring Agent
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
containers:
- name: node-exporter
image: prom/node-exporter:latest
ports:
- containerPort: 9100