Uruchom kubectl run nginx --image=nginx:1.27, a Kubernetes utworzy dokładnie jeden Pod o nazwie nginx. Usuń go poleceniem kubectl delete pod nginx i zniknie na dobre — nikt tego nie zauważy, nikt go nie zastąpi. Pod to najmniejsza jednostka wdrożeniowa w Kubernetes: jeden lub więcej kontenerów dzielących namespace sieciowy i zestaw wolumenów, zaplanowanych razem na jednym Node.
Taki pojedynczy Pod to ślepy zaułek w produkcji. Jeśli kontener w nim się wywali, kubelet uruchomi go ponownie w tym samym miejscu. Jeśli Node się zrestartuje albo ktoś usunie Pod, nic go nie odtworzy. Goły Pod nie wie, że w ogóle powinien istnieć.
Co Deployment dodaje do Poda
Deployment to obiekt Kubernetes, który określa, ile kopii Poda powinno istnieć i jak wdrażać w nich zmiany. Przestajesz zarządzać Podami bezpośrednio i opisujesz stan docelowy; pętla kontrolna dba o to, żeby ten stan się urzeczywistnił. To ta sama pętla, która stoi za wszystkim innym w Kubernetes.
| |
| |
| |
Trzy Pody, nie jeden, i żaden nie nazywa się web-app. Ten schemat nazewnictwa (web-app-7d9f8c7b86-4kxqz) to pierwszy sygnał, że zarządza nimi coś innego.
replicas: 3 robi to samo, co docker compose up --scale web=3 w Docker Compose. Różnica polega na tym, że tutaj kontroler egzekwuje tę liczbę długo po zakończeniu wykonania polecenia.
Jak Deployment naprawdę tworzy Pody: rola ReplicaSet
Deployment nie tworzy Podów bezpośrednio. Tworzy ReplicaSet, a to ReplicaSet tworzy Pody. Cały łańcuch widać na własne oczy:
| |
| |
Nazwa ReplicaSet to nazwa Deployment plus hash szablonu Poda (7d9f8c7b86); nazwa każdego Poda to nazwa ReplicaSet plus losowy sufiks. kubectl describe pod web-app-7d9f8c7b86-4kxqz pokazuje tę zależność wprost, w polu Controlled By: ReplicaSet/web-app-7d9f8c7b86.
Usuń jeden z tych Podów, a licznik spadnie do 2. W ciągu kilku sekund pojawi się zastępca. To ReplicaSet zauważa brak i tworzy nowy Pod z tego samego szablonu — Deployment nie robi tego bezpośrednio. ReplicaSet pilnuje. Deployment istnieje dla jednej rzeczy, której ReplicaSet nie potrafi zrobić sam: zastąpić szablon Poda stopniowo, zamiast od razu wszystkiego naraz.
Co rollout robi z ReplicaSetami
Zmień obraz i zastosuj:
| |
| |
W tle Deployment utworzył drugi ReplicaSet dla nowego szablonu Poda i skalował go w górę, jednocześnie skalując stary w dół. Przy domyślnej strategii RollingUpdate i 3 replikach oznacza to wymianę jednego Poda na raz:
| |
| |
Stary ReplicaSet nie jest usuwany. Zostaje przy zerze replik, zachowując poprzedni szablon Poda jako zapis. Dzięki temu rollback jest szybki:
| |
Kubernetes skaluje stary ReplicaSet z powrotem w górę, a nowy w dół — bez przebudowy, bez ponownego pobierania starego obrazu, jeśli nadal jest w cache na Node. kubectl rollout history deployment/web-app --revision=1 nadal pokazuje dokładnie, jaki obraz uruchamiała ta rewizja.
Kiedy goły Pod to dobry wybór
Goły Pod nie jest błędem w każdym kontekście, tylko w większości z nich:
- Jednorazowy kontener diagnostyczny, który usuniesz za pięć minut:
kubectl run debug --image=busybox -it --rm -- sh. - Job albo CronJob, który tworzy Pody przez własny kontroler, bo praca ma dobiec końca, a nie zostać uruchomiona na stałe.
- Sprawdzanie lub poznawanie samej spec Poda, zanim zostanie owinięta w coś, co nią zarządza.
Wszystko, co ma przetrwać awarię, padnięcie Node’a albo aktualizację, powinno być zarządzane przez Deployment. Albo przez StatefulSet, dla Podów, które potrzebują stabilnej tożsamości i własnego storage — to inny problem i inny obiekt. Domyślnie pisz manifest Deployment, a do gołego Poda schodź tylko w trzech powyższych przypadkach.
Pod, ReplicaSet i Deployment obok siebie
| Pod | ReplicaSet | Deployment | |
|---|---|---|---|
| Czym zarządza | Kontenerami | Podami | ReplicaSetami |
| Zastępuje usuniętą instancję | Nie | Tak | Tak, przez swój ReplicaSet |
| Skaluje do N replik | Nie | Tak | Tak |
| Rolling update | Nie | Nie | Tak |
| Rollback do wcześniejszej wersji | Nie | Nie | Tak |
| Tworzysz go bezpośrednio | Rzadko | Prawie nigdy | Zwykle |
Sprawdź, czy Twoje Pody są zarządzane przez Deployment
Uruchom to na tym, co już masz w klastrze:
| |
Jeśli wracają tylko wiersze Pod, to są gołe Pody. To luka, którą warto załatać, zanim kolejny drain Node’a zabierze razem z nimi także twoją aplikację.