Konteneryzacja to obok chmury obliczeniowej jedno z najgorętszych słów ostatnich lat w branży IT. Dlaczego staje się tak popularna? Jakie korzyści ze sobą niesie? Czym jest Docker? 

Konteneryzacja – co to jest? Komu to potrzebne? 

Wyobraź sobie aplikację. Działając tworzy ona swoje procesy, wykorzystuje zasoby (procesora, pamięci RAM, dysku twardego), korzysta z jakichś zależności, jest w pewien sposób skonfigurowana. Co zrobisz, gdy zechcesz taką aplikację gdzieś przenieść? Albo zmultiplikować? Przeprowadzić na niej – być może destrukcyjne – testy? Oddzielić od innych aplikacji w celach zapewnienia bezpieczeństwa i stabilności?

Będziesz reinstalować aplikację i przywracać jej konfigurację raz za razem? A co, jeśli musisz zrobić tysiąc kopii? Albo dziesięć tysięcy? Co, jeśli każda instancja musi mieć inny adres IP? Co, jeśli system operacyjny nie będzie zawierał wymaganych zależności?

To może wirtualizacja! Przeniesienie maszyny wirtualnej nie powinno przecież stanowić problemu. Zapewni możliwość dopasowywania zasobów, przydzielania adresacji, będzie odizolowana od innych. Dobry pomysł, ale po co nam cała wirtualka, skoro chcieliśmy mieć po prostu aplikację?

konteneryzacja

I tu właśnie w grę wchodzi konteneryzacja.

Aplikacje w kontenerach

Podstawowym zamysłem konteneryzacji jest więc umieszczenie aplikacji, jej procesów, konfiguracji i zależności w wirtualnej jednostce zwanej kontenerem. Z punktu widzenia aplikacji, kontenery te są odrębnymi i niezależnymi instancjami środowiska uruchomieniowego. Posiadają one własny wydzielony obszar pamięci RAM oraz dysku, jak również prywatny adres IP. Pomimo izolacji, kontenery mogą komunikować się między sobą w ramach ściśle zdefiniowanych kanałów wymiany informacji.

Konteneryzacja, a wirtualizacja 

Większość istniejących metod wirtualizacji zakłada stos złożony z warstwy sprzętowej, na której uruchomiony jest system operacyjny, na nim zaś nadzorca (hypervisor) kontrolujący pracę kolejnej warstwy – maszyn wirtualnych. Te zaś powtórnie w formie warstwy najniższej wykorzystują system operacyjny, następnie biblioteki i pliki binarne, by w końcu na samej górze stosu znalazła się działająca aplikacja. 

Wirtualne maszyny są od siebie odizolowane, stanowią kompletne i niezależne środowisko, a dedykowane im zasoby sprzętowe mogą być w znacznym stopniu dopasowywane przez administratora systemu. Wykorzystanie maszyn wirtualnych prowadzi jednak do spadku wydajności aplikacji w nich uruchomionych względem tychże aplikacji uruchomionych na fizycznym sprzęcie, tj. bez wykorzystania wirtualizacji. Fakt ten wynika z powstania dodatkowej warstwy – systemu operacyjnego działającego na maszynie wirtualnej i zużywającego zasoby sprzętowe oraz pracy hypervisora. Każda kolejna warstwa abstrakcji oddzielająca fizyczny sprzęt od aplikacji co do zasady powoduje spadek wydajności tej ostatniej. 

konteneryzacja wirtualizacja docker
Wirtualizacja vs Konteneryzacja. Źródło: Cloud Academy.

Naprzeciw tym wadom wirtualizacji wychodzi konteneryzacja, która pozwala obniżyć ilość warstw abstrakcji poprzez usunięcie zduplikowanego systemu operacyjnego i hypervisora.

Sprawia to, że różnica w wydajności pomiędzy aplikacją kontenerową, a aplikacją działającą na fizycznym sprzęcie staje się niewielka, przy czym zachowane są zalety wirtualizacji, takie jak skalowalność, przenośność i separacja instancji. 

Należy jednak oczywiście pamiętać, że konteneryzacja nie jest w żadnym wypadku następcą wirtualizacji, jakąś wersją 2.0. Wszystko, jak to zwykle bywa, zależy od indywidualnych potrzeb użytkownika, jak i specyfiki projektu.

Docker 

Oczywiście kontenery nie powstają, ani też nie działają same z siebie. Potrzebna jest do tego jakaś platforma, która umożliwi ich tworzenie i zarządzanie.

docker konteneryzacja

Niewątpliwie najbardziej znanym i najczęściej stosowanym narzędziem służącym do konteneryzacji jest Docker, który stał się wręcz synonimem słowa konteneryzacja. 

