Spis treści
Wśród biznesów, których głównym motorem działalności jest aplikacja lub system informatyczny, ogromną rolę odgrywają skalowalność, stabilność oraz prędkość wdrożeń. Z tego powodu coraz więcej firm zwraca się w stronę konteneryzacji. Konteneryzacja polega na umieszczaniu elementów aplikacji (jej procesów, zależności, bibliotek, plików konfiguracyjnych czy lokalnych baz danych) w dynamicznie zarządzanych kontenerach.
Konteneryzacja ma wiele zalet. Jedną z nich jest przenośność, co oznacza, że system napisany raz może być uruchamiany w różnych środowiskach. Dzięki temu developerzy mogą poświęcać czas na tworzenie nowych funkcjonalności, zamiast na dopasowywanie systemu do wymagań infrastruktury. Sam proces wdrożenia jest też prostszy, szybszy i bezpieczniejszy.
W przypadku rozbudowanego systemu, na który składają się tysiące czy miliony kontenerów, konieczne jest zarządzanie nimi za pomocą platformy do orkiestracji. Orkiestracja pozwala wprowadzić automatyzację, grupowe zarządzanie, zaawansowany monitoring procesów, kontrolę zmian czy wykrywanie i automatyczne naprawianie awarii.
Jednymi z najpopularniejszych platform do orkiestracji są Kubernetes oraz Docker Swarm. Przedstawiamy istotne różnice między rozwiązaniami oraz ich wady i zalety.
Co to jest Kubernetes?
Kubernetes, nazywany też K8s, to platforma open source służąca do orkiestracji kontenerów. Wspiera automatyzację wdrożeń, skalowanie aplikacji, zarządzanie kontenerami, monitoruje zmiany i procesy. Pozwala zarządzać klastrami (grupami współpracujących ze sobą maszyn) i node-ami (pojedynczymi maszynami w klastrze) na dużą skalę, przez co skraca proces dostosowywania aplikacji do wymagań infrastruktury oraz upraszcza proces wdrażania zmian i dodawania nowych elementów do systemu.
Platforma Kubernetes została stworzona przez Google 20 lat temu w celu obsługi obciążenia produkcyjnego firmy i uruchamiania miliardów kontenerów tygodniowo. W 2014 roku projekt został przekazany organizacji Cloud Native Computing Foundation (CNCF; podlega pod Linux Foundation), a licencja oprogramowania zmieniona na Apache 2.0. Od tego czasu platforma jest wspierana przez CNCF oraz nieprzerwanie rozwijana, również przez społeczność korzystającą z rozwiązania.
Kubernetes jest udostępniany na Google Cloud Platform jako Kubernetes as a Service (usługa Google Kubernetes Engine – GKE).
Więcej o K8s dowiesz się z artykułu “Kubernetes – co to jest i jak zacząć?”.
Co to jest Docker Swarm?
Docker Swarm, podobnie jak Kubernetes, jest narzędziem do orkiestracji kontenerów w różnych środowiskach infrastrukturalnych. To platforma open source, której kod źródłowy jest dostępny na licencji Apache 2.0. Swarm jest dostarczany i wspierany przez firmę Mirantis (Mirantis przejęło platformę od Dockera w 2020 roku).
Docker Swarm służy do zarządzania pojedynczymi elementami i całymi klastrami (grupami maszyn fizycznych lub wirtualnych) korzystając z Docker Engine. Ułatwia tym samym proces zarządzania aplikacją, przyspiesza nowe wdrożenia, zdejmuje z developerów wiele czynności DevOps, takich jak dopasowywanie oprogramowania pod konkretne wymagania infrastruktury. Bezbłędnie pracuje ze wszystkimi aplikacjami wykorzystującymi Dockera do konteneryzacji.
Kubernetes vs. Docker Swarm – porównanie
Definicja i instalacja aplikacji (application definition)
Kubernetes:
Aplikacja może zostać wdrożona i uruchomiona dzięki wykorzystaniu kombinacji pod-ów, serwisów (services) lub mikroserwisów (microservices) oraz deploymentu (obiektu wdrożenia, który zarządza cyklem życia aplikacji).
Docker Swarm:
Aplikacje mogą być wdrażane jako serwisy (services) lub mikroserwisy (microservices) w klastrach. Pliki YAML pozwalają definiować wiele kontenerów. Aplikacje można instalować też przez Docker Compose.
Dostępność (availability)
Kubernetes:
Kubernetes wspiera wysoką dostępność aplikacji. Deployment umożliwia rozmieszczanie pod-ów (grup powiązanych ze sobą kontenerów) pośród node-ów (maszyn w klastrze) w celu zapewnienia wysokiej dostępności, nawet w przypadku wystąpienia awarii. Serwisy z funkcją load balancing (techniką równoważenia ruchu) wyłapują pod-y, które nie działają prawidłowo i je usuwają.
Docker Swarm:
Docker Swarm również dba o wysoką dostępność. Serwisy można replikować w node-ach, a główny node (swarm manager) odpowiada za cały klaster i zarządza rozłożeniem zasobów wśród jego elementów.
Równoważenie obciążenia (load balancing)
Kubernetes:
Kubernetes posiada wbudowany load balancing (technikę równoważenia obciążenia między maszynami), który wymaga ręcznej konfiguracji i aktywacji. Pod-y są zdefiniowane jako serwisy i mogą być wykorzystane jako load-balancer w klastrze. Do load balancing-u jest wykorzystywany kontroler ingress – obiekt API zarządzający dostępem do klastra z zewnątrz, np. przez protokoły HTTP i HTTPS.
Docker Swarm:
Swarm posiada komponent DNS, który zarządza żądaniami wysyłanymi do serwisów. Serwisy mogą być uruchamiane na portach określonych przez użytkownika lub zostać przypisane automatycznie.
Wdrożenia (roll-outs)
Kubernetes:
Zarządzanie aplikacjami za pomocą Kubernetes deployment obejmuje sposób aktualizacji aplikacji. Główną zaletą deployment jest możliwość uruchomienia i zatrzymania zestawu pod-ów w przewidywalny sposób w ramach dostępnych strategii: rolling-update (podmiany istniejących pod-ów) oraz recreate (usunięcia istniejących pod-ów przed stworzeniem nowych). W przypadku rolling update przebieg oraz efekt wdrożenia można modyfikować za pomocą opcji maxUnavailable (pozwala nadać limit liczby niedostępnych pod-ów) oraz maxSurge (określa limit liczby nowo powstałych pod-ów).
Docker Swarm:
Domyślnie harmonogram aktualizacji wykonuje jedno zadanie naraz. Docker Swarm pozwala skonfigurować liczbę prowadzonych jednocześnie aktualizacji oraz wskazać, jakie akcje ma podjąć program aktualizujący w przypadku awarii (w innym przypadku program wstrzyma aktualizację). Docker Swarm pozwala konfigurować odstępy czasu pomiędzy zaplanowanymi aktualizacjami.
Kontrola prawidłowego funkcjonowania (health check)
Kubernetes:
Posiada dwa rodzaje health check-ów: liveness, który sprawdza responsywność aplikacji i readiness, sprawdzający gotowość aplikacji (aplikacja jest responsywna, ale np. aktualnie wykonuje proces, który wstrzymuje możliwość natychmiastowej odpowiedzi). K8s posiada “wbudowany” mechanizm rejestrowania logów, który pozwala monitorować aktywność wśród kontenerów składających się na dany pod.
Docker Swarm:
Opcja health check jest ograniczona do serwisów. Jeśli kontener wspierający usługę nie uruchomi się, zostanie uruchomiony nowy kontener. Użytkownik może ustawić ręcznie funkcjonalność kontroli stanu za pomocą instrukcji HEALTHCHECK.
Przechowywanie (storage)
Kubernetes:
Kubernetes posiada dwa API do przechowywania: PersistentVolume (PV) oraz PersistentVolumeClaim (PVC). PersistentVolume to element pamięci w klastrze (zainicjowany przez administratora lub dynamicznie za pomocą klas pamięci). API przechwytuje szczegóły implementacji pamięci masowej, takie jak NFS, iSCSI lub system pamięci masowej specyficzny dla dostawcy chmury, np. PersistentDisk w przypadku Google Cloud Platform. PersistentVolumeClaim obejmuje żądanie na przechowanie wysłane przez użytkownika. PVC jest podobne do pod-a; pod zużywa zasób node-a, PVC zużywa zasób PV. Może żądać określonych rozmiarów i trybów dostępu (np. mogą być instalowane raz do odczytu, raz do zapisu lub wielokrotnie do jednego z nich).
Modyfikowanie zasobów pamięci używanych przez daemon Dockera w node-ie może spowodować chwilowe usunięcie node-a z klastra.
Docker Swarm:
Docker Engine oraz platforma Docker Swarm wspomagają zamieszczanie woluminów w kontenerach. Woluminy zawierające protokoły (np. NFS, iSCSI) można skonfigurować w node-y. Wtyczki uwzględniają różne platformy, m.in. Azure, Google Cloud Platform, NetApp czy Dell EMC.
Sieci (networking)
Kubernetes:
Platforma posiada płaski model sieci, umożliwiający komunikację między wszystkimi pod-ami. Zasady sieci (network policies) wskazują, w jaki sposób pod-y wymieniają się między sobą informacjami. Kubernetes wymaga dwóch CIDR (Classless Inter-Domain Routing): jeden, z którego pod-y otrzymują adresy IP i drugi dla serwisów.
Docker Swarm:
W Docker Swarm jest możliwe zarządzanie komunikacją sieciową między wieloma hostami dzięki tworzeniu sieci typu overlay. Można też tworzyć sieci typu bridge, które umożliwiają komunikację wewnątrz hosta. Użytkownicy mogą szyfrować ruch danych (data traffic) w kontenerze podczas tworzenia sieci overlay.
Wydajność i skalowalność (performance & scalability)
Kubernetes:
Kubernetes w wersji 1.18 obsługuje klastry zawierające do 5000 node-ów. Obsługuje też konfiguracje, na które składają się jednocześnie:
- do 5000 node-ów,
- do 150 000 pod-ów,
- do 300 000 kontenerów,
- do 100 pod-ów na jeden node.
Kubernetes zapewnia skalowalność w oparciu o dwa SLO (Service Level Objectives):
- responsywność API: 99% wszystkich API odpowiada w mniej niż 1 s,
- uruchomienie pod-a: 99% wszystkich pod-ów i ich kontenerów uruchamia się w mniej niż 5 s.
Docker Swarm:
Docker jest w stanie skalować się do poziomu 30 000 kontenerów i 1000 node-ów obsługiwanych przez jednego Swarm managera (główny node).
Kubernetes vs. Docker Swarm – wady i zalety platform
Zalety Kubernetes:
- projekt open source, modułowy i nieustannie rozwijany,
- największa społeczność wśród platform do orkiestracji – ponad 50 000 commitów i 1200 współtwórców,
- wsparcie organizacji Cloud Native Computing Foundation (CNCF),
- prawidłowe funkcjonowanie na każdym systemie operacyjnym,
- łatwa organizacja i przejrzysta struktura dzięki pod-om.
Wady Kubernetes:
- stroma krzywa uczenia się – samodzielne początki w Kubernetes mogą nie być łatwe,
- wymagany osobny zestaw narzędzi do zarządzania, m.in. kubectl CLI,
- niekompatybilny z narzędziami DockerCLI i Docker Compose.
Zalety Docker Swarm
- projekt open source,
- bezbłędne funkcjonowanie w środowisku Dockera, pełna integracja z Docker Compose i Docker CLI,
- prosta instalacja i szybka konfiguracja,
- łatwiejsza nauka dzięki płaskiej krzywej uczenia się.
Wady Docker Swarm
- funkcjonalności ograniczone do API Dockera,
- brak dużego zaplecza w kwestii uruchomień produkcyjnych na dużą skalę,
- ograniczona wytrzymałość na wystąpienia błędów i awarii,
- niewielka społeczność w porównaniu z Kubernetes – 3000 commitów i 160 współtwórców.
Który system wybrać dla firmy?
Wybór narzędzia zależy od charakteru organizacji oraz rozwijanego produktu. Jeśli główną wartością jest prędkość wdrożenia (zwłaszcza, jeśli produkt nie jest bardzo rozbudowany i wymagający), warto zwrócić się w stronę Docker Swarm. Jego niekwestionowanymi zaletami są prostota instalacji, szybkość uczenia się oraz kompatybilność ze środowiskiem Docker.
Jeśli jednak wartościami naczelnymi są stabilność i przewidywalność rozwoju, lepiej wybrać platformę Kubernetes – zwłaszcza w przypadku rozbudowanego systemu składającego się z tysięcy czy milionów kontenerów. Czas potrzebny na zapoznanie się z możliwościami platformy jest dłuższy, ale zwróci się w postaci dostępu do mnóstwa przydatnych funkcjonalności i opcji dopasowania platformy do indywidualnych potrzeb biznesu.
Pomożemy Ci wybrać rozwiązanie
Jeśli nie jesteś pewny, jakie rozwiązanie będzie najlepsze dla Twojego produktu, skontaktuj się z nami. Nasz certyfikowany Cloud Architect wesprze Cię w przeprowadzeniu analizy oraz doborze właściwej technologii. Ponadto, jeśli zdecydujesz się na rozwijanie razem z nami swojego systemu w oparciu o Google Cloud Platform – skalowalną infrastrukturę w chmurze – otrzymasz pełne wsparcie techniczne oraz możliwość rozliczenia się za usługę chmurową w złotówkach.
Zobacz też: