kubectl apply în Kubernetes (kubectl)

Creare și actualizare kubectl 1.0+ (--server-side stabil din 1.22)

Creează sau actualizează declarativ resurse din fișiere YAML/JSON ori directoare Kustomize.

Sintaxă comandă
kubectl apply (-f FIȘIER_SAU_DIR | -k DIR_KUSTOMIZE) [--server-side] [--dry-run=client|server]

Ce face kubectl apply

Comanda kubectl apply este modul declarativ recomandat de a gestiona resurse în Kubernetes: îi dai un fișier YAML (sau un director de manifeste) care descrie cum ar trebui să arate obiectele, iar kubectl le creează dacă nu există sau le actualizează doar pe câmpurile modificate dacă există deja.

La aplicarea clasică (client-side), kubectl salvează ultima configurație aplicată în adnotarea kubectl.kubernetes.io/last-applied-configuration și face o îmbinare în trei căi între starea veche, cea din cluster și noul YAML. Cu --server-side, îmbinarea o face direct API server-ul prin câmpul managedFields, evitând adnotările uriașe și detectând conflictele între unelte diferite.

Înainte de a aplica în producție, folosește --dry-run=server (validează manifestul pe API server fără a salva nimic) și kubectl diff -f ca să vezi exact ce linii s-ar schimba.

Opțiuni și argumente

Opțiune / Parametru Descriere
-f, --filename=CALE Fișier YAML/JSON, director sau URL; se poate repeta.
-R, --recursive Parcurge recursiv subdirectoarele când -f indică un director.
-k, --kustomize=DIR Construiește și aplică un director ce conține kustomization.yaml.
--server-side Executarea îmbinării pe server (Server-Side Apply), cu urmărirea proprietarilor de câmpuri.
--force-conflicts Împreună cu --server-side, preia forțat câmpurile deținute de alt manager.
--dry-run=client|server Simulează comanda local sau pe API server fără a persista modificările.
--prune -l SELECTOR Șterge resursele cu eticheta dată care nu mai apar în fișierele aplicate.
-o, --output=yaml|json|name Afișează obiectul rezultat în loc de mesajul scurt created/configured.

Exemple

Exemplul 1: Aplicarea unui manifest și apoi a unei modificări

La prima rulare obiectele sunt create; la a doua, doar cele schimbate apar ca configured.

kubectl apply -f k8s/deployment.yaml
# modificăm numărul de replici în fișier, apoi:
kubectl apply -f k8s/

Ieșire în terminal

deployment.apps/api created
deployment.apps/api configured
service/api unchanged

Exemplul 2: Validare pe server fără aplicare (dry-run)

Prinde atât erorile de schemă, cât și respingerile de la admission webhooks (de exemplu politici Kyverno/Gatekeeper).

kubectl apply -f k8s/deployment.yaml --dry-run=server

Ieșire în terminal

deployment.apps/api configured (server dry run)

Exemplul 3: Aplicarea unui overlay Kustomize cu Server-Side Apply

kubectl apply -k overlays/production --server-side

Ieșire în terminal

namespace/shop serverside-applied
configmap/api-config-8g4b2m9k5f serverside-applied
deployment.apps/api serverside-applied
service/api serverside-applied

Greșeli frecvente

  • Combinarea comenzilor imperative (kubectl create, kubectl edit) cu kubectl apply fără --server-side: lipsește adnotarea last-applied-configuration și apar avertismente sau câmpuri care nu se șterg.
  • Folosirea lui --prune cu un selector prea larg, ceea ce poate șterge din greșeală alte resurse din namespace.

Comenzi înrudite

  • kubectl diff: Arată diferențele (în format unified diff) dintre manifestele locale și starea actuală din cluster.
  • kubectl create: Creează imperativ o resursă nouă din fișier sau direct din argumente în linia de comandă.
  • kubectl delete: Șterge resurse după nume, etichete sau fișierele YAML din care au fost create.
  • Obiectul Deployment: Gestionează aplicații stateless replicabile: menține numărul de pod-uri, le înlocuiește când cad și face rolling updates.