Docker jest otwartoźródłowym oprogramowaniem pozwalającym umieścić aplikację oraz jej zależności (biblioteki, pliki konfiguracyjne, lokalne bazy danych itd.) w lekkim, przenośnym, wirtualnym kontenerze, który można uruchomić na serwerze z systemem operacyjnym Linux, a także Windows i macOS poprzez dodatkowe oprogramowanie. Docker (jako przedsiębiorstwo) obok darmowej wersji Desktop oferuje także płatną, rozszerzoną wersję Enterprise, która objęta jest wsparciem technicznym produktu. 

Charakterystyką Dockera jest prostota i fakt, że odpowiada za pełny cykl życia kontenera – tworzenie, zarządzanie, niszczenie. Dookoła tej platformy skupiona jest także ogromna społeczność, na której pomoc możemy liczyć. W internecie znajdziemy także wiele już przygotowanych obrazów kontenerów różnych aplikacji, które możemy błyskawicznie wdrożyć. Wiele z nich znaleźć można na oficjalnym repozytorium Docker Hub.

Jak działa Docker? Technikalia. 

Docker jest usługą działającą w modelu klient-serwer i wykorzystuje otwartą bibliotekę runc powstałą w ramach inicjatywy Open Container Initiative, mającą na celu standardyzację rozwiązań konteneryzacji.

Czytaj więcej: lata mijają, a język C nadal rządzi informatycznym światem

Platforma czerpie swe możliwości wprost z funkcjonalności jądra Linux – stąd właśnie wynika głębokie powiązanie z systemami linuksowymi. Pierwszą z wykorzystywanych funkcjonalności jest cgroups – mnechanizm odpowiedzialny za zarządzanie przydzielaniem zasobów sprzętowych oraz liczenie operacji. Następnym mechanizmem są namespace’y, czyli przestrzenie nazw. To one pozwalają na separację, izolowanie procesów pomiędzy przestrzeniami nazw. Działające procesy są nieświadome istnienia innych procesów tak, jakby były jedynymi w systemie.

Dlaczego warto stosować kontenery?

Większość z tych cech zostało już wymienione w tekście, warto jednak stworzyć listę podsumowującą zalety konteneryzacji:

  • Mobilność – zawartość kontenera: aplikacje, konfiguracja, biblioteki – są umieszczone w kontenerze, przez co możliwe jest zapewnienie identycznego zachowania w czasie testów, jak i na produkcji oraz bezproblemowe przenoszenie i powielanie kontenerów.
  • Lekkość – ze względu na usunięcie warstwy systemu operacyjnego, zapotrzebowanie na zasoby kontenerów jest zależne niemalże wyłącznie od zapotrzebowania aplikacji, która jest umieszczona w kontenerze, bez dodatkowego narzutu systemu operacyjnego.
  • Szybkość – wynika z punktu poprzedniego. Uruchomienie aplikacji umieszczonej w kontenerze może być równie szybkie, jak uruchomienie aplikacji natywnej. Ze względu na zmniejszoną objętość, również dystrybucja kontenerów staje się sprawniejsza i mniej wymagająca pod względem zasobów pamięci masowej.

Wstęp do orkiestracji 

O ile zarządzanie jednym, kilkoma lub kilkunastoma kontenerami Dockera nie powinno stanowić problemu, tak sytuacja zmienia się, gdy ilość kontenerów wynosi setki lub tysiące, są one rozproszone, dynamicznie tworzone i niszczone, wymagana jest automatyzacja działań, zapewnienie odpowiedniego workflow i skalowania.




Odpowiedzią na ten problem są platformy służące do orkiestracji. Jest ona, w uproszczeniu, sposobem na zautomatyzowaną konfigurację, koordynację pracy oraz zarządzanie systemami komputerowymi i oprogramowaniem. Pozwalają stworzyć z kontenerów grającą pod komendą dyrygenta (admina) orkiestrę. 

Automatyzacja i orkiestracja

Z definicji, automatyzacją nazywamy przygotowanie pojedynczego zadania do samodzielnej, zautomatyzowanej (tj. w przypadku IT niewymagającej ludzkiej interwencji) pracy. 

Orkiestracja jest zaś formą automatyzacji rozszerzonej do całych systemów i kompleksowych zadań z tym związanych. Wykorzystuje wiele zautomatyzowanych zadań do wykonywania większych procesów z wykorzystaniem wielu odrębnych systemów i usług. Jej celem jest optymalizacja wykonywania częstych, powtarzalnych procesów w celu zapewnienia szybszego i bardziej dokładnego ich wykonania.

Kubernetes 

