kubectl cordon / kubectl drain în Kubernetes (kubectl)

Noduri și Helm kubectl 1.2+

Scoate în siguranță un nod din producție pentru mentenanță sau upgrade și îl readuce în cluster (uncordon).

Sintaxă comandă
kubectl cordon|uncordon NOD  |  kubectl drain NOD --ignore-daemonsets [--delete-emptydir-data]

Ce face kubectl cordon / kubectl drain

Când trebuie să repornești o mașină din cluster, să îi faci upgrade de kernel/kubelet sau să o înlocuiești, nu o oprești brusc, ci folosești triada cordon → drain → uncordon:

1) kubectl cordon NOD marchează nodul ca SchedulingDisabled: pod-urile care rulează deja pe el rămân neatinse, dar niciun pod nou nu va mai fi plasat acolo.

2) kubectl drain NOD face mai întâi automat cordon, apoi evacuează grațios toate pod-urile de pe nod (respectând PodDisruptionBudget-urile definite), astfel încât controlerele (Deployment, StatefulSet) să le recreeze pe celelalte noduri sănătoase. 3) După ce mentenanța s-a încheiat, kubectl uncordon NOD permite din nou programarea de pod-uri pe acel nod.

Opțiuni și argumente

Opțiune / Parametru Descriere
cordon NOD Marchează nodul ca SchedulingDisabled fără a opri pod-urile existente.
drain NOD Blochează programarea și evacuează pod-urile de pe nod.
uncordon NOD Reactivează nodul (Ready) după mentenanță.
--ignore-daemonsets Aproape mereu necesar la drain: ignoră pod-urile DaemonSet (CNI, kube-proxy, node-exporter) care sunt legate de fiecare nod.
--delete-emptydir-data Permite evacuarea pod-urilor care folosesc volume temporare emptyDir (datele din ele se pierd).
--grace-period=SEC / --timeout=DURATĂ Perioada de grație la oprirea pod-urilor și timpul maxim total de așteptare.

Exemple

Exemplul 1: Procedura completă de golire a unui nod pentru reboot și reactivare

kubectl drain worker-2 --ignore-daemonsets --delete-emptydir-data
kubectl get nodes
# ... efectuăm upgrade-ul / reboot-ul pe worker-2, apoi:
kubectl uncordon worker-2

Ieșire în terminal

node/worker-2 cordoned
Warning: ignoring DaemonSet-managed Pods: kube-system/cilium-9k4m2, kube-system/kube-proxy-7x2p1
evicting pod shop/api-6f9b8d7c4-x7k2p
pod/api-6f9b8d7c4-x7k2p evicted
node/worker-2 drained
NAME            STATUS                     ROLES           AGE     VERSION
control-plane   Ready                      control-plane   42d     v1.31.1
worker-1        Ready                      <none>          42d     v1.31.1
worker-2        Ready,SchedulingDisabled   <none>          42d     v1.31.1
node/worker-2 uncordoned

Greșeli frecvente

  • După kubectl uncordon, pod-urile care s-au mutat pe alte noduri nu revin singure pe nodul proaspăt repornit; doar pod-urile nou create vor ajunge acolo.
  • Dacă un PodDisruptionBudget (PDB) are minAvailable egal cu numărul curent de replici, kubectl drain va rămâne blocat așteptând până la --timeout.

Comenzi înrudite

  • kubectl get: Listează una sau mai multe resurse, într-un tabel sau în format YAML/JSON.
  • kubectl describe: Afișează detaliile complete ale unei resurse, inclusiv evenimentele recente asociate.
  • kubectl top: Afișează consumul curent de CPU și memorie al nodurilor și pod-urilor.
  • kubectl rollout: Monitorizează lansarea unei versiuni noi, revine la o revizie anterioară (undo) sau repornește treptat pod-urile.