Serverový orchestrátor: co je Kubernetes a jak funguje | robot_dreams Czech
should_authorize_via_email
email.input_code tel.input_code
 
email.code_actual_for tel.code_actual_for
apply_exit_text
session_ended
to_homepage
Serverový orchestrátor: co je Kubernetes a jak funguje

Serverový orchestrátor: co je Kubernetes a jak funguje

Příručka od robot_dreams s příkladem syntaxe

Dnes si povíme něco o Kubernetes, výkonné platformě pro orchestraci a automatizaci kontejnerových aplikací. Dozvíš se, kdy se používá a jaká je její architektura.

Nejprve si však vysvětlíme základní termíny, včetně toho, co je to kontejner a orchestrace a k čemu se používá Docker.

Jak se objevila myšlenka kontejneru a co je to kontejner?

Na začátku existence internetu, kdy se podnikům naskytla možnost přejít na online prostředí, se začaly ve velkém objevovat webové aplikace. Aby tehdejší programátoři využili jejich možností, spouštěli tyto aplikace přímo ze serveru. S rostoucím počtem uživatelů museli splňovat požadavky na škálovatelnost aplikací, náklady na údržbu serverového hardwaru a spolehlivost.

Jako řešení tohoto problému byla vynalezena technologie virtualizace strojů. Společnost VMWare tak koncem devadesátých let vydala nástroj nazvaný VMware Virtual Platform, který umožňoval rozdělit serverové prostředky na samostatně fungující části neboli virtuální stroje.

Každá taková část má vlastní operační systém a každá část používá vlastní část paměti RAM a úložiště s vlastními nainstalovanými aplikacemi. Virtuální stroje jsou navzájem izolovány, což umožňuje provozovat na jednom serveru několik virtuálních strojů najednou.

Struktura virtuálních strojů

Virtuální stroje se snadno spravují – nezáleží na tom, na jakém hardwaru aplikace běží, pokud odpovídá instrukční sada procesoru a je k dispozici dostatek prostředků (paměť RAM, místo na harddisku atd.). Virtuální server lze snadno přesunout z jednoho fyzického serveru na jiný. Navíc často ani nevyžaduje zastavení aplikací.

Hostingové společnosti začaly poskytovat služby VDS (virtual dedicated server), což je služba virtuálního dedikovaného serveru. Jedná se o platformu, která zákazníkům poskytuje vyhrazené serverové prostředky bez nutnosti nákupu fyzického hardwaru.

Virtuální dedikovaný server poskytuje vysoký výkon, zabezpečení a flexibilitu a umožňuje zákazníkům škálovat své zdroje podle potřeby. Hostitel tak disponuje velkým počtem serverů a firmy mohou tuto službu poskytovat relativně levně (ve srovnání s nákupem fyzického serveru).

S příchodem virtuálních strojů nastala éra cloud computingu. Za pronájem virtuálního serveru bylo možné utratit pár dolarů a velké podniky mohly ušetřit peníze za údržbu své infrastruktury.

Problém virtuálního stroje a jak jej řeší kontejner

Na každém virtuálním stroji běží jádro operačního systému (například Linux nebo Windows). Pro jednu aplikaci je běh vlastního jádra operačního systému z hlediska spotřeby prostředků poměrně nerentabilní. Řešením tohoto problému byl vznik mechanismu pro používání kontejnerů.

Podstata kontejneru je stejná jako u virtuálního stroje: aplikace spouštíme izolovaně od ostatních. Při použití kontejnerů však na každém z nich nespouštíme jádro operačního systému.

Struktura kontejneru

Izolaci kontejnerů zajišťují integrované nástroje stávajícího operačního systému. Například Linux má namespaces a cgroups. Pokud tedy nejsou vyžadovány speciální funkce virtuálních počítačů (například provozování systému Windows v systému Linux), používají se místo nich kontejnery.

Nejpopulárnějším řešením pro práci s kontejnery je Docker, framework pro kontejnerizaci aplikací, který umožňuje zabalit aplikace se všemi jejich prostředími a závislostmi.

Práce s kontejnery v Docker

Kontejnery v Docker se vytvářejí z obrazů, což jsou v podstatě šablony. Obraz je sada aplikačních souborů a instalačních příkazů. Pokud chceš spustit aplikaci prostřednictvím Docker, vytvoř soubor Dockerfile, který obsahuje popis instalace do počítače krok za krokem: na základě těchto informací se vytvoří obraz s aplikací.

Obraz lze nainstalovat na server a na jeho základě spustit kontejner. Je popsán v jediném souboru, což je velmi výhodné, protože jej lze zapsat do úložiště Git. Soubor je verzován, všechny změny v něm jsou zaznamenány a nové verze kontejneru lze sestavovat prostřednictvím systému Continuous Integration (například GitLab CI).

Docker běží jako systémová služba na serveru se systémem Windows nebo Linux. Tato služba je zodpovědná za spouštění, zastavování a další správu kontejneru.

Jak funguje Docker

Kontejner lze v jistém smyslu považovat za pískoviště pro aplikace, jakési izolované prostředí, ve kterém lze spouštět aplikace s omezenými přístupovými právy k systémovým prostředkům. Kontejner obsahuje izolované prostředí – souborový systém, knihovny, závislosti, a dokonce i operační systém (v případě kontejneru Docker).

Kontejnery sdílejí společné jádro hostitelského operačního systému, takže jsou lehčí než virtuální počítače, kde má každý své vlastní jádro. Kontejnery také umožňují zabalit aplikaci a její závislosti do jednoho celku, což zajišťuje integritu dat a přenositelnost mezi různými prostředími.

Koncept kontejnerů byl tak úspěšný, že se velké společnosti, jako jsou Google, Amazon, Microsoft a Docker, spojily, aby vytvořily společný standard pro formát obrazu kontejneru. To vedlo k vytvoření projektu OCI (Open Container Initiative), který definuje standardy pro kontejnery a obrazy založené na myšlence Dockeru.

Co je orchestrace

Docker poskytuje nástroje pro vytváření a spouštění kontejnerů, ale složité aplikace často používají mnoho kontejnerů, které spolu nějakým způsobem interagují. Každá aplikace má své vlastní jedinečné požadavky na zdroje a škálování a je třeba ji monitorovat individuálně.

Proto měly velké společnosti ještě před nástupem kontejnerů vlastní systémy řízení infrastruktury.

Řízení infrastruktury, která obsahuje mnoho kontejnerů, se nazývá orchestrace.

Kubernetes (K8s)

Vývojový tým společnosti Google vytvořil systém řízení kontejnerů nazvaný Borg, který je základem platformy Kubernetes (K8s). Kubernetes, open source code napsaný v jazyce Go, poskytuje nástroje pro automatizaci nasazování, škálování a řízení kontejnerů, což usnadňuje a zefektivňuje řízení komplexních aplikací.

S nástupem éry architektury mikroslužeb, kdy je aplikace rozdělena na malé, nezávisle nasaditelné služby, se Kubernetes stal nepostradatelným nástrojem pro správu těchto složitých ekosystémů. Zároveň se neomezuje pouze na mikroslužby. Kubernetes dokáže efektivně spravovat monolitické aplikace, stavové aplikace, infrastrukturní služby, a dokonce i komplexní aplikace běžící v hybridních a multiclusterových prostředích.

Architektura Kubernetes

Architektura Kubernetes (K8s) je navržena tak, aby splňovala komplexní požadavky na správu kontejnerů a mikroslužeb. Je založena na modularitě, rozšiřitelnosti a horizontální škálovatelnosti. Podívejme se na hlavní součásti architektury Kubernetes.

Architektura Kubernetes

Pody (Pods)

Pody jsou nejmenší nasazené výpočetní jednotky. Kromě aplikačních kontejnerů může pod obsahovat inicializační kontejnery, které se spouštějí při jeho startu.

Hlavní uzel (Master node)

Hlavní řídicí prvek clusteru se nazývá Master Node. Je zodpovědný za rozhodování o stavu clusteru, plánování a distribuci úloh a správu zdrojů.

Pro práci s objekty Kubernetes (pohledy, služby, repliky atd.) – jejich vytváření, úpravu nebo mazání – je třeba komunikovat s rozhraním Kubernetes API. To je možné provést různými způsoby:

  • Použití nástroje příkazového řádku kubectl. Nástroj příkazového řádku kubectl poskytuje pohodlný způsob interakce s rozhraním API Kubernetes. Pomocí příkazů kubectl můžeš vytvářet, upravovat a odstraňovat objekty a také získávat informace o stavu clusteru.
  • Programově. K interakci s rozhraními API prostřednictvím kódu můžeš použít klientské knihovny poskytované službou Kubernetes. Tyto knihovny poskytují pohodlné metody pro vytváření, čtení, aktualizaci a mazání objektů Kubernetes.
  • Přímo. Kromě použití klientských knihoven můžeš s rozhraním Kubernetes API komunikovat také přímo, a to odesláním požadavků HTTP na příslušné koncové body API. To může být užitečné, pokud potřebuješ implementovat specifičtější chování nebo ovládání.

Rozhraní Kubernetes API poskytuje rozhraní RESTful, které umožňuje interakci s objekty pomocí požadavků HTTP. Pro některé programovací jazyky existují oficiální klientské knihovny, které usnadňují práci s rozhraním API a poskytují nástroje pro autorizaci a ověřování.

K uložení celé konfigurace a stavu clusteru se používá referenční úložiště (etcd), které zajišťuje spolehlivost a konzistenci dat. Plánovač (Scheduler) je zodpovědný za přidělování podů (kontejnerů) fyzickým nebo virtuálním uzlům s ohledem na požadavky na zdroje, omezení a příbuznost.

Afinity mohou být dvou typů:

  • node affinity (afinity uzlů);
  • pod affinity (afinity podu).

Afinity umožňují spravovat rozložení modulů v clusteru na základě požadavků na prostředky, blízkosti jiných modulů nebo jiných faktorů.

Uzel (Node)

Pracovní stroje v clusteru, na kterých běží kontejnery, se nazývají uzly (Nodes). Uzly provádějí vlastní úlohy, spouštějí a spravují kontejnery a sdělují stav zpět hlavnímu uzlu.

Každý uzel v clusteru musí mít nainstalovaný Container Runtime. Když spustíš pod v systému Kubernetes, vytvoří a spravuje kontejnery pomocí kontejnerového enginu v konkrétním uzlu. Zde jsou příklady populárních kontejnerových enginů, které lze v systému Kubernetes použít:

  • Docker je jedním z nejpopulárnějších a nejpoužívanějších kontejnerových systémů. Poskytuje prostředí pro spouštění a správu kontejnerů.
  • containerd  je kontejnerový engine nižší úrovně, který byl původně vyvinut jako součást projektu Docker. Poskytuje základní funkce pro spouštění a správu kontejnerů.
  • CRI-O je samostatný kontejnerový motor, vysoce výkonný a lehký, optimalizovaný pro minimální požadavky kontejnerových operací. Je založen na standardech CRI (Container Runtime Interface).

Každý uzel má také agenta kubelet. Jedná se o jakéhosi „hlídače“, který udržuje komunikaci mezi hlavním uzlem a uzly, sleduje spouštění podů a zajišťuje jejich stav.

Agent a kontejnerový engine jsou spárovány s komponentou kubeproxy, která zajišťuje interakci mezi kanály a externími sítěmi, spravuje proxy sítě a vyrovnávání zátěže. Umožňuje také používat stabilní názvy DNS pro vzájemné adresování, i když se jejich IP adresy mění.

Services

Service je způsob poskytování přístupu k síťové aplikaci, která běží jako jeden nebo více modulů. Jinými slovy je to způsob, jak zpřístupnit kontejnery (pody) jiným aplikacím.

Pokud v clusteru běží více kontejnerů, může mít každý z nich jinou IP adresu a název, což není vždy stabilní, protože kontejnery lze restartovat nebo škálovat. Services tento problém řeší tím, že poskytují stabilní názvy a adresy pro skupinu kontejnerů.

Při vytváření service jí Kubernetes přiřadí jedinečný název a virtuální IP adresu. Tato virtuální adresa se použije pro přístup ke službě namísto znalosti konkrétních IP adres kontejnerů.

Services také automaticky směrují požadavky na kontejnery (i když změní svou IP adresu nebo se restartují). Nemusíš se tedy starat o přesné IP adresy kontejnerů, k services můžeš přistupovat podle jejich názvů.

Controllery

Kubernetes má komponenty, které jsou zodpovědné za udržování požadovaného stavu objektů v clusteru – controllery. Zajišťují automatické škálování, správu odolnosti proti chybám a zajišťují udržování správného počtu instancí aplikací a služeb podle zadaných parametrů. Zde jsou některé z nich:

  • ReplicaSet — je jedním ze základních typů controllerů. Zajišťuje požadovaný počet instancí podů (se stejným obrazem) v clusteru. Pokud se počet podů sníží nebo zvýší, ReplicaSet automaticky upraví jejich počet tak, aby odpovídal požadovanému počtu.
  • Deployment je zodpovědný za správu replik podů. Zjednodušeně řečeno je to abstrakce nad ReplicaSet, která umožňuje spravovat aktualizace aplikací. Zajišťuje bezproblémovou aktualizaci verze aplikace a také návrat k předchozím verzím v případě problémů.
  • StatefulSet — je controller pro správu kanálů s jedinečnými identifikátory a stabilními síťovými názvy.
  • DaemonSet zaručuje, že na každém uzlu v clusteru bude pracovat jedna instance podu. Často se používá pro aplikace, které musí běžet na každém uzlu, například síťové moduly nebo monitorovací agenti.
  • Job a CronJob. Job zajišťuje provedení určité úlohy (podu) a její úspěšné dokončení. Když se úloha úspěšně dokončí, Job je považován za dokončený. Pokud se úloha nedaří, může Kubernetes úlohu automaticky restartovat, aby byla úspěšně dokončena. CronJob je plánovač, který umožňuje periodické spouštění úloh (pods), podobně jako plánovač úloh v operačních systémech.

Tato a další rozšíření obohacují funkce Kubernetes a poskytují nástroje pro efektivnější řízení kontejnerů v různých scénářích v závislosti na úlohách a požadavcích.

Příklad fungování Kubernetes

Podívejme se na konkrétní příklad, jak automatizované nasazení, škálování a řízení funguje pomocí Kubernetes.

Řekněme, že jde o webovou aplikaci pro mikroslužbu na rozvoz jídla, která uživateli poskytuje možnost objednat si jídlo online. Tato aplikace se skládá z několika mikroslužeb:

  • webové rozhraní;
  • objednávková služba;
  • platební služba;
  • a oznamovací služby.

Automatizované nasazení

Pro každou mikroslužbu je třeba vytvořit konfigurační soubory, které popisují, jak spustit kontejnery s aplikací. Tyto konfigurace pak nahraješ do služby Kubernetes. Když jsi připraven nasadit aplikaci, Kubernetes se postará o vytvoření a spuštění kontejnerů pro každou mikroslužbu. Kontejnery nemusíš spouštět ručně – Kubernetes zajistí nasazení automaticky.

Pomoc s automatizovaným škálováním

Postupem času se služba stává populární a počet zákazníků roste. V určitém okamžiku, například v době špičky, začne objednávková služba zaznamenávat zvýšené zatížení. Pomocí systému Kubernetes je možné nakonfigurovat automatické škálování objednávkové služby.

Je možné například určit, že při zvýšení zátěže na určitou úroveň Kubernetes automaticky spustí další instance služby objednávek, aby zpracovávaly část uživatelských požadavků.

Při snížení zátěže může Kubernetes automaticky snížit počet dalších kontejnerů. Výsledkem je efektivnější využití zdrojů a zajištění rychlé reakce aplikace na měnící se zátěž.

Řízení stavu a tolerance poruch

Jednou z mikroslužeb je služba oznámení, která obsahuje důležité údaje o tom, jaké zprávy byly odeslány uživatelům. Použitím StatefulSet v systému Kubernetes pro tuto službu zajistíte její stavovost. Jakmile je kontejner notifikační služby zastaven z důvodu poruchy, Kubernetes jej automaticky restartuje a obnoví stav.

Řízení síťového připojení a vyrovnávání zátěže

Kubernetes zajišťuje komunikaci mezi mikroslužbami a umožňuje jim vzájemně komunikovat. Nabízí také vestavěné mechanismy vyrovnávání zátěže, které rozdělují provoz mezi instance mikroslužeb.

Příklad syntaxe Kubernetes

Kubernetes má vlastní syntaxi pro popis konfigurace a správy kontejnerových aplikací v clusteru. Tato syntaxe je obvykle reprezentována ve formě souborů YAML nebo JSON, které popisují různé aspekty aplikace, jako jsou pody, služby, replikace a další zdroje.

Příkladem je popis podu (minimální jednotky nasazení Kubernetes) v souboru YAML:

apiVersion: v1 # Určuje verzi rozhraní Kubernetes API použitou k popisu tohoto objektu. V tomto případě se jedná o první verzi rozhraní API.
kind: Pod # Tento parametr určuje typ objektu, který chceme vytvořit. V tomto případě vytváříme objekt typu Pod.
Metadata:  # Začátek bloku metadat objektu.
  name: food-order-pod # Najdeme jméno pro vytvářený objekt Pod. V tomto případě bude název znít food-order-pod.
spec:# Blok, který definuje parametry objektu.
  Containers:# Zde začíná seznam kontejnerů, které budou spuštěny uvnitř Podu.
    — name: food-order-container # Minus před name znamená začátek popisu nového kontejneru v seznamu. Zde nastavujeme název kontejneru - food-order-container.
      image: food-order-service:latest # Zadáváme obraz kontejneru, který bude spuštěn uvnitř Podu; food-order-service je název obrazu a latest je tag obrazu pro použití nejnovější verze.

Kubernetes také poskytuje rozsáhlou sadu prostředků a objektů pro popis různých aspektů aplikace a jejího prostředí, včetně nasazení, služeb, konfiguračních map, tajemství, PersistentVolume a dalších.

Závěr

Platforma K8s umožňuje organizacím snadněji spravovat komplexní aplikace mikroslužeb a zároveň zajišťuje vysokou dostupnost, škálovatelnost a spolehlivost. Kubernetes umožňuje definovat požadovaný stav aplikace ve formě kódu (soubory YAML) a na základě těchto definic pak automaticky vytváří a spouští kontejnery.

Platforma také monitoruje selhání a automaticky obnovuje kontejnery a uzly. Rovněž rozděluje zátěž mezi instance aplikací, čímž zajišťuje rovnoměrné využití zdrojů. Aplikace je popsána formou deklarativních souborů, což zjednodušuje správu a usnadňuje škálování.

Za zmínku stojí také podpora populárních cloudových platforem a možnost nasazení na vlastních serverech. Možnosti K8s lze snadno rozšířit pomocí doplňků, což umožňuje přizpůsobit jej konkrétním potřebám.

Zároveň je třeba brát v úvahu i slabiny systému Kubernetes. S rostoucí složitostí aplikací mikroslužeb může být ladění obtížným úkolem. Chyba v jedné komponentě může ovlivnit celý systém. Kubernetes má strmou křivku učení a nastavení a správa clusteru může být pro začátečníky poměrně náročná. Ale pro ty, kteří se složitosti nebojí, vítejte v dokumentaci platformy.

Autor: Bondarenko Serhii

Více článků
A proč je užitečná pro každého, kdo pracuje s computer vision
Kde můžeš začít navazovat vztahy s lidmi se zájmem o IT?