DaemonSets

DaemonSets

Jeden pod na každém uzlu – automaticky, včetně uzlů, které přibudou později.

graph TB DS[DaemonSet log-agent] --> P1[Pod na control01] DS --> P2[Pod na worker01] DS --> P3[Pod na worker02] DS --> P4[Pod na worker03] N[přidá se nový uzel] -.-> P5[pod vznikne automaticky]

Žádné pole replicas neexistuje. Počtem replik je seznam uzlů.

Typičtí uživatelé: CNI agenti, kube-proxy, sběrače logů, node exportery, storage drivery. Váš cluster jich už několik provozuje – kubectl get ds -A.

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-logger
spec:
  selector:
    matchLabels: { app: node-logger }
  template:
    metadata:
      labels: { app: node-logger }
    spec:
      tolerations:
        - key: node-role.kubernetes.io/control-plane
          operator: Exists
          effect: NoSchedule       # bez toho na control plane pod nevznikne
      containers:
        - name: logger
          image: busybox
          command: ["sh", "-c", "while true; do date; sleep 30; done"]

Dvě věci lidi překvapí:

  • Taints. Uzly control plane nesou taint NoSchedule, takže je DaemonSet přeskočí, pokud ho netoleruje. Porovnejte kubectl get ds -A s kubectl describe node control01 | grep -i taint.
  • Drain. kubectl drain odmítá vystěhovat pody DaemonSetu, a proto je --ignore-daemonsets na každém drainu, který kdy napíšete. Pod tam má být tak dlouho, dokud existuje uzel.

Omezit DaemonSet na část uzlů lze přes nodeSelector – například jen na uzly s labelem storage=nfs.

Reference