Jak podejść do konteneryzacji w chmurze Microsoft Azure

Konteneryzacja aplikacji to pojęcie, które w ostatnim czasie staje się coraz bardziej popularne, pomimo faktu, że ma swoje lata. Rozwój platform chmurowych dostarcza nowych narzędzi oraz usług, które znacznie ułatwiają i przyśpieszają tworzenie aplikacji opartych o platformę Docker. Czym dokładnie jest konteneryzacja oraz jakie możliwości pod tym kątem oferuje chmura Microsoft Azure?


Daniel Krzyczkowski. Senior Software Developera w Predica. Wielokrotnie nagradzany tytułem Microsoft Most Valuable Professional (MVP). Regularnie występuje jako prelegent na konferencjach krajowych i zagranicznych. Prowadzi swojego bloga: DevIsland oraz regularnie publikuje kod źródłowy projektów, które realizuje poza pracą na swoim profilu platformy w serwisie GitHub.


Ilość zagadnień związanych z konteneryzacją aplikacji jest dość obszerna, natomiast warto znać podstawy, dlatego zanim wejdziemy w tematy związane z dedykowanymi usługami dla kontenerów na platformie chmurowej Microsoft Azure, opiszemy czym jest Docker i Kontener.

Docker

Docker jest otwartą platformą kontenerową dla programistów i administratorów do budowania, wysyłania i uruchamiania aplikacji rozproszonych. Umożliwia pakowanie i wdrażanie aplikacji lub usługi jako izolowanej jednostki zawierającej wszystkie zależności niezależnie od tego, czy są to lokalne komputery, maszyny wirtualne centrów danych czy chmura taka jak Microsoft Azure. Docker jest niezależny systemowo. Oznacza to, że możemy z niego korzystać zarówno na komputerach z systemem Windows jak i MacOS, czy Linux.

Obraz (Docker image)

Obraz kontenera należy rozumieć jako zamkniętą skrzynkę, zawierającą wszystkie zależności i informacje wymagane do utworzenia instancji kontenera. Obraz jest definiowany przez plik DockerFile i po zbudowaniu staje się niezmienny. Obrazy mogą dziedziczyć konfigurację z innych obrazów — tak samo jak w klasie .NET można rozszerzyć kolejną klasę. To zapewnia znacznie szybsze tworzenie kolejnych, nowych obrazów. Przykładowy obraz z aplikacją Hello World dostępny jest w publicznym repozytorium Docker Hub. Warto wspomnieć, że istnieją dwa typy kontenerów: Windows oraz Linux (te drugie z racji dłuższej kadencji są bardziej dojrzałe).

Kontener

Kontener Dockerowy jest instancją obrazu Docker i reprezentuje wykonanie pojedynczej aplikacji, procesu lub usługi. Możliwe jest utworzenie wiele instancji kontenera z tego samego obrazu.

Chmura Microsoft Azure

Microsoft Azure jest jedną z dostępnych na rynku platform chmurowych. Oferuje wszystkie trzy typy usług – Platform as a Service, Infrastructure as a Service oraz Software as a Service. Tworzenie aplikacji przy użyciu chmury Azure jest znacznie szybsze i nie wymaga tak dużego nakładu czasowego, jak w przypadku samodzielnej konfiguracji określonych usług na własnej maszynie. Ten artykuł jest poświęcony usługom do uruchamiania skonteneryzowanych aplikacji, zbudowanych na platformie Docker.

Azure Container Registry

Azure Container Registry (ACR) to prywatne repozytorium w chmurze Azure, które umożliwia przetrzymywanie obrazów platformy Docker. Poniższa ilustracja przedstawia proces zapisywania obrazu platformy Docker w repozytorium ACR.

W chmurze Azure dostępne są cztery główne usługi, które zapewniają uruchamianie skonteneryzowanych aplikacji. Omówienie każdej z nich znajduje się poniżej.

Azure Container Instances

Usługa Azure Container Instances udostępnia najszybszą drogę do uruchamiania skonteneryzowanych aplikacji platformy Docker. Dostępna jest w modelu „serverless”, co oznacza, że programista nie musi martwić się o stworzenie odpowiedniej infrastruktury (maszyna z systemem, odpowiednie oprogramowanie itp.). Można wykorzystać ją do szybkiego sprawdzenia, jak działa nasza aplikacja po uruchomieniu w kontenerze platformy Docker. Konfiguracja nie wymaga specjalistycznej wiedzy, a większość elementów konfiguracji wyklikujemy w portalu chmury Microsoft Azure.

Warto wspomnieć, że koszt usługi Azure Container Instance jest związany tylko i wyłącznie z czasem działania kontenerów. Mówiąc wprost – płacimy za usługę tylko wtedy, kiedy nasza skonteneryzowana aplikacja jest uruchomiona. To niesie ze sobą również konsekwencje – jeśli nasza aplikacja składa się z wielu kontenerów oraz musi chodzić nieustannie, rozwiązanie to może okazać się kosztowne.

Zarządzanie samą usługą jest również bardzo proste. Mamy do dyspozycji zarówno SDK w języku C#, jak i narzędzia dla konsoli PowerShell. Istnieje możliwość ustawiania publicznych portów, publicznej domeny, czy połączenia z repozytorium GIT w celu pobrania kodu źródłowego dla kontenerów.

Dostępna jest także dokumentacja, która pozwala w szybki sposób rozpocząć pracę z Azure Container Instances.

Azure Web Apps for Containers

Usługa Azure Web Apps for Containers została stworzona w celu zapewnienia większej elastyczności jeśli chodzi o aplikacje oraz wykorzystywane przez nie frameworki. Oznacza to, że deweloper sam decyduje, której wersji danego frameworka chce użyć do tworzenia swojej aplikacji – jak wspomniałem wcześniej, w kontenerze znajduje się aplikacja oraz jej wszystkie zależności, więc mamy pełną izolację. W standardowej wersji usługa Azure Web App narzuca wersję określonych frameworków oraz bibliotek, więc deweloper nie ma całkowitej pewności, że aplikacja zachowa się identycznie na lokalnej maszynie oraz maszynie wirtualnej w chmurze.

Narzędzia platformy Docker są w pełni kompatybilne z Azure Web Apps for Containers. Istnieje możliwość automatycznego uruchamiania kontenerów, których obrazy znajdują się we wspomnianym wcześniej, prywatnym repozytorium, Azure Container Registry (ACR).

Zarządzanie samą usługą jest również bardzo proste. Mamy do dyspozycji zarówno narzędzia dla konsoli PowerShell, jak i możliwość konfiguracji bezpośrednio w portalu Microsoft Azure. Tutaj również dostępna jest dokumentacja, która pozwala w szybki sposób rozpocząć pracę z usługą Azure Web Apps for Containers.

Azure Kubernetes Service (AKS)

Zanim przystąpię do omówienia usługi Azure Kubernetes Service, warto wspomnieć, czym jest sam Kubernetes.

Kubernetes to system typu open-source do automatyzacji wdrażania, skalowania i zarządzania kontenerowymi aplikacjami. Jest również nazywany „orkiestratorem kontenerów”, ponieważ umożliwia zarządzanie grupami uruchomionych kontenerów i ich cyklem życia. Azure Kubernetes Service to usługa na platformie chmurowej Azure, która znacznie ułatwia proces konfiguracji oraz uruchomienia Kubernetesa. AKS jest w pełni kompatybilny z format obrazów Docker, dzięki temu umożliwia ich zarządzanie. Działa również w połączeniu z Azure Container Registry, dlatego kontenery z aplikacjami mogą być pobierane i uruchamiane automatycznie.

Kontenery platformy Docker działają na Podach. Pod jest abstrakcją, która reprezentuje grupę jednego lub więcej kontenerów aplikacji (w naszym przypadku Docker) i kilka wspólnych zasobów dla takich kontenerów jak: współużytkowana pamięć masowa lub sieć. Node jest hostem dla Podów – może to być maszyna wirtualna, jak i fizyczna maszyna. Nod’y są zebrane w Klaster.

Podsumowując, w Klastrze działają Nody, na których wewnątrz Podów działają kontenery platformy Docker. Zarządzanie aplikacjami, które składają się z dużej ilości kontenerów jest znacznie łatwiejsze przy wykorzystaniu usługi Azure Kubernetes Service. Jednym z przykładów zalet może być automatyczne, ponowne uruchomienie kontenera z aplikacją, która przestała działać poprawnie – np. jeśli wystąpił błąd podczas przetwarzania danych. AKS ułatwia również inne aspekty takie jak konfiguracja sieciowa, komunikacja między Node’ami, czy zwiększenie mocy obliczeniowej Klastra. Warto wspomnieć, że w tym przypadku koszt związany jest z zasobami wykorzystywanymi przez maszyny wirtualnie, nie z ilością kontenerów.

Tutaj również dostępna jest dokumentacja, która pozwala w szybki sposób rozpocząć pracę z usługą Azure Kubernetes Service.

Azure Service Fabric

Usługa Azure Service Fabric, podobnie jak Azure Kubernetes Service, została stworzona przez firmę Microsoft do automatycznego wdrażania oraz zarządzania kontenerowymi aplikacjami. Warto wspomnieć, że jest to dojrzała platforma do zarządzania kontenerami systemu Windows, natomiast oczywiście wspiera również kontenery oparte o system Linux.

Azure Service Fabric również składa się z Klastra maszyn wirtualnych, które są odpowiedzialne za uruchamianie i zarządzanie cyklem życia kontenerowych aplikacji. Istotny jest fakt, że aplikacje nie muszą być oparte o platformę Docker. Podobnie jak w przypadku Kubernetesa jest możliwość monitorowania kondycji aplikacji oraz konfigurowania polityk dotyczących automatycznych napraw, jeśli któryś z kontenerów przestanie działać. W tym przypadku koszt również związany jest z zasobami wykorzystywanymi przez maszyny wirtualnie, nie z ilością uruchamianych kontenerów.

Azure Service Fabric dostarcza narzędzia zarówno dla deweloperów platformy .NET, jak i dla tych pracujących na systemie Linux – w tym przypadku jest to SDK w języku Java. Tutaj również dostępna jest dokumentacja, która pozwala w szybki sposób rozpocząć pracę z usługą Azure Service Fabric.

Wykorzystanie w praktyce

Wykorzystanie każdej z usług zależy ściśle od konkretnego przypadku, a dokładniej projektu (jego charakterystyki), w którym je wykorzystamy. W moim przypadku oraz w projekcie, który realizujemy wspólnie z zespołem korzystamy z dwóch wyżej opisanych usług dostępnych w chmurze Microsoft Azure.

Azure Kubernetes Service (AKS) zastosowaliśmy w projekcie z architekturą mikroserwisów. Projekt związany jest z bankowością, a ilość różnych serwisów dostarczających określone dane jest spora. Mając około 15 mikroserwisów, zależało nam na zautomatyzowaniu procesu zarządzania nimi, a w tym przypadku ASK sprawdza się całkiem dobrze. Serwisy te są napisane w technologii ASP .NET Core oraz hostowane właśnie jako kontenery platformy Docker. Na każdym z Podów (o których pisałem w sekcji związanej z Kubernetesem) stworzyliśmy 3 instancje kontenerów każdego z mikroserwisów, co zapewnia wysoką dostępność oraz możliwość obsługi dużej liczby zapytań dla backendu. AKS pozwolił nam na sprawne zarządzanie strukturą backendu również ze względu na przydatne informacje dotyczące wydajności – jeśli któryś z mikroserwisów przestaje działać poprawnie, my jesteśmy w stanie w krótkim czasie sprawdzić, co dokładnie się stało.

Azure Container Instances wykorzystujemy natomiast do wykonywania krótkich testów aplikacji Dockerowych. Tworząc mikroserwis jesteśmy w stanie w bardzo krótkim opublikować go i udostępnić w chmurze na potrzeby testów oraz weryfikacji, jak zachowa się na innym środowisku. Realny przykład – jeśli w aplikacji webowej zaimplementowany został kolejny ekran do wyświetlania danych. Jako backend team możemy w szybki sposób dostarczyć frontend deweloperowi testowy backend, który te dane dostarczy. W tym przypadku Azure Container Instances sprawdzają się świetnie, ponieważ publikowanie aplikacji zajmuje mało czasu, a koszt związany jest z czasem działania kontenerów – zaraz po testach je usuwamy, więc jest niski.

Podsumowanie

Dzięki konteneryzacji aplikacje wraz ze wszystkimi zależnościami są pakowane do obrazu na platformie Docker, co zapewnia łatwą przenaszalność z jednej maszyny na drugą. Jest to bardzo duża zaleta, ponieważ mamy pewność, że nasza aplikacja zachowa się dokładnie tak samo, niezależnie, czy jest uruchomiona na lokalnej maszynie, czy wirtualnej maszynie. Platforma Microsoft Azure zapewnia wsparcie dla uruchamiania skonteneryzowanych aplikacji. Od nas zależy, którą z usług wybierzemy, czy będzie to Azure Container Instances do krótkotrwałego uruchamiania i testowania aplikacji, czy Azure Kubernetes Service do zarządzania całym cyklem życia kontenerów, włączając w to ich wdrażanie oraz uruchamianie.

Patronujemy

 
 
Polecamy
Of CORS it’s safe. Zabezpieczenie przed odczytem danych przez obcy serwer