Lab 12 – DaemonSets

Lab 12 – DaemonSets

Cíl: jeden pod na uzel a dvě překvapení, která k tomu patří. Kapitola: DaemonSets

# 1 – cluster jich už několik provozuje
kubectl get ds -A
kubectl get pods -n kube-system -o wide | grep -i -E 'proxy|calico|cilium|flannel'

kube-proxy a agent CNI jsou DaemonSety: musí být na každém uzlu, včetně uzlů, které přibudou zítra. Nikde není pole replicas – počtem je seznam uzlů.

# 2 – váš vlastní
cd ~
cat > logger-ds.yaml <<'YAML'
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-logger
spec:
  selector:
    matchLabels:
      app: node-logger
  template:
    metadata:
      labels:
        app: node-logger
    spec:
      containers:
        - name: logger
          image: busybox
          command: ["sh", "-c", "while true; do echo \"$(date) $(hostname)\"; sleep 30; done"]
          resources:
            requests: { cpu: "10m", memory: "16Mi" }
YAML
kubectl apply -f logger-ds.yaml
kubectl get ds node-logger
kubectl get pods -l app=node-logger -o wide

Tři pody, jeden na každém workeru – a žádný na control01.

# 3 – proč byl control01 přeskočen
kubectl describe node control01 | grep -i -A2 taint

node-role.kubernetes.io/control-plane:NoSchedule. Taint odpuzuje pody, které ho netolerují. Běžné aplikace se tak na control plane záměrně nedostanou.

# 4 – tolerujte taint a sledujte čtvrtý pod
kubectl patch ds node-logger --type merge -p '{"spec":{"template":{"spec":{"tolerations":[{"key":"node-role.kubernetes.io/control-plane","operator":"Exists","effect":"NoSchedule"}]}}}}'
kubectl get pods -l app=node-logger -o wide

Takhle se na control plane dostávají CNI a kube-proxy: tolerují taint. Ten váš by neměl – za chvíli to vrátíme.

# 5 – logy jednoho podu na uzel
kubectl logs -l app=node-logger --tail=2 --prefix

--prefix dá před každý řádek jméno podu, což je to, co dělá logy vybrané podle labelu čitelnými napříč uzly.

# 6 – zacílit jen na část uzlů
kubectl label node worker01 storage=nfs
kubectl patch ds node-logger --type merge -p '{"spec":{"template":{"spec":{"nodeSelector":{"storage":"nfs"},"tolerations":[]}}}}'
kubectl get pods -l app=node-logger -o wide

Jeden pod, jen na worker01. nodeSelector je způsob, jak omezit storage nebo GPU agenty na stroje, které ten hardware opravdu mají.

# 7 – interakce s drainem, kterou potkáte v labu 16
kubectl drain worker01 --ignore-daemonsets --dry-run=server 2>&1 | head -5

Drain nikdy nevystěhuje pody DaemonSetu – pod patří k uzlu a uzel je pořád tady. Proto je --ignore-daemonsets na každém drainu.

Úklid

# 8 –
kubectl delete -f logger-ds.yaml
kubectl label node worker01 storage-