Chapter 7.2 - DaemonSets
Learning Objectives
By the end of this chapter, you will be able to:
- Understand what a DaemonSet is
- Deploy DaemonSets
- Use node selectors and affinities
- Manage DaemonSets with node updates
- Understand typical use cases
- Configure DaemonSets for specific nodes
Introduction
A DaemonSet ensures that a Pod runs on all (or some) nodes in the cluster. Unlike Deployments that manage a specific number of Pods, DaemonSets create one Pod per node.
What is a DaemonSet?
A DaemonSet guarantees that a copy of a Pod runs on each node (or on selected nodes) in the cluster.
Characteristics
- One Pod per node: Automatically deployed on each node
- Self-managed: Creates/deletes Pods when nodes are added/removed
- Node-specific: Can target specific nodes with selectors
- System-level: Ideal for system services
Typical Use Cases
1. Logging Agents
Collect logs from all nodes:
2. Monitoring Agents
Collect metrics from all nodes:
- Prometheus Node Exporter
- Datadog Agent
- New Relic Agent
3. Security Agents
- Antivirus
- Intrusion Detection
- Compliance scanners
4. Networking
- kube-proxy (already a DaemonSet in Kubernetes)
- CNI plugins
- Network policies enforcement
5. Storage
- Storage drivers
- Volume plugins
Example: Fluentd for Logging
Fluentd DaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-system
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch.logging.svc.cluster.local"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
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
Node Selectors
Deploy only on specific nodes:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: monitoring-agent
spec:
template:
spec:
nodeSelector:
monitoring: "enabled"
containers:
- name: agent
image: monitoring-agent:1.0
Result: The DaemonSet creates Pods only on nodes with the label monitoring=enabled.
Node Affinities
More advanced control with affinities:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: gpu-monitor
spec:
template:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: accelerator
operator: In
values:
- nvidia-tesla-k80
- nvidia-tesla-v100
containers:
- name: gpu-monitor
image: gpu-monitor:1.0
Tolerations
DaemonSets can tolerate taints to run on tainted nodes:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: system-monitor
spec:
template:
spec:
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
containers:
- name: monitor
image: system-monitor:1.0
Result: The DaemonSet also runs on master/control-plane nodes.
Example: Prometheus Node Exporter
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: monitoring
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
hostNetwork: true
hostPID: true
containers:
- name: node-exporter
image: prom/node-exporter:v1.5.0
args:
- --path.procfs=/host/proc
- --path.sysfs=/host/sys
- --collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($|/)
volumeMounts:
- name: proc
mountPath: /host/proc
readOnly: true
- name: sys
mountPath: /host/sys
readOnly: true
volumes:
- name: proc
hostPath:
path: /proc
- name: sys
hostPath:
path: /sys
Updates
Rolling Update (Default)
spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
Process: Progressive update of Pods on each node.
OnDelete
spec:
updateStrategy:
type: OnDelete
Process: Update only when a Pod is manually deleted.
Useful Commands
Management
# View DaemonSets
kubectl get daemonset
kubectl get ds
# Details
kubectl describe daemonset fluentd
# View Pods
kubectl get pods -l name=fluentd
# Logs
kubectl logs -l name=fluentd
Updates
# Update the image
kubectl set image daemonset/fluentd fluentd=fluent/fluentd:v2
# View status
kubectl rollout status daemonset/fluentd
# Rollback
kubectl rollout undo daemonset/fluentd
Differences: DaemonSet vs Deployment
| Characteristic | Deployment | DaemonSet |
|---|---|---|
| Number of Pods | Specified (replicas) | One per node |
| Placement | Random | On each node |
| Use Case | Applications | System services |
| Scaling | Manual | Automatic (based on nodes) |
| Node updates | Not managed | Self-managed |
Best Practices
1. Use for System Services
DaemonSets for system agents, not for business applications.
2. Appropriate Resources
Define resource limits to prevent exhaustion.
3. Tolerations
Add tolerations for tainted nodes if necessary.
4. Monitoring
Ensure all nodes have a DaemonSet Pod running.
5. Namespace
Place system DaemonSets in kube-system or a dedicated namespace.
Summary
In this chapter, you learned:
DaemonSet: One Pod per cluster node
Use cases: Logging, monitoring, security, and networking agents
Node selectors: Deploy on specific nodes
Tolerations: Run on tainted nodes
Updates: RollingUpdate or OnDelete
Differences: One per node vs specific number
Best practices: System services, resources, monitoring
Next Steps
Chapter 7.3: Jobs
Chapter 7.4: CronJobs
Chapter created: December 2024