Planificarea Avansată a Pod-urilor cu Taints, Tolerations și Node Affinity în Kubernetes (kubectl)

Deployment-uri și scalare Kubernetes 1.25+

Ghid de control al planificării (scheduling) în Kubernetes: atragerea Pod-urilor către noduri optime prin Node Affinity și respingerea sarcinilor neautorizate prin Taints și Tolerations (pentru noduri GPU sau instanțe spot).

Sintaxă comandă
kubectl taint nodes gpu-node-1 accelerator=nvidia:NoSchedule | kubectl get nodes -L accelerator

Î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!