kubectl set image

Aktualizuje obraz kontenera w zasobie (wyzwala rollout).

kubectl set image podmienia obraz (image) kontenera w istniejącym zasobie Kubernetesa — najczęściej w Deploymencie — bez grzebania ręcznie w manifestach YAML. To najprostszy sposób, żeby wdrożyć nową wersję aplikacji: zmieniasz tag obrazu jednym poleceniem, a Kubernetes sam wyzwala rolling update, czyli stopniowo wymienia stare Pody na nowe. Działa nie tylko na Deploymentach, ale też na DaemonSetach, StatefulSetach, ReplicaSetach i ReplicationControllerach.

Składnia i najważniejsze opcje

Podstawowa forma to: kubectl set image (-f PLIK | TYP/NAZWA) KONTENER=OBRAZ

  • -f, --filename — wskazuje plik, katalog lub URL z manifestem zamiast podawania typu i nazwy zasobu wprost.
  • --all — zastosuj zmianę do wszystkich zasobów danego typu w bieżącym namespace, nie tylko do jednego.
  • -l, --selector — wybierz zasoby po etykietach (np. app=web), zamiast podawać je z nazwy.
  • --local — nie kontaktuje się z API serwera, tylko modyfikuje plik lokalnie (przydatne w potoku z -o yaml).
  • -o, --output — format wyjścia, np. yaml albo json, gdy chcesz zobaczyć efekt zamiast go wysyłać.
  • -n, --namespace — wskaż przestrzeń nazw, jeśli zasób nie leży w domyślnej.
  • --dry-run=client|server — pokaż, co by się stało, bez realnej zmiany. Twój przyjaciel przed wdrożeniem na produkcji.

Przykłady użycia

  • kubectl set image deployment/web nginx=nginx:1.27 — aktualizuje kontener nginx w Deploymencie web i uruchamia rolling update.
  • kubectl set image deployment/api api=myrepo/api:v2 web=nginx:1.27 — podmienia obraz w dwóch kontenerach naraz w jednym zasobie.
  • kubectl set image deployments,rc nginx=nginx:1.9.1 --all — zmienia obraz nginx we wszystkich Deploymentach i ReplicationControllerach w namespace.
  • kubectl set image -f deploy.yaml app=app:1.4 --local -o yaml — modyfikuje obraz lokalnie w pliku i wypluwa wynik jako YAML, bez dotykania klastra.
  • kubectl set image deployment/web nginx=nginx:1.27 --dry-run=server -o yaml — podgląd zmiany zweryfikowany przez serwer, zero realnego wdrożenia.

Częste błędy i pułapki

Najczęstsza wpadka to literówka w nazwie kontenera — kontener musi nazywać się dokładnie tak jak w manifeście, a nie tak jak obraz czy Deployment. Jak się pomylisz, polecenie nic nie zmieni i wyjdzie z komunikatem o braku takiego kontenera. Druga klasyka: użycie ruchomego tagu typu :latest — Kubernetes nie wykryje, że obraz się zmienił, jeśli tag został ten sam, więc rollout się nie odpali. Używaj konkretnych wersji albo digestów. Pamiętaj też, że flaga --record jest przestarzała (deprecated) — do śledzenia historii wdrożeń lepiej polegać na kubectl rollout history. I nie myl tego z kubectl set env czy edycją całego manifestu — set image rusza tylko obraz.

Powiązane komendy: kubectl rollout status, kubectl rollout undo, kubectl set env, kubectl edit, kubectl apply.