kubectl patch în Kubernetes (kubectl)

Creare și actualizare kubectl 1.0+

Modifică doar câteva câmpuri ale unui obiect existent, direct din linia de comandă, fără să editezi tot manifestul.

Sintaxă comandă
kubectl patch <tip> <nume> [--type=strategic|merge|json] -p '<patch>'

Ce face kubectl patch

kubectl patch trimite API-ului doar bucata care se schimbă, în JSON sau YAML, de exemplu numărul de replici sau imaginea unui container. Este potrivită pentru scripturi și pentru modificări rapide, punctuale.

Există trei tipuri de patch. strategic (implicit pentru resursele Kubernetes) știe să combine listele după cheie, de exemplu containerele după name. merge (JSON Merge Patch) înlocuiește listele întregi și este singurul tip de combinare suportat pentru resursele proprii (CRD). json (JSON Patch) aplică operații exacte (add, replace, remove) pe căi precum /spec/template/spec/containers/0/image.

Parametri

Parametru Descriere
-p, --patch Conținutul patch-ului (JSON sau YAML).
--patch-file Citește patch-ul dintr-un fișier.
--type strategic (implicit), merge sau json.
--dry-run=server -o yaml Arată rezultatul fără să-l salveze.
--subresource Modifică o subresursă, de exemplu scale sau status.

Exemple

Exemplul 1: Schimbarea numărului de replici și a imaginii

Patch strategic: containerul este găsit după nume, ceilalți containeri din Pod rămân neatinși.

kubectl patch deployment magazin-api -n magazin -p '{"spec":{"replicas":5}}'
kubectl patch deployment magazin-api -n magazin \
  -p '{"spec":{"template":{"spec":{"containers":[{"name":"api","image":"firma/magazin-api:1.4.1"}]}}}}'

Ieșire în terminal

deployment.apps/magazin-api patched
deployment.apps/magazin-api patched

Exemplul 2: JSON Patch: operații exacte pe căi

Adăugăm o variabilă de mediu la primul container. Dacă rulezi din nou un patch care nu schimbă nimic, mesajul este patched (no change).

kubectl patch deployment magazin-api -n magazin --type=json \
  -p '[{"op":"add","path":"/spec/template/spec/containers/0/env/-","value":{"name":"ORAS","value":"Iasi"}}]'

Ieșire în terminal

deployment.apps/magazin-api patched

Exemplul 3: Merge patch pentru o resursă proprie

Pentru obiectele dintr-un CRD folosim --type=merge.

kubectl patch backup baza-zilnic -n magazin --type=merge -p '{"spec":{"pastrare":14}}'

Ieșire în terminal

backup.firma.ro/baza-zilnic patched

Greșeli frecvente

  • Folosirea patch-ului implicit (strategic) pe resurse proprii: eroarea spune că tipul nu este suportat. Adaugă --type=merge.
  • Modificarea cu kubectl patch a unor obiecte gestionate din Git (GitOps, kubectl apply în CI): la următoarea sincronizare, modificarea dispare. Schimbă manifestul din depozit.

Comenzi înrudite

  • kubectl replace: Înlocuiește complet un obiect existent cu definiția din fișier; cu –force îl șterge și îl recreează.
  • kubectl auth can-i: Verifică dacă tu (sau alt utilizator ori ServiceAccount) ai voie să faci o anumită acțiune în cluster, conform regulilor RBAC.