Każda aplikacja tworzy swoje procesy, wykorzystuje zasoby procesora, pamięci RAM, dysku twardego i korzysta z zależności względem innych elementów systemu.
Przenoszenie aplikacji, uruchamianie dodatkowych instancji, testowanie czy oddzielanie dla zapewnienia bezpieczeństwa i stabilności pociąga za sobą niebezpieczeństwo naruszenia istniejącej równowagi. Czy za każdym razem trzeba brać pod uwagę reinstalację aplikacji i przywracanie jej konfiguracji? A co, jeśli kopii będzie tysiąc, 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?
Tego typu bolączki rozwiązuje instalacja maszyny wirtualnej. Przenosi się ją bez większych problemów, a jednocześnie można dopasowywać zasoby, przydzielać adresację i izolować nowy system od innych. Tylko po co cały system, skoro potrzebna jest tylko aplikacja?
I tu właśnie w grę wchodzi konteneryzacja.
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ś hypervisor, czyli kontroler pracy kolejnej warstwy: maszyn wirtualnych. Maszyny te powtórnie wykorzystują system operacyjny, w formie warstwy najniższej. Wyżej znajdują się biblioteki i pliki binarne. Na samej górze stosu działa aplikacja.
Maszyny wirtualne są od siebie odizolowane, stanowiąc kompletne i niezależne środowisko. Przypisane do nich zasoby sprzętowe mogą być w znacznym stopniu dopasowywane przez administratora systemu. Jednak aplikacje uruchomione na maszynach wirtualnych mają mniejszą wydajność niż te uruchomione na fizycznym sprzęcie, tj. bez wykorzystania wirtualizacji. Dzieje się tak dlatego, że system operacyjny wirtualnej maszyny oraz hypervisor zużywają zasoby sprzętowe. Tak jak kupujący, który korzysta z wielu pośredników, musi się liczyć z wyższymi kosztami zakupu, tak każda kolejna warstwa abstrakcji, oddzielająca fizyczny sprzęt od aplikacji, powoduje spadek jej wydajności. Na szczęście jest sposób, by „odchudzić” warstwy abstrakcji.
Aplikacje w kontenerach
Podstawowym zamysłem konteneryzacji jest 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 umożliwia usunięcie zduplikowanego systemu operacyjnego i hypervisora, co radykalnie zmniejsza różnicę w wydajności pomiędzy aplikacją kontenerową a aplikacją działającą na fizycznym sprzęcie, przy zachowaniu skalowalności, przenośności i separacji instancji.
Należy jednak pamiętać, że konteneryzacja nie jest w żadnym wypadku następcą wirtualizacji, czy jakąś wersją 2.0. Stanowi ona za to lepszy i tańszy sposób na uelastycznienie ekosystemu IT, dostosowanie go do indywidualnych potrzeb biznesu oraz przygotowanie go na pracę zarówno lokalnie, jak i w chmurze.
Docker, Kubernetes i Docker Swarm
Wdrożenie konteneryzacji, a następnie zarządzanie tak zorganizowanym stosem wymaga odpowiedniej platformy. Niewątpliwie najbardziej znanym i najczęściej stosowanym narzędziem do konteneryzacji jest Docker. Jest to rozwiązanie open source oraz format pliku kontenera. Ze względu na swoją popularność technologia ta stała się wręcz synonimem słowa konteneryzacja.
Gdy kontenerów jest coraz więcej, i są rozmieszczone na wielu serwerach, przydaje się Kubernetes. Ta najpopularniejsza platforma do orkiestracji kontenerów została stworzona przez Google na własne potrzeby, a z czasem wydana jako oprogramowanie typu open source. Kubernetes służy do zarządzania, automatyzacji i skalowania aplikacji kontenerowych. Platforma umożliwia zarządzanie dużą liczbą instancji skonteneryzowanych aplikacji i oferuje własną, zintegrowaną formę load balancingu. Kubernetes umożliwia zarówno automatyzację, jak i tworzenie zadań deklaratywnych.
Kubernetes jest często porównywany z rozwiązaniem Docker Swarm, technologią orkiestracji platformy Docker. To drugie rozwiązanie, choć pozwala na mniejszą elastyczność, wymaga dużo mniej konfiguracji, oferuje szybszy proces wydawniczy i jest prostsze w obsłudze. Wybór między tymi dwoma rozwiązaniami często zależy od preferencji zespołu DevOps i potrzeb samego projektu.
SoDA w chmurach
Ze względu na korzystny bilans wad i zalet, w obliczu zwiększających się wymagań dla biznesowego IT, konteneryzacja i orkiestracja to niezwykle dynamicznie rozwijające się dziedziny informatyki.
Przy realizacji projektów konteneryzacji aplikacji i przenoszeniu aplikacji do chmury współpracujemy z 5 firmami partnerskimi z Software Development Association (SoDA). Każda z tych firm ma swoją specyfikę i specjalizację, dzięki czemu jesteśmy w stanie precyzyjnie dobrać kompetencje partnera do konkretnego projektu:
- Specjalizacja w aplikacjach, stosie technologicznym opartym na Javie i z kompleksowo przemyślanym procesem budowania aplikacji, w zgodzie z Continuous Integration / Continuous Delivery. Oferujemy również solidną strategię testów opartą na standardowej piramidzie, uwzględniającą repozytorium artefaktów w oparciu o Nexus, a także budowanie farm kontenerowych w oparciu o Docker Swarm.
- Specjalizacja w chmurze AWS, w tym procesy CI/CD oparte na GitLab Pipelines ze wsparciem Jenkins do uruchamiania skryptów systemu operacyjnego.
- Specjalizacja w pokryciu procesu CI testami automatycznymi, wydajnościowymi i obciążeniowymi. Oferujemy również doradztwo przy budowaniu strategii testów na potrzeby procesów CI.
- Specjalizacja w chmurze Google, z dużym zaangażowaniem w proces tworzenia chmury krajowej. Przenosimy aplikacje oparte na technologii Java do chmury. Nasz partner dysponuje certyfikatami Kubernetes na administrację oraz development.
- Specjalizacja w chmurze Ms Azure. Oferujemy pełne pokrycie procesu CI/CD przy pomocy Azure DevOps i Azure Pipelines ze wsparciem Jenkins, GitLabs, Bamboo oraz Concourse – tam, gdzie ich zastosowanie jest wskazane. Zapewniamy pełną dowolność wyboru pomiędzy Kubernetes i Docker Swarm. Stosujemy Azure Artifacts lub Artifactory jako repozytorium artefaktów. Specjalizujemy się w przenoszeniu aplikacji do chmury w stosie technologicznym .NET, ale mamy doświadczenie również w środowiskach aplikacji opartych na różnych stosach technologicznych.
Dzięki konteneryzacji możemy budować na platformach chmurowych farmy mikroserwisów, umożliwiających łatwe przenoszenie aplikacji i praktycznie nieograniczone dostosowywanie wykorzystywanych zasobów do obciążenia.
Z kolei dobór partnerów z różnorodnymi kompetencjami pozwala nam realizować projekty wdrażania nawet bardzo zaawansowanych procesów CI/CD czy przenoszenia aplikacji do chmury.