MARGO

Aktualności

Kontenery: zbliżenie na technologię, które rewolucjonizuje infrastrukturę

Uproszczone programowanie i zoptymalizowane zarządzanie zasobami w środowisku izolowanym

Autor: Omar Naghmouchi Software Engineer

24/07/2018

W coraz bardziej zdygitalizowanym świecie, wyzwania dotyczące skalowania, tolerancja dla usterki, rozwojowość oraz konserwacja są coraz ważniejsze.

Kontenery, w połączeniu z szablonami koncepcyjnymi, szczególnie z architekturą mikroserwisów, rewolucjonizują sposób postrzegania systemów informatycznych, by lepiej sprostać wymaganiom nowej ery cyfrowej.

Cały więc ekosystem zbudował się wokół kontenerów, umożliwiając ich szybką adaptację. Rozwiązania do ich tworzenia, organizowania, zabezpieczania oraz benchmarkowania, … już się pojawiły i nie przestają się pojawiać.

Ekosystem na tyle magiczny, że często zapominamy, że za tą magią kryje się prosta podstawowa zasada kontenerów. Właśnie ją postaramy się zgłębić w niniejszym artykule.

Czym jest kontener?

Kontener są to wszystkie procesy izolowane odbywające się na danym hoście. Pozwala on na utworzenie izolowanej przestrzeni niezbędnej do wykonania programu.
Kontener zawiera wszystkie zależności do wykonania programu, zaczynając od kodu oraz jego konfiguracji do bibliotek, od których zależy.

 

Do czego służy kontener?

Kontenery ułatwiają uruchomienie

Przygotowanie paczki, która zawiera konfigurację oraz zależności, gotowej do uruchomienia i wykonania na serwerach fizycznych, maszynach wirtualnych lub w chmurze jest bardzo interesujące. Umożliwiając taką wielosystemowość, rozwiązujemy wszystkie problemy związane z uruchomieniem w różnych środowiskach (środowisko programowania, integracji, produkcji…).

Ponadto, sprawdzając czy program przygotowany jest do uruchomienia w środowisku zdecentralizowanym, kontenery, dzięki swojej prostocie obsługi (tworzenie, uruchomienie, zatrzymanie, usunięcie…) dają gwarancję łatwiejszego skalowania oraz tolerancji dla usterek.

Łatwe uruchomienie, bez przerwania działania, pozwala również na szybką ewolucję aplikacji, w celu poprawienia błędów i dodania nowych funkcji.

Kontenery optymalizują zarządzanie zasobami przy jednoczesnym zachowaniu izolacji

Kontenery umożliwiły i uskuteczniły uruchamianie wielu aplikacji w tej samej infrastrukturze. Kontener jest bardzo lekki, w porównaniu z wirtualną maszyną, waży zaledwie kilka megabajtów. Tam, gdzie wirtualna maszyna pracuje na hipernadzorcy, zainstalowanym bezpośrednio na sprzęcie lub na OS, aby móc wykonać OS gościa; kontenery posiadają wszystkie ten sam system operacyjny, zdefiniowany jako proces, natomiast izolacja zarządzana jest na poziomie jądra.

Kontener, zbudujmy go!

Kontener to zespół procesów izolowanych.
Aby wykonać ich izolację, należy:

  • Przypisać osobny system plików do kontenera.
  • Ograniczyć, co może widzieć jeśli chodzi o inne procesy i system.
  • Ustalić zasoby, którymi może się on posługiwać (pamięć, procesor, dysk itp.).

Chroot

Aby przypisać osobny system plików do kontenera i zmienić jego katalog główny, system Linuxa udostępnia polecenie chroot (change root), które pozwala przypisać katalog główny systemu plików procesu wywołującego.
W ten sposób, za pomocą chroot, możemy zaufać procesowi, że przejdzie do katalogu ‘/’, podczas gdy, z punktu widzenia systemu, ustawi się on w podfolderze.

 

Namespaces

Aby ograniczyć widzialność zasobów w kontenerze, używa się przestrzeni nazw (namespace).

Dzięki temu, dwa procesy o tej samej przestrzeni nazw mogą widzieć zmiany odpowiednich zasobów. Odwrotnie, dwa procesy w dwóch różnych przestrzeniach nazw, są całkowicie odseparowane na poziomie zasobów kontrolowanych przez przestrzeń nazw.

 

Namespace Constant Isolates
IPC CLONE_NEWIPC System V IPC, kolejki komunikatów POSIX
Network CLONE_NEWNET Urządzenia sieciowe, stosy, porty itp.
Mount CLONE_NEWNS Punkty montowania
PID CLONE_NEWPID ID procesu
User CLONE_NEWUSER ID użytkownika i grupy
UTS CLONE_NEWUTS Nazwa hosta i nazwa domeny NIS

 

Cgroups

Cgroup są to grupy procesu. Cgroup posiadają różne kontrolery:

  • cpuacct: zliczanie zużytych zasobów procesora
  • memory: kontrola pamięci RAM i cache grupy
  • devices: zezwolenie lub odmowa dostępu do urządzenia peryferyjnego
  • net_cls: kontrola dostępu do sieci
  • blkio: kontrola dostępu do urządzeń peryferyjnych typu blokowego (dysk twardy…)
  • cpuset: przypisywanie zasobów procesorów oraz pamięci RAM

Dzięki temu, sterując tymi kontrolerami, można przypisać do kontenera zasoby oraz urządzenia peryferyjne, do których ma on dostęp.

Łącząc te trzy możliwości jądra linuxa, można utworzyć kontener, w którym można wykonać wszystkie procesy.

Wnioski

Zrozumienie działania kontenera jest wzbogacające.

Implementacja własnego runtime kontenera jest mniej praktyczne.

Narzędzia, takie jak Docker, pozwalają tworzyć obrazy, zarządzając siecią, bezpieczeństwem, wielosystemowością (windows, mac os), organizowaniem (docker swarm, kubernetes).

Kontekst

Piszę ten artykuł w związku z moim udziałem w Paris Containers Day. Miałem przyjemność uczestniczyć w wielu interesujących wystąpieniach, szczególnie Liz Rice, podczas którego przedstawiła live code podstawowego kontenera ze scratcha. Kod jest dostępny na: https://github.com/lizrice/containers-from-scratch

 

 

Bibliografia

https://www.systutorials.com/docs/linux/man/7-namespaces/

https://doc.ubuntu-fr.org/chroot

http://www.linuxembedded.fr/2011/03/bien-utiliser-les-cgroups/

 


Autor: Omar Naghmouchi Software Engineer
Kontenery
Paris Container Day