Spotykając się z tematyką konteneryzacji nie można nie usłyszeć o Kubernetes – najpopularniejszej platformie służącej do orkiestracji kontenerów.

Kubernetes to stworzone przez Google na własne potrzeby narzędzie, z czasem wydane
jako oprogramowanie typu Open Source. Platforma ta służy do zarządzania, automatyzacji i skalowania aplikacji kontenerowych. Kubernetes umożliwia pilnowanie (kontrolę) dużej liczby instancji skonteneryzowanych aplikacji, dodaje także własną, zintegrowaną formę load-balancingu. Zapewnia zarówno automatyzację, jak i tworzenie zadań deklaratywnych.

kubernetes

Kubernetes pozwala umieszczać kontenery i woluminy w grupach – podach z własnymi adresami IP, te zaś w wirtualnych lub fizycznych maszynach – node’ach, jak na powyższym schemacie.

Ważne funkcjonalności Kubernetes

Platforma Kubernetes oferuje masę funkcjonalności sama w sobie, a i te można dodatkowo rozszerzać. Na jej podstawie stworzono także inne produkty – m.in. OpenShift. Stąd wymienię jedynie kilka ważniejszych funkcjonalności, które Kubernetes oferuje.

  • Load Balancing – umożliwia wystawianie kontenera zarówno poprzez nazwę DNS, jak i adres IP. W przypadku znacznego obciążenia danego kontenera, Kubernetes potrafi rozdystrybuować ruch pomiędzy instancjami.
  • Orkiestracja storage – automatyczne podłączanie lokalnych i chmurowych systemów storage’owych.
  • Zautomatyzowane wdrażanie i wycofywanie – możliwość automatycznego tworzenia, wprowadzenia zmian i niszczenia kontenerów.
  • Przydzielanie zasobów – Kubernetes pozwala na przydzielanie poszczególnym kontenerom i grup kontenerów zasobów sprzętowych, jak i automatyczne dostosowywanie tych przedziałów zgodnie z obciążeniem.
  • Automatyczna naprawa błędów – naprawa, wymiana lub usuwanie kontenerów, które nie przechodzą ustawionych przez administratora testów poprawnego działania.
  • Bezpieczeństwo – przechowywanie i zarządzanie hasłami, tokenami Oauth i kluczami SSH za pomocą tzw. secrets. 

Kubernetes, jako popularne rozwiązanie open-source, posiada silną społeczność i jest dynamicznie rozwijane, przypominając w tych względach Dockera. Nie jest dostarczane jednak żadnego typu wsparcie techniczne od producenta – jest to w pełni projekt społecznościowy.

Niniejszy opis orkiestracji i Kubernetes to oczywiście jedynie zalążek, który ani trochę nie wyczerpuje tematu – bardzo obszernego, warto dodać. W najbliższym czasie w serwisie MAGNIFIER pojawiać się będą kolejne, bardziej szczegółowe artykuły. Zachęcam więc do częstego zaglądania.

Kontenery w chmurze 

Na sam koniec, nie można zapomnieć o chmurze. Bo tak się składa, że chmura obliczeniowa i kontenery stały się w ostatnim czasie nierozłącznymi kompanami. To właśnie konteneryzacja pozwala budować na platformach chmurowych farmy mikroserwisów, łatwo przenosić aplikacje, dostosowywać zasoby do obciążenia w niemalże nieograniczonej skali.

Dla przykładu, Amazon Web Services oferuje dwie główne usługi związane z kontenerami. Są to:

  • Amazon Elastic Container Service – dedykowana Dockerowi platforma do uruchamiania i orkiestracji kontenerów. Eliminuje potrzebę zarządzania oprogramowaniem służącym do konteneryzacji i orkiestracji, a także dbaniem o fizyczne maszyny i ich systemy operacyjne – wszystko to leży po stronie usługodawcy.
  • Amazon Elastic Kubernetes Service – usługa dedykowana kontenerom korzystającym z Kubernetes jako orkiestratora.

Osoby rozpoczynające swoją przygodę z kontenerami zachęcam do zapoznania się ze wspomnianymi usługami lub ich odpowiednikami z innych chmur obliczeniowych – uproszczą one nieco początki, zmniejszając ilość ręcznej pracy i przenosząc ją na usługodawcę.

Czytaj więcej: usługi AWS, które warto znać na początek przygody z chmurą

Podsumowanie 

Konteneryzacja i orkiestracja to niezwykle dynamicznie rozwijająca się dziedzina informatyki. Nic dziwnego – bilans wad i zalet jest zdecydowanie przechylony ku tym drugim. Kontenery warto więc poznawać, warto także uczyć się je orkiestrować – niewątpliwie wiedza ta przyda się już w najbliższej przyszłości.