Kontejnery v oblacích – jak je využít v cloudu?

Slovo kontejner se dnes poměrně často vyskytuje v jedné větě se slovem cloud. Proč tomu tak je? Proč se kontejnery tak často používají právě v cloudu? Pojďme si vysvětlit historii a výhody kontejnerizace a podívat se, jak je využijeme v cloudu.

Kamil Vratný

Trocha historie: Kontejnerizační technologie máme k dispozici už od konce 70. let minulého století, ale masivní rozšíření kontejnerů začalo s příchodem nástroje Docker na Linuxu.

Docker

Když se Docker v roce 2013 objevil, okamžitě si získal velkou popularitu, hlavně díky kompletní sadě nástrojů pro vytváření, spouštění, správu, distribuci i orchestraci kontejnerů. Docker je součástí většiny linuxových distribucí, ale lze ho používat i na dalších operačních systémech. Pro publikování a distribuci kontejnerů lze používat veřejnou repository Docker Hub.

Docker je stále hlavním hráčem na poli kontejnerů, ale v poslední době se objevuje významná konkurence v podobě více specializovaných nástrojů PodmanBuildahSkopeo a dalších. Další změnou je to, že Containerd, původně součást Dockeru, se stal samostatným projektem v rámci Cloud Native Computing Foundation. Hlavní konkurenční výhodou Dockeru je ale stále šíře záběru a kompletnost poskytovaných nástrojů.

O standardy formátu kontejnerů se stará Open Container Initiative, projekt pod Linux Foundation. Docker kontejnery lze ale provozovat i na platformě Windows Server (2016 nebo 2019).

K čemu nám ty kontejnery vlastně jsou?

Dalo by se říct, že kontejnery jsou dalším logickým krokem v distribuci a správě aplikací po velkém rozšíření virtuálních strojů (dále VM) po roce 2000.

Virtualizace počítače umožnila významné zjednodušení nasazení aplikací a zefektivnění využívání zdrojů. Přinesla s sebou ale i nutnost provozovat velké množství operačních systémů. Operační systém je něco, co sice pro provoz aplikace nutně potřebujeme, ale co samo o sobě nepřináší žádný přímý užitek.

Obraz disku VM má v sobě uložené soubory potřebné pro běh aplikace a operační systém. Kontejner naproti tomu obsahuje jen soubory potřebné pro běh aplikace, operační systém nikoliv. Vidět to můžeme na následujícím obrázku:

Obraz disku VM | Encyklopedie cloudu ORBIT
Obraz disku VM (docker.com)

Představme si, že se skutečně jedná o dva fyzické servery. Zatímco aplikace A–F nalevo běží v kontejnerech na jediném sdíleném operačním systému, aplikace A–C napravo mají každá svůj operační systém. Když si porovnáme oba scénáře, řešení s kontejnery nalevo nám přináší některé podstatné výhody:

  • Operační systém je spuštěn jen jednou, spotřebovává tedy asi třikrát méně CPU a RAM.
  • OS byl instalován jen jednou, ušetřili jsme tedy čas (byť to třeba bylo provedeno automatizovaně) a gigabajty diskové kapacity.
  • Velikost diskového obrazu kontejneru je dramaticky (třeba 100×) menší než velikost diskového obrazu OS s aplikací.
  • Díky těmto úsporám jsme schopni na stejném hardwaru provozovat více aplikací.

Ještě důležitější než úspory na hardwarových zdrojích jsou ale další vlastnosti kontejnerů:

  • Díky malé velikosti obrazu kontejneru jsme schopni kontejner velmi rychle někam nahrát a spustit. Spuštění kontejneru trvá řádově sekundy (spuštění VM s aplikací obvykle minuty). Pokud např. selže server, aplikace může již za několik sekund běžet na jiném. Pokud se výrazně zvýší počet požadavků na aplikaci, můžeme její kontejner velmi rychle spustit na dalších serverech, a tím škálovat výkon.
  • Správně vytvořený kontejner je jasnou definicí toho, jak aplikace vypadá a jaké používá závislosti. Máme jistotu, že každé spuštění kontejneru vede ke stejnému výsledku, protože spuštění probíhá automaticky.
  • Kontejnerizované aplikace je možné spouštět na různých platformách on-premises i v cloudu. Kontejnery jsou velmi dobře přenositelné.
  • Kontejnery zjednodušují některé síťové záležitosti (např. kontejner mohu spustit bez přidělení další IP adresy).
  • Kontejnery se dobře integrují s vývojovými nástroji. Výsledkem dobře připravené vývojové linky mohou být automaticky vytvořené obrazy kontejnerů čekající netrpělivě na spuštění.
  • Použití kontejnerů může v některých scénářích vést i k licenčním úsporám.

Asi nejjednodušší myslitelný kontejner se jmenuje hello-world a je ke stažení na Docker Hubu. Pokud máte nainstalovaný Docker, můžete si tento kontejner spustit jediným příkazem: docker run hello-world:

Co se vlastně přesně stalo? Proběhlo několik činností:

  • Docker zjistil, že obraz kontejneru hello-world není lokálně k dispozici (sami bychom to zjistili příkazem docker images).
  • Docker si potřebný obraz kontejneru stáhl z Docker Hubu (docker pull).
  • Docker vytvořil novou instanci kontejneru ze staženého obrazu a spustil ji (docker run).
  • Kontejner se po dokončení úlohy v něm také ukončil (instance kontejneru je ve stavu Exited).

A jak vlastně vypadá samotný obraz kontejneru? Není to nic komplikovaného, v podstatě se jedná o archiv souborů a metadat, obvykle s více vrstvami odpovídajícími prováděným úpravám. Podívat se dovnitř lze třeba pomocí docker image save nebo pomocí nástroje dive. Kontejner hello-world obsahuje kromě metadat jediný soubor nazvaný hello:

Kontejner hello-world metadata | Kontejnery v oblacích | Encyklopedie cloudu ORBIT

Takže pro spouštění kontejnerů potřebuji jen HW, OS a Docker (například)? Teoreticky ano, ale typické nasazení kontejnerů v praxi většinou vypadá tak, že kontejnery spouštíme v OS běžícím ve VM, čímž využíváme předností obou technologií:

Kontejnery Virtual Machine | Encyklopedie cloudu ORBIT
Kontejnery Virtual Machine (docker.com)

Orchestrace kontejnerů

Orchestrace kontejnerů je automatizace některých činností, které souvisejí s provozem kontejnerů. Tyto činnosti lze sice teoreticky provádět ručně, ale teprve jejich automatizací plně využijeme výhod, které nám kontejnery přinášejí. Jedná se zejména o tyto činnosti:

  • Distribuce obrazů kontejnerů
  • Centrální konfigurace, plánování úloh
  • Alokace zdrojů, spouštění a ukončování kontejnerů
  • Vysoká dostupnost (v případě poruchy jednoho serveru je aplikace nadále dostupná)
  • Horizontální škálování (aplikace běží ve více paralelních instancích)
  • Síťové služby (discovery služeb, IP adresy, porty, balancování, routování)
  • Monitoring, health checks

Swarm

Swarm je orchestrační nástroj, který je distribuován s Dockerem. Je to tedy svým způsobem nejjednodušší cesta, už proto, že konfigurace Swarmu je relativně jednoduchá. Uzly clusteru se dělí na dva typy – Manager a Worker:

Swarm | Encyklopedie cloudu ORBIT
Swarm (docker.com)

Firma Mirantis, vlastník Docker Enterprise, nadále podporuje vývoj Swarmu, přestože se sama v cloudu nyní zaměřuje víc na Kubernetes.

Kubernetes

Kubernetes (také K8s) v současné době představuje de facto standard pro orchestraci kontejnerů. Vyvinula ho (původně pro své interní potřeby, první verze vyšla v roce 2015) firma Google. Kubernetes cluster používá dva hlavní typy nodů – Control plane a Worker node:

Kubernetes | Encyklopedie cloudu ORBIT
Kubernetes (kubernetes.io)

Kubernetes je sice open source projekt, ale k dispozici je komerční podpora od více významných softwarových společností – Red Hat, Rancher (SUSE), VMware a dalších.

Red Hat OpenShift

OpenShift je komerční produkt Red Hatu, který zahrnuje kromě samotného Kubernetes Enginu ještě Container Platform a Advanced Cluster Management. Počet zahrnutých služeb je tak velký, že by vydal na samostatný článek.

Red Hat OpenShift | Encyklopedie cloudu ORBIT
Red Hat OpenShift (redhat.com)

Komunitní open source varianta OpenShiftu (bez některých funkcí) se jmenuje OKD.

Jak kontejnerizovat aplikaci?

Z téměř jakékoliv existující aplikace (pokud nějak nevyužívá přímo HW zdroje) lze udělat kontejner. Mnohem lepší ale je, pokud byla aplikace již od začátku vyvíjena se záměrem ji jako kontejner provozovat. Z toho vyplývají některé vlastnosti, které by taková aplikace ideálně měla mít:

  • Aplikace by měla být bezstavová, v kontejneru samotném by neměla být uložena data (ta mají být v samostatném úložišti – v databázi, ve sdílené cache, na sdíleném disku, na sdíleném souborovém systému atp.).
  • Aplikace by měla jít kdykoliv beztrestně a rychle ukončit a měla by jít snadno a rychle spustit.
  • Aplikace by měla umožňovat paralelní běh, aby ji bylo možno škálovat.
  • Aplikace by měla dělat jen jednu věc (koncept mikroslužeb).
  • Konfigurace aplikace by se měla předávat pomocí proměnných prostředí (konfigurace tedy není součástí kontejneru).

Ale i kontejnerizace legacy aplikací může v překvapivě mnoha případech dávat smysl – přínosy mohou být například:

  • automatizace a zrychlení vývoje a nasazení,
  • zjednodušení činností souvisejících s provozem aplikace,
  • snížení HW náročnosti,
  • snazší nasazení v cloudu,
  • tlak na modernizaci aplikací v organizaci.

Způsob vytvoření kontejneru závisí na použitém nástroji. Obraz kontejneru se obvykle vytváří tak, že se vezme existující obraz a z něj se odvodí obraz nový – přidáním aplikačních souborů a závislostí. V případě Dockeru bychom např. použili soubor Dockerfile (pro definici úprav, které se na kontejneru provedou) a příkaz docker build pro vytvoření obrazu.

Často ale existuje mnohem jednodušší cesta – využít již existující hotový obraz kontejneru. V takovém případě mi prostě stačí spustit kontejner s patřičnými parametry, případně připojit potřebný volume.

Kontejnery v cloudu

Konečně jsme se dostali i ke cloudu: jak tedy cloud souvisí s kontejnery? Pokud máme připraven obraz kontejneru, jsme ho schopni relativně snadno nasadit a provozovat v cloudu. Kontejnerizovaná aplikace má navíc vlastnosti (uvedené výše), které provoz v cloudu usnadňují, a to bez ohledu na zvoleného cloud providera.

Které konkrétní služby cloudu můžeme dnes pro provoz kontejnerů využít? Podívejme se na dva největší poskytovatele cloudu:

AWS (Amazon Web Services)

Amazon Web Services obsahuje několik služeb, které umožňují spuštění kontejnerových aplikací, ale liší se způsobem nasazení a funkcemi. Popíšeme si registr ECR, téměř serverless Fargate, standardní ECS a EKS s použitím Kubernetes, LambduElastic Beanstalk a také možnost provozování Red Hat platformy OpenShift přímo na AWS službách.

ECR

Elastic Container Registry je vysoce dostupná služba, která umožňuje ukládání a sdílení obrazů kontejnerů. Přístup ke kontejnerům je řízen přístupovými právy. Spravován je celý životní cyklus obrazu kontejneru – verzování, tagy, archivace. Kontejnery uložené v ECR je možné používat v dalších službách AWS (viz níže) nebo je prostě distribuovat, kam je potřeba:

Elastic Container Registry | Encyklopedie cloudu ORBIT
Elastic Container Registry

Repository vytvořená v ECR mohou být veřejná nebo soukromá, obrazy lze automaticky nebo ručně skenovat na zranitelnosti a šifrovat je.

Platí se za přenesená data, poměrně velký objem je ale každý měsíc zdarma.

Fargate

Fargate je velmi zajímavá služba AWS umožňující běh „serverless“ kontejnerů. To znamená, že nemusím řešit, na kterém serveru se daný kontejner nebo kontejnery spustí, ale jen nadefinuji požadované HW prostředky a OS. (Jako operační systém je použit Amazon Linux 2 nebo Windows 2019.) AWS už pak nějak zařídí, že kontejner je spuštěn a prostředky má k dispozici.

Služba je zpoplatněna na základě CPU a RAM za hodinu, v případě Windows se ještě platí za licenci OS. Fargate nelze použít samostatně, ale jen v kombinaci s ECS nebo EKS, kde Fargate vyberu jako možnost, jak kontejner spustit.

ECS

Elastic Container Service firma Amazon realizovala svou představu o tom, jak by měla vypadat cloudová služba pro běh kontejnerů. Pokud nemáme zvláštní požadavky z hlediska správy clusteru a nevadí nám jistá specifičnost ECS, je to asi jednodušší cesta.

Elastic Container Service | Encyklopedie cloudu ORBIT
Elastic Container Service (amazon.com)

Řízení clusteru (komunikaci s agenty na nodech, API, úložiště konfigurace) zajišťuje samotná služba ECS, tu nám tedy stačí jen nakonfigurovat a nemusíme se starat, kde běží. Pracovní uzly ECS clusteru jsou pak realizovány jako EC2 instance nebo pomocí Fargate.

Služba ECS je poskytována zdarma, ale platí se za další využité zdroje AWS (např. EC2).

EKS

Elastic Kubernetes Service je služba především pro ty, kteří chtějí cloudovou službu kompatibilní s Kubernetem. Mohou tedy nadále používat obvyklé nástroje, např. kubectl.

Elastic Kubernetes Service | Encyklopedie cloudu ORBIT
Elastic Kubernetes Service (amazon.com)

Control plane Kubernetu, který bychom museli sami relativně složitě konfigurovat, je k dispozici jako vysoce dostupná služba AWS.

Worker nodes pak mohou být realizovány pomocí:

  • EC2 (managed node groups nebo self-managed nodes)
  • Fargate

EKS se platí za hodinu a cluster, opět je třeba zaplatit využité zdroje AWS (např. EC2).

Lambda

Lambda je služba, která umožňuje spuštění serverless kódu v cloudu. Obvykle se používá pro zavolání jednoduché konkrétní funkce reagující na událost, ale jedna z možností, jak lambdu v AWS nakonfigurovat, je i vybrat si kontejner, který bude požadovanou funkci provádět. Pro některé komplikovanější věci vyžadující dodatečné integrační knihovny (ty můžu mít připravené v kontejneru) to může být ta správná cesta.

V případě Lambdy se platí za spotřebovaný čas a použitou RAM, první milión spuštění je každý měsíc zdarma.

Elastic Beanstalk

Elastic Beanstalk je spravovaná služba umožňující provoz webových aplikací různých druhů, jednou z variant je i provoz aplikace vytvořené jako kontejner.

Elastic Beanstalk není zpoplatněn, platí se za využité zdroje.

Red Hat OpenShift on AWS (ROSA)

Pokud chceme, můžeme v AWS cloudu provozovat i kompletní platformu Red Hat OpenShift. Je to realizováno pomocí Quick Startu, což je automatické nasazení všech potřebných zdrojů v AWS podle šablon (CloudFormation). Instalace zajistí nasazení tří control plane nodes a proměnného počtu worker nodes.

Zpoplatněny jsou využité zdroje AWS (např. EC2) a je nutno mít koupené předplatné Red Hat OpenShiftu.

Microsoft Azure

I Microsoft Azure nabízí řadu služeb, které umožnují provozování kontejnerů. Podíváme se na register ACRContainer InstancesAKSApp FunctionApp Service a opět na možnost provozování Red Hat OpenShift přímo v Azure.

Azure Container Registry

Azure Container Registry umožňují podobně jako AWS ECR ukládání a distribuci obrazů kontejnerů.

Azure Container Registry | Encyklopedie cloudu ORBIT
Azure Container Registry (microsoft.com)

Azure Container Instances

Azure Container Instances umožnují spouštění Linux i Windows kontejnerů bez nutnosti zřizovat virtuální servery, podobně jako to dělá služba AWS Fargate. Azure Container Instances ale současně umožňují kontejnery na základě definovaných pravidel rovnou nasadit.

Azure Container Instances | Encyklopedie cloudu ORBIT
Azure Container Instances (microsoft.com)

Zpoplatněny jsou CPU a RAM za časovou jednotku, v případě Windows kontejneru je ještě připočítána licence za OS.

AKS

Azure Kubernetes Service je služba poskytující Kubernetes clustery v Azure, podobně jako EKS od AWS.

Azure Kubernetes Service | Encyklopedie cloudu ORBIT
Azure Kubernetes Service (microsoft.com)

Za AKS clustery se neplatí, pouze za další spotřebované prostředky Azure.

Azure Functions

Azure Functions jsou obdoba AWS Lambda a rovněž umožňují spuštění serverless kódu i v podobě kontejneru. Platí se za čas a využitou RAM, každý měsíc je relativně velké množství požadavků zdarma.

Azure App Service

App Service je služba umožňující provoz webových aplikací různých typů, včetně těch kontejnerizovaných. Služba je zpoplatněna podle přidělených hardwarových zdrojů.

Azure Red Hat OpenShift

Obdobně jako v AWS je možno v Azure nasadit kompletní spravovanou infrastrukturu OpenShiftu, kterou v cloudu provozuje Microsoft ve spolupráci s Red Hatem.

Kontejnery stručně

Kontejnery jsou technologií, která již dosáhla dostatečné úrovně zralosti a která má nezpochybnitelné přínosy pro vývoj i provoz aplikací – v privátním datacentru i v cloudu. Máme k dispozici mnoho možností, jak kontejnery efektivně provozovat, některé z nich jsme si dnes představili.

Dalším možným logickým krokem je serverless architektura, o které si můžete něco přečíst zde. Za pozornost ale určitě stojí i další články z Encyklopedie cloudu.

O autorovi
Kamil Vrátný
Kamil Vrátný

IT Consultant | LinkedIn

Kamil je integrátor a instruktor s bohatými zkušenostmi s mnoha technologiemi a platformami. Zabývá se především cloudem, virtualizací, identity a access managementem, vývojem systémových aplikací a Linuxem.