În mediile de producție, indisponibilitățile pot fi involuntare (o pană de curent, o cădere hardware a unui server) sau voluntare (un inginer DevOps rulează kubectl drain pentru a actualiza kernelul unui nod, sau un modul de autoscalare în cloud oprește un nod sub-utilizat). Dacă un cluster are un Deployment cu 3 replici, iar comanda drain oprește simultan toate cele 3 replici de pe nodurile vizate, aplicația va suferi o cădere totală de trafic. Obiectul PodDisruptionBudget (PDB) impune o limită dură asupra numărului de Pod-uri care pot fi oprite simultan în mod voluntar.
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: api-pdb
namespace: productia
spec:
# Garantează că cel puțin 2 replici sunt întotdeauna active și sănătoase:
minAvailable: 2
# Sau exprimat procentual:
# minAvailable: "80%"
# Sau prin specificarea pierderii maxime permise:
# maxUnavailable: 1
selector:
matchLabels:
app: api-server
Ce se întâmplă la rularea comenzii kubectl drain?
Dacă un inginer sau un script automat încearcă să golească un nod:
kubectl drain worker-node-2 --ignore-daemonsets --delete-emptydir-data
API Server verifică regulile din PodDisruptionBudget. Dacă oprirea Pod-ului ar încălca regula minAvailable: 2, operațiunea de drain este blocată temporar până când noul Pod creat pe un alt nod devine complet sănătos (ReadinessProbe trecută cu succes). Astfel, clienții nu vor resimți nicio secundă de erori 502/503!