Kubernetes to rozbudowana platforma do automatyzacji, która pozwala na efektywne wdrażanie, skalowanie i zarządzanie aplikacjami w kontenerach. Działa na klastrach złożonych z wielu hostów, zwanych także węzłami.
W tym opracowaniu skupimy się na jednym z kluczowych elementów Kubernetes – wdrożeniu (Deployment). Naszym celem jest zrozumienie jego funkcji, sposobu działania oraz metod tworzenia, aktualizacji i usuwania.
Czym jest wdrożenie?
Wdrożenie to obiekt, który służy do uruchamiania Podów – najmniejszych, podstawowych jednostek w Kubernetes. Zaleca się stosowanie wdrożeń, zwłaszcza w przypadku aplikacji bezstanowych. Bez wdrożeń, manualne zarządzanie wieloma podami (ich tworzenie, aktualizacja, usuwanie) byłoby bardzo skomplikowane i trudne do realizacji na większą skalę.
Wdrożenie definiuje się za pomocą pojedynczego pliku YAML. To nie tylko inicjuje Pody, ale również monitoruje ich działanie i zapewnia ich aktualność. Wdrożenie umożliwia także proste, automatyczne skalowanie aplikacji w Kubernetes, pozwalając na rozbudowę, modyfikację i przywracanie poprzednich wersji aplikacji w ramach Podów.
Wdrożenie określa, ile kopii Poda ma być uruchomionych. Całą resztą, czyli stworzeniem odpowiedniego zestawu replik zdefiniowanego w konfiguracji, zajmuje się Kubernetes. Kontroler, powiązany z danym zestawem replik, dba o utworzenie serii Podów, opierając się na konfiguracji tego zestawu.
Korzystanie z wdrożenia, zamiast bezpośredniego tworzenia zestawów replik, ma kilka istotnych zalet:
- Historia zmian: Każda modyfikacja wdrożenia (za pomocą poleceń „apply” lub „edit”) jest zapisywana jako kopia poprzedniej wersji.
- Zarządzanie wycofywaniem zmian: W razie potrzeby, można łatwo cofnąć się do poprzedniej konfiguracji, dzięki zachowanej historii zmian.
Tworzenie wdrożenia
Istnieją dwie podstawowe metody tworzenia wdrożeń w Kubernetes:
Metoda imperatywna
Interfejs API Kubernetes umożliwia bezpośrednie i imperatywne podejście, bez konieczności tworzenia plików konfiguracyjnych YAML. W tej metodzie użytkownik określa, co ma być zrobione, a Kubernetes ustala sposób realizacji tego celu.
Aby użyć metody imperatywnej, zastosuj poniższe polecenie:
kubectl create deployment nginx-deployment --image nginx --port=80
Metoda deklaratywna
W metodzie deklaratywnej użytkownik definiuje żądany stan systemu w pliku YAML. Kubernetes analizuje te definicje i tworzy zasoby zgodnie z tym opisem.
Do stworzenia wdrożenia za pomocą metody deklaratywnej, niezbędny jest plik YAML.
Przykładowy plik YAML o nazwie new_deployment.yaml:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: #Określa liczbę kopii Podów replicas: 3 #Wybiera Pody zarządzane przez wdrożenie selector: #Dopasowuje zdefiniowane etykiety matchLabels: deploy: example template: metadata: #Określa etykiety dla Podów. labels: deploy: example spec: containers: - name: nginx image: nginx:1.20.2
W pliku YAML definiujemy wersję API Kubernetes, typ tworzonego obiektu (Deployment) oraz nazwę wdrożenia. Sekcja „spec” zawiera kluczowe informacje. „Replicas” określa liczbę kopii Podów, jakie mają być utrzymywane.
Etykieta „selector” służy do identyfikacji Podów w ramach wdrożenia. W tym przykładzie, wszystkie Pody z etykietą „deploy: example” są zarządzane przez dane wdrożenie.
Sekcja „template” opisuje model Podu, który ma być tworzony w ramach wdrożenia. Definicja zwykłego Podu znajduje się pod kluczem „template”.
W przedstawionym przykładzie wdrożenie uruchamia Pody z obrazami Nginx. Należy pamiętać, że Pod jest podstawową jednostką skalowalności w Kubernetes. Projektując wdrożenie, trzeba wziąć pod uwagę wzorzec użycia kontenerów w Podach.
Aby zastosować konfigurację z pliku new_deployment.yaml, użyj następującego polecenia:
kubectl apply -f new_deployment.yaml
Po chwili można sprawdzić status wdrożenia, używając komendy:
kubectl get all
Pobieranie i aktualizacja wdrożenia
Warto zauważyć, że wdrożenie tworzy i zarządza zestawem replik. Aby uzyskać szczegółowe informacje o wdrożeniu, można użyć polecenia:
kubectl describe deployment nginx-deployment
Polecenie to zwraca szczegółowy opis wdrożenia, łącznie z informacją o strategii aktualizacji (RollingUpdate), która jest domyślnie stosowana w Kubernetes.
Strategia RollingUpdate umożliwia stopniową migrację aplikacji do nowszej wersji. Oprócz niej, istnieją też inne strategie:
- Odtwórz (Recreate): Najpierw usuwa wszystkie aktualnie działające instancje Podów, a następnie tworzy je w nowej wersji.
- Niebiesko-zielona (Blue/Green): Tworzy dwa identyczne środowiska. W niebieskim środowisku działa aktualna wersja aplikacji, a w zielonym środowisku – nowa wersja. Po przetestowaniu zielonej wersji następuje przełączenie ruchu.
- Kanaryjska (Canary): Stopniowe wprowadzanie nowej wersji aplikacji dla podzbioru użytkowników, pozwalające na przetestowanie jej w środowisku produkcyjnym przed pełnym wdrożeniem.
W przypadku strategii RollingUpdate można konfigurować jej zachowanie, w tym liczbę replik, które mogą być aktualizowane jednocześnie.
- maxSurge: Określa, ile dodatkowych Podów może być utworzonych podczas aktualizacji, poza aktualną liczbą replik (procentowo lub liczbowo).
- maxUnavailable: Określa, ile Podów może być niedostępnych podczas aktualizacji (procentowo lub liczbowo), w zależności od liczby replik.
Odpowiednia konfiguracja tych parametrów, w zależności od specyfiki aplikacji i autoskalera, pozwala na dostosowanie jakości usług (QoS) oraz przyspieszenie wdrożeń.
Przykładowo, możemy przeskalować liczbę Podów do 10 i zmienić tag obrazu Nginx na najnowszy:
kubectl scale deployment nginx-deployment --replicas=10
Na początku tworzone jest 5 kontenerów, a dostępnych jest tylko 5 Podów.
Po chwili, używając polecenia:
kubectl get all
można zobaczyć, że wszystkie Pody zostały utworzone, a kontenery są uruchomione.
Usuwanie wdrożenia
Aby usunąć wdrożenie w Kubernetes, użyj następujących poleceń:
kubectl delete deploy nginx-deployment kubectl delete deploy new_deployment.yaml
Helm: Uproszczenie wdrożeń
W przypadku wdrażania bardziej złożonych aplikacji, składających się z wielu zasobów Kubernetes, polecenie „kubectl” może okazać się niewystarczające. Wtedy z pomocą przychodzi Helm – menedżer pakietów dla Kubernetes. Opiera się on na „kubectl”, ale znacznie upraszcza proces wdrażania aplikacji.
W terminologii Helm, aplikacja nazywa się wydaniem (release). Jest ona związana z wykresem (chart), czyli zestawem plików konfiguracyjnych YAML, które zawierają zmienne globalne i szablony opisujące zasoby Kubernetes.
Podsumowanie
Wdrożenie to podstawowy obiekt Kubernetes. Jego prawidłowe skonfigurowanie i wykorzystanie ma kluczowe znaczenie dla stabilności i skalowalności aplikacji. Zalecamy zapoznanie się z dokumentacją Kubernetes w celu lepszego zrozumienia szczegółów konfiguracji wdrożeń.
Możesz także poszukać dodatkowych materiałów i samouczków, aby pogłębić swoją wiedzę i stać się ekspertem w Kubernetes.