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.yamlalbojson, 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.