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-