Wirtualizacja kontenerowa w systemie Linux

Pojęcia „wirtualizacja kontenerowa”, „kontener” coraz chętniej wymieniane są pośród najbardziej perspektywicznych rozwiązań związanych z chmurami obliczeniowymi. Stało się tak głównie dzięki narzędziu Docker, które od 2013 roku bardzo szybko zdobywa popularność. Warto przy tej okazji poznać zasadę działania tego typu wirtualizcji, jej zalety i wady, a także przyjrzeć się oprogramowaniu, jakie warto brać pod uwagę planując wdrożenie rozwiązań kontenerowych we własnym przedsiębiorstwie.

Wirtualizacja na poziomie systemu operacyjnego

Metodę wirtualizacji, stosowaną w rozwiązaniach kontenerowych formalnie określa się mianem wirtualizacji na poziomie systemu operacyjnego często też można spotkać się z pojęciem „lekkiej wirtualizacji” (ang. lightweight virtualization). Jej idea opiera się na wydzieleniu zamkniętych, możliwie niezależnych instancji przestrzeni użytkownika (user space). Instancje te, określane mianem kontenerów, działają bezpośrednio pod kontrolą jądra systemu operacyjnego, na którym są hostowane, a stopień ich autonomii zależny jest od zastosowanego mechanizmu izolacji.

Namiastką takiej wirtualizacji jest znana jeszcze z systemów UNIX funkcja chroot(), która pozawala na uruchomianie poleceń w zamienionym katalogu głównym (/). Możliwości zwykłego chroota nie pozwalają na tworzenie wirtualnych serwerów we współczesnym znaczeniu tego pojęcia – nie zapewnia on nawet odpowiedniego ograniczenia uprawnień użytkownika uprzywilejowanego. Nie zmienia to faktu, że wirtualizacja kontenerowa stanowi pewne rozwinięcie idei chroota.

Właściwa implementacja wirtualizacji powinna przede wszystkim zapewniać pełną, bezpieczną izolację poszczególnych kontenerów na poziomie systemu plików. Zastosowane mechanizmy mają uniemożliwić nieuprzywilejowany dostęp z wnętrza danej instancji do przestrzeni plikowych pozostałych kontenerów. W szczególności muszą blokować możliwość „wyjścia” z kontenera do systemu nadrzędnego. Warunki te są trudniejsze do spełnienia, niż ma to miejsce w przypadku klasycznego hypervisora, gdyż systemy gości pracują pod kontrolą wspólnego jądra i nie stanowią odrębnego systemu operacyjnego.

Podobnie jak przy klasycznych metodach wirtualizacji, w rozwiązaniach kontenerowych pożądana jest dodatkowa funkcjonalność ułatwiająca zarządzanie maszynami wirtualnymi. Wymienić tu można: izolację warstwy sieciowej, limitowanie przestrzeni dyskowej, operacji I/O, pamięci i procesora. W środowiskach rozproszonych ważna jest obecność mechanizmów migracji na żywo.

Z przedstawionego tu zarysu wynikają wprost wady i zalety wirtualizacji na poziomie systemu operacyjnego. Oprócz (potencjalnie) niższego poziomu bezpieczeństwa, najistotniejszym ograniczeniem jest niemożność wirtualizacji systemu, którego kod nie może być bezpośrednio wykonany przez jądro hypervisora. W przypadku Linuksa, bez większego problemu da się uruchomić w kontenerze zupełnie inną dystrybucję, czy też zainstalować na hoście 64-bitowym system 32-bitowy. Nie będzie jednak możliwe uruchomienie gościa, który wymaga jądra innego systemu operacyjnego czy choćby innej wersji linuksowego kernela.

Najważniejszą zaletą kontenerów jest szybkość działania wirtualnego hosta. Kod gościa wykonywany jest praktycznie z natywną prędkością nadrzędnego systemu operacyjnego. Narzut na obsługę specyficznych dla kontenera funkcji systemowych jest minimalny. Uruchomiony system wirtualny nie zawiera jądra, gdyż jego funkcję przejmuje jądro systemu nadrzędnego, odpada tu więc ponowna obsługa wykonywanych przez nie operacji. System plików gościa jest de facto częścią systemu plików hosta, co dodatkowo ułatwia efektywne zarządzanie przestrzenią dyskową (np. poprzez zastosowanie mechanizmów deduplikacji). Można więc powiedzieć, że zapotrzebowanie na zasoby systemowe w przypadku wirtualizacji kontenerowej jest znacząco mniejsze.

Implementacje

Jedne z pierwszych rozwiązań wirtualizacji na poziomie systemu operacyjnego w Linuksie to >Linux-VServer i OpenVZ. Oba narzędzia zyskały sporą popularność, przy czym OpenVZ jest rozwiązaniem bardziej zaawansowanym i cieszącym się większą popularnością (w szczególności w dużych instalacjach). Ich istotną wadą jest konieczność użycia odpowiednio zmodyfikowanego jądra, gdyż wsparcia w oficjalnych wydaniach kernela dla obu projektów nie ma i nie jest ono planowane. Z tego powodu należy w zasadzie odradzić ich stosowanie w nowo projektowanych systemach, zwłaszcza że inne, nie posiadające takiego ograniczenia implementacje wirtualizacji kontenerowej zdają się przejmować rynek.

Twórcy Linuksa, w kwestii wirtualizacji na poziomie systemu operacyjnego, zdecydowali się więc przyjąć inną strategię. Zamiast włączyć do jądra konkretną implementację, postanowili wyposażyć je w szereg mechanizmów ogólnego przeznaczenia, które umożliwiają budowanie rozwiązań kontenerowych całkowicie w przestrzeni użytkownika. Najważniejsze z nich to: cgroups i namespaces. Mechanizm cgroups (control groups) pozwala na kształtowanie i ograniczanie wykorzystania zasobów systemowych (CPU, pamięć, I/O etc.) dla wybranych grup procesów. Mechanizm namespaces sprawia, że znajdujące się w danej przestrzeni procesy nie mają wglądu w środowisko innych grup – widoczna jest dla nich jedynie własna instancja środowiska systemowego (np. niezależna może być numeracja PID-ów procesów, konfiguracja interfejsów sieciowych i routingu, struktura punktów montownia systemów plikowych etc.). Mechanizmy te zawarte są w jądrze od dłuższego czasu, uznawane są stabilne i znalazły szerokie zastosowanie. Można więc założyć, że rozwiązania wirtualizacji kontenerowej wymagające łatania jądra będą sukcesywnie wypierane.

LXC

Niejako wzorcową realizacją wirtualizacji opartej o funkcje zawarte w jądrze jest oprogramowanie LXC (Linux Containers). Zawiera ono bibliotekę, API oraz zestaw narzędzi, które pozwalają na uruchomienie w pełni funkcjonalnych kontenerów w środowisku systemowym. Kontenery LXC są stale rozwijane. Od wersji 1.0 (wydanej w 2014) uznawane są za rozwiązanie stabilne, w pełni nadające się do stosowania w środowiskach produkcyjnych. LXC wspiera m.in.:

  • pełną izolację na poziomie systemu plików,
  • izolację sieci,
  • limitowanie CPU, RAM i I/O,
  • limity dyskowe (w ograniczonym stopniu: poprzez zastosowanie LVM bądź systemów plikowych z możliwością użycia ograniczeń dla części drzewa katalogów),
  • migrację kontenerów „na żywo”.

LXC bardzo dobrze nadaje się do użycia w charakterze niskopoziomowej platformy, na której buduje się pochodne rozwiązania wirtualizacji kontenerowej (bazują na nim kontenery LXD i wczesne wersje Dockera).

LXC wspierany jest przez bibliotekę wirtualizacji libvirt. Kontenery mogą być więc obsługiwane przez narzędzia korzystające z API libvirt, włącznie z OpenStack Nova.

Docker

Docker jest narzędziem, za sprawą którego kontenery oparte o wolne oprogramowanie otwartoźródłowe zaczęły zdobywać masową popularność. Niedługo po swojej premierze (2013) Docker stał się rynkowym przebojem, uzyskując szerokie wsparcie merytoryczne i finansowe (projekt wspierają m.in. RedHat, IBM, Goldman Sachs). Docker pozwala na zamknięcie w kontenerze aplikacji, wraz z całym niezbędnym do jej uruchomienia środowiskiem. Pomiędzy kontenerami można stworzyć połączenia, dzięki którym aplikacje mogą wymieniać między sobą dane. Oznacza to, że oprogramowanie zamknięte w kontenerach można bardzo łatwo przenosić w formie gotowej do uruchomienia (np. pomiędzy środowiskami testowym i produkcyjnym, działem developerskim i klientem etc.), modyfikować i dystrybuować. Modyfikacje obrazów kontenerów dokonywane są poprzez system kontroli wersji, zmiany zapisywane są przyrostowo. Dostępne jest też publiczne repozytorium zawierające oficjalne i nieoficjalne obrazy (Docker Hub Registry).

Ważniejsze cechy, jakimi Docker wyróżnia się na tle klasycznych rozwiązań wirtualizacji systemowej:

  • nacisk na obsługę aplikacji, a nie wirtualnych systemów,
  • obrazy kontenerów przechowywane są w dedykowanym, przenośnym formacie, ze wsparciem dla kontroli wersji,
  • możliwość wielokrotnego użycia komponentów: jeden bazowy obraz kontenera może stanowić podstawę innych, bardziej wyspecjalizowanych,
  • publiczne repozytroium kontenerów, osiągalne również z poziomu CLI (Docker Hub Registry).

Z kontenerów Dockera można również korzystać poprzez platformę OpenStack, aczkolwiek sterownik dla komponentu Nova Compute (nova-docker) nie jest na razie częścią oficjalnego wydania OpenStacka (w chwili pisania tego opracowania stabilną wersją OpenStacka jest 2015.1.0 – Kilo). Sterownik można pobrać z repozytoriów StackForge.

Nowatorskie podejście do koncepcji kontenerów sprawiło, że Docker bardzo szybko stał się rozwiązaniem chętnie stosowanym w środowiskach developerskich, systemach klastrowych, jak również wśród dostawców usług PaaS.

Nowe projekty

Oprócz oprogramowania, które osiągnęło już wersje stabilne, na rynku pojawiają się rozwiązania, mające stanowić jego uzupełnienie bądź nawet konkurencję. Są to projekty, których pozycja nie jest jeszcze ugruntowana, jednak wsparcie społeczności i instytucji komercyjnych daje im duże szanse powodzenia.

Interesującym projektem jest wspomniany już wcześniej kontenerowy hypervisor LXD, stworzony i rozwijany przez Canonical Ltd. LXD korzysta z biblioteki liblxc i ma być w założeniach alternatywnym interfejsem dla LXC. Wśród kluczowych funkcjonalności wymienia się: nacisk na bezpieczeństwo, skalowalność, nowoczesny interfejs użytkownika, operowanie obrazami kontenerów (zamiast używanych w LXC szablonów dystrybucji). LXD posiada też wtyczkę umożliwiającą użytkowanie na platformie OpenStack.

Innym przykładem interesującej inicjatywy jest system kontenerów rkt (dawniej Rocket), który pomyślany jest jako zamiennik Dockera. Projekt stworzony i rozwijany jest przez autorów „lekkiego” klastrowego systemu CoreOS. Według twórców rkt, główną motywacją do rozpoczęcia nowego projektu była zbytnia złożoność dockerowych kontenerów. Podstawowe cechy rkt to modularna architektura, dobra integracja z narzędziami orkiestracji, bezpieczeństwo, zgodność z innymi rozwiązaniami kontenerowymi (rkt może korzystać z obrazów Dockera). Projekt wspierany jest m.in. przez Google.

Podsumowanie

Wnioski z obserwacji ostatnich trendów branży IT uprawniają do stwierdzenia, że „lekka wirtualizacja” bardzo szybko zdobywa rynek. Chociaż jej funkcjonalne implementacje działają od wielu lat, dopiero teraz na poważnie inwestują w nią największe instytucje. Bez wątpienia też najważniejsze rozwiązania w tej kategorii, to wolne i otwarte oprogramowanie działające w środowisku systemu Linux.

Za największą wadę opisanych tu narzędzi najczęściej uznaje się brak bezpośredniego wsparcia dla innych systemów operacyjnych. Tempo rozwoju rozwiązań kontenerowych wskazuje, iż w praktyce nie jest to wielką uciążliwością, głównie ze względu na powszechność stosowania Linuksa bądź oprogramowania opartego o jego jądro we wszystkich najważniejszych i charakteryzujących się największym potencjałem wzrostu dziedzinach branży informatycznej.

Gwałtowny rozwój wirtualizacji kontenerowej sprawia, że nie można z dużą dozą pewności wskazać oprogramowania, które za kilka lat będzie na rynku niekwestionowanym liderem. Bazując na stanie obecnym (2015), rekomendować można dwa projekty, które korzystają z funkcjonalności zawartych w jądrze, a przy tym są rozwiązaniami stabilnymi. Proponowane oprogramowanie to:

  • LXC – jeśli w kontenerach uruchamiane będą kompletne systemy operacyjne, w środowisku możliwie zbliżonym do pełnych metod wirtualizacji. Ponadto istnieje duże prawdopodobieństwo, że jeśli nie bezpośrednio, to w formie interfejsu pośredniego będzie to platforma mająca znaczny udział w rynku wirtualizacji kontenerowej również w najbliższych latach.
  • Docker – najlepszy obecnie sposób umieszczenia aplikacji w zamkniętych kontenerach, możliwy do wykorzystania w procesie wytwarzania oprogramowania bądź usługach PaaS. Dockerowi szybko rośnie konkurencja, ale stopień jego wdrożenia w najważniejszych systemach i wsparcie dużych instytucji sprawia, iż jego pozycja lidera w dziedzinie kontenerowych aplikacji nie będzie w najbliższym czasie zagrożona.

Inne projekty, chociaż bardzo obiecujące, nie osiągnęły obecnie statusu pozwalającego na bezpieczne użytkowanie w środowisku produkcyjnym. Należy jednak założyć, że sytuacja ta bardzo szybko ulegnie zmianie. Możemy być pewni, że projektanci systemów informatycznych, administratorzy i dostawcy usług chmurowych będą dysponowali jeszcze większym wyborem wysokiej klasy narzędzi służących do tworzenia i obsługi kontenerów. Co przy tym ważne – narzędzi dostępnych w formie wolnego i otwartego oprogramowania.

Linki

Źródło: forCore – opracowanie własne (maj 2015)
Licencja: CC BY-SA 3.0 PL