În mod implicit, planificatorul Kubernetes (kube-scheduler) distribuie Pod-urile în mod uniform pe toate nodurile disponibile din cluster. Totuși, în infrastructurile reale de producție, nodurile nu sunt omogene: unele noduri dețin plăci video scumpe (GPU) pentru modele AI, altele sunt mașini de calcul intensiv (High-Memory), iar altele sunt instanțe volatile ieftine de tip Spot/Preemptible. Pentru a controla precis ce Pod ajunge pe ce nod, Kubernetes oferă două mecanisme complementare:
- Node Affinity: Funcționează ca un magnet: atrage Pod-ul către nodurile care dețin anumite etichete (labels).
- Taints și Tolerations: Funcționează ca un scut respingător: nodul refuză să accepte orice Pod, cu excepția acelor Pod-uri care au o toleranță (toleration) explicită pentru acel taint.
Scenariu real: Rezervarea unui nod GPU exclusiv pentru aplicația de Machine Learning
# PASUL 1: Marcăm nodul pe cluster cu un Taint respingător:
kubectl taint nodes nod-gpu-1 hardware=nvidia-h100:NoSchedule
# PASUL 2: În manifestul aplicației AI, adăugăm Toleranța corespunzătoare:
spec:
tolerations:
- key: "hardware"
operator: "Equal"
value: "nvidia-h100"
effect: "NoSchedule"
# Adăugăm și afinitatea pentru a asigura că Pod-ul dorește explicit acest nod:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: hardware
operator: In
values:
- nvidia-h100
Tipuri de Efecte pentru Taints:
NoSchedule:Dacă Pod-ul nu are toleranța specificată, nu va fi planificat pe acest nod (Pod-urile deja active pe nod rămân neatinse).PreferNoSchedule:Planificatorul va încerca să evite nodul, dar îl va folosi dacă nu mai există alte resurse libere în cluster.NoExecute:Dacă un nod primește acest taint, orice Pod activ care nu are toleranța corespunzătoare este evacuat imediat (evicted) de pe nod!