Czy zdarzyło Ci się, tworząc aplikację przechodzić przez piekło błędów, które pojawiły się dopiero po wdrożeniu na serwerze, i musiałeś powstrzymywać się przed wypowiedzeniem magicznego hasła „a u mnie działało”? Czy też wdrażając poprawkę, musiałeś na chwilę wyłączyć usługę, co niezbyt spodobało się użytkownikom? Być może kilka osób w firmie poprosiło Cię o instalacje niekompatybilnych ze sobą aplikacji na serwerze, które nagle zaczęły się kanibalizować? Szukając rozwiązania mogłeś skorzystać z maszyn wirtualnych, odseparowujących poszczególne aplikacje od siebie, ale być może wybrałeś inną opcję – kontenery. To im przyjrzymy się dokładniej.
Konteneryzacja, czyli Docker?
Kontener to inaczej wirtualny zasobnik, za pomocą którego możemy w prosty i szybki sposób wdrażać, przenosić i powielać aplikacje w różnych środowiskach. Innymi słowy, jest to paczka z oprogramowaniem. Uruchamianie i tworzenie kontenerów stało się wygodne dzięki powstaniu platformy uruchomieniowej, jaką jest Docker.
Jej popularność jest na tyle duża, iż niektórzy używają terminu „Docker” zamiennie z konteneryzacją, co nie jest do końca poprawne. Konteneryzacja jest pojęciem o wiele szerszym, znanym jeszcze przed Dockerem, ale skoro przyjęło się, na część butów sportowych mówić „adidasy” to można wybaczyć ten brak programistycznego puryzmu w nazewnictwie.
Faktem jest, iż Docker przysłużył się, rozpowszechniając konteneryzację. Dzięki niemu możemy pobrać obraz kontenera z rejestru, jak również samodzielnie tworzyć kontenery, które, co ważne, są odizolowane od siebie, a więc zmiana jednego, nie wpływa na zmianę drugiego i kolejnego kontenera. o ile nie mamy potrzeby instalowania różnych systemów operacyjnych to skorzystanie z Dockera może być lepszym rozwiązaniem niż korzystanie z maszyn wirtualnych. Zyskamy mniejsze użycie procesora i pamięci dyskowej.
Od Dockera do Docker Swarm
Jednak sam Docker, zainstalowany na pojedynczym urządzeniu nie sprawdzi się, kiedy kluczem jest zapewnienie nieprzerwanej dostępności. W przypadku awarii urządzenia, a choćby podczas aktualizacji kontenera, nie będzie on działać. Kolejnym wyzwaniem jest kwestia skalowalności. Aby równoważyć obciążenia, konieczne jest uruchamianie repliki kontenera na drugim lub kolejnym urządzeniu. Tutaj wkraczamy w rewir Docker Swarm.
Docker Swarm — co to takiego?
Docker Swarm pełni rolę klastra konteneryzacji, który pozwala użytkownikom na tworzenie i zarządzanie rojem (swarm) węzłów i kontenerów. Każdy z węzłów w ramach Docker Swarm, oddziałuje na inne przy pomocy API Dockera. Jego zaletą jest m.in. możliwość rolowanych aktualizacji. Kiedy potrzebujemy zaktualizować jeden z kontenerów lub gdy przestanie on działać, Docker Swarm pozwoli uruchomić go w innym węźle, a w tym czasie dokonać aktualizacji lub naprawy. W międzyczasie mamy zapewniony pełny backup oraz redundancję, a całość działań przeprowadzimy poprzez CLI (command-line interface)
Jak działa Docker Swarm i jak go uruchomić?
Docker Swarm jest w całości zdecentralizowany, co znacznie ułatwia dostęp dla różnych zespołów zarządzających środowiskiem. Sama komunikacja zapewnia wysoki poziom bezpieczeństwa, a wbudowane automatyczne równoważenie obciążenia (auto load balancing), sprawia, iż łatwo skalować infrastrukturę, jak również stosować rollback, aby bezproblemowo wrócić do wcześniejszej wersji środowiska.
Kontenery są wypychane i kontrolowane poprzez usługi, które można zdefiniować jako grupę kontenerów zawierających ten sam obraz. Usługi pozwalają na skalowanie, a do ich wdrożenia, potrzebny jest minimum jeden węzeł. W Docker Swarm mamy do dyspozycji dwa rodzaje węzłów: manager, obsługujący zadania zarządzania klastrami, oraz worker, który te zadania odbiera i wykonuje.
Węzeł manager zna status wszystkich węzłów worker, z którymi prowadzi dwustronną komunikację. Węzeł worker posiada agenta, raportującego do menedżera status obsługiwanego zadania, które wcześniej zostało zaakceptowane z poziomu tego węzła.
Dostęp do usług Docker Swarm, jak również ich wdrażanie może nastąpić za pośrednictwem dowolnego węzła w tym samym klastrze. W tym przypadku, konieczne jest wskazanie obrazu kontenera, którego chcemy użyć. Do wyboru są zarówno te dostępne w ogólnodostępnym rejestrze (Docker Hub), jak i nasze prywatne.
Usługi mogą być zarówno globalne, wówczas usługa może być obsługiwana przez cały czas na każdym z węzłów, jak również replikowane jedynie na wybranych węzłach worker.
Zagłębiając się w terminologię Dockera można odnieść wrażenie, iż usługi to tak naprawdę zadania, do wykonania, ale jest subtelna różnica. Usługa jest tutaj opisem zadania, podczas gdy zadanie to jej wykonanie. Użytkownik tworzy usługę, która inicjuje zadanie, a samo zadanie może być przypisane tylko do jednego węzła.
Możliwe jest również posiadanie wielu menedżerów w ramach Docker Swarm, jednak w tym przypadku konieczne jest określenie, który z nich jest nadrzędny w stosunku do pozostałych.
Uruchomienie Docker Swarm przy pomocy Dockera jest bardzo proste i sprowadza się do komendy:
Docker Swarm a Kubernetes — różnice i podobieństwa
Docker Swarm nie jest jedynym narzędziem do orkiestracji. Dość popularnym rozwiązaniem jest Kubernetes oferowany przez Google. Jakiś czas temu porównywaliśmy oba systemy na naszym blogu. Kubernetes jest platformą open source, wspierającą automatyzację wdrożeń, skalowanie aplikacji i zarządzanie kontenerami.
Testuj Google Kubernetes Engine za darmo
Podstawową różnicą między Docker Swarm a Kubernetes jest złożoność tego drugiego. Sprawia to, iż o ile Docker Swarm jest prostszy w obsłudze, to w przypadku bardziej złożonych aplikacji, duże lepiej sprawdzi się Kubernetes. Złożoność jest odczuwalna już na etapie instalacji, która w przypadku Kubernetes wymaga od nas więcej czasu.
Kolejna różnica dotyczy równoważenia obciążenia, które w Docker Swarm jest automatyczne, podczas gdy Kubernetes wymaga skorzystania z zewnętrznych rozwiązań. Oba rozwiązania korzystają również z zewnętrznych narzędzi do monitoringu.
Docker Swarm jest z pewnością dobrym rozwiązaniem na start, wspiera uczenie się, ale o ile w Twoich projektach mierzysz się z dużymi, złożonymi odciążeniami, wygodniejszym może okazać się Kubernetes dostępny w Google Cloud.