Linuxové kontejnery existují již nějakou dobu, ale staly se široce dostupnými, když byly představeny v linuxovém jádře v roce 2008. Kontejnery jsou lehké, spustitelné aplikační komponenty, které kombinují zdrojový kód aplikace s knihovnami OS a závislostmi potřebnými ke spuštění kódu v jakémkoli prostředí. Kromě toho nabízejí technologie balení a dodávání aplikací a zároveň využívají výhodu izolace aplikací s flexibilitou metod nasazení založených na obrazech.
Linuxové kontejnery používají kontrolní skupiny pro správu zdrojů, jmenné prostory pro izolaci systémových procesů a zabezpečení SELinux pro umožnění bezpečného pronájmu a snížení bezpečnostních hrozeb nebo exploitů. Tyto technologie poskytují prostředí pro výrobu, provoz, správu a orchestraci kontejnerů.
Článek je úvodním průvodcem hlavními prvky linuxové kontejnerové architektury, srovnáním kontejnerů s virtualizací KVM, kontejnery založenými na obrázcích, kontejnery dockerů a nástroji pro orchestraci kontejnerů.
Architektura kontejneru
Linuxový kontejner využívá klíčové prvky linuxového jádra, jako jsou cgroups, SELinux a jmenné prostory. Jmenné prostory zajišťují izolaci systémových procesů, zatímco cgroups (řídící skupiny), jak název napovídá, se používají k řízení systémových prostředků Linuxu. SELinux se používá k zajištění oddělení mezi hostitelem a kontejnery a mezi jednotlivými kontejnery. SELinux můžete použít k aktivaci bezpečného multi-tenancy a snížení potenciálu bezpečnostních hrozeb a exploitů. Po jádře máme rozhraní pro správu, které spolupracuje s ostatními komponentami za účelem vývoje, správy a organizování kontejnerů.
SELinux
Zabezpečení je kritickou součástí jakéhokoli systému nebo architektury Linuxu. SELinux by měl být první linií obrany pro bezpečné prostředí kontejnerů. SELinux je architektura zabezpečení pro systémy Linux, která poskytuje správcům systému větší kontrolu nad přístupem k architektuře vašeho kontejneru. Můžete izolovat kontejnery hostitelského systému a další kontejnery od sebe.
Spolehlivé prostředí kontejneru vyžaduje správce systému, který vytvoří zásady zabezpečení na míru. Linuxové systémy poskytují různé nástroje jako podman nebo udica pro generování zásad kontejnerů SELinux. Některé zásady kontejnerů řídí, jak kontejnery přistupují k hostitelským zdrojům, jako jsou úložné jednotky, zařízení a síťové nástroje. Taková politika posílí prostředí vašeho kontejneru proti bezpečnostním hrozbám a vytvoří prostředí, které zachová shodu s předpisy.
Architektura vytváří bezpečné oddělení, které zabraňuje kořenovým procesům v kontejneru zasahovat do jiných služeb běžících mimo kontejner. Systém například automaticky přiřadí kontejneru Docker kontext SELinux specifikovaný v zásadách SELinux. V důsledku toho se SELinux vždy zdá být v kontejneru zakázán, i když běží v režimu vynucení na hostitelském operačním systému nebo systému.
Poznámka:Zakázání nebo spuštění SELinuxu v permisivním režimu na hostitelském počítači neoddělí kontejnery bezpečně .
Jmenné prostory
Jmenné prostory jádra poskytují izolaci procesů pro kontejnery Linuxu. Umožňují vytvoření abstrakce systémových prostředků, kde se každý objeví jako samostatná instance pro procesy v rámci jmenného prostoru. V podstatě mohou kontejnery využívat systémové prostředky současně, aniž by došlo ke konfliktu. Mezi jmenné prostory patří síť, připojení, jmenné prostory UTS, jmenné prostory IPC, jmenné prostory PID.
- Obory názvů připojení izolují body připojení systému souborů dostupné pro skupinu procesů. Jiné služby v jiném jmenném prostoru připojení mohou mít alternativní pohledy na hierarchii systému souborů. Například každý kontejner ve vašem prostředí může mít svůj vlastní adresář /var.
- Obory názvů UTS:izolujte název uzlu a identifikátory systému názvů domén. Umožňuje každému kontejneru mít jedinečný název hostitele a název domény NIS.
- Síťové jmenné prostory vytvářejí izolaci síťových řadičů, firewallů a směrovacích IP tabulek. V podstatě můžete navrhnout prostředí kontejneru tak, aby používala samostatné zásobníky virtuálních sítí s virtuálními nebo fyzickými zařízeními a dokonce jim přiřazovala jedinečné adresy IP nebo pravidla iptable.
- Jmenné prostory PID umožňují systémovým procesům v různých kontejnerech používat stejný PID. V podstatě každý kontejner může mít jedinečný init proces pro správu životního cyklu kontejneru nebo inicializaci systémových úloh. Každý kontejner bude mít svůj vlastní jedinečný adresář /proc pro monitorování procesů běžících v kontejneru. Všimněte si, že kontejner si je vědom pouze svých procesů/služeb a nemůže vidět jiné procesy běžící v různých částech systému Linux. Hostitelský operační systém si však uvědomuje procesy běžící uvnitř kontejneru.
- Jmenné prostory IPC – izolují zdroje meziprocesové komunikace systému (System V, objekty IPC, fronty zpráv POSIX), aby různé kontejnery mohly vytvářet segmenty sdílené paměti se stejným názvem. Nemohou však interagovat se segmenty paměti jiných kontejnerů nebo sdílenou pamětí.
- Uživatelské jmenné prostory – umožňují správci systému určit hostitelské UID vyhrazené pro kontejner. Systémový proces může mít například oprávnění root uvnitř kontejneru, ale podobně může být bez oprávnění pro operace mimo kontejner.
Kontrolní skupiny
Cgroups jádra umožňují správu systémových prostředků mezi různými skupinami procesů. Cgroups přidělují čas CPU, šířku pásma sítě nebo systémovou paměť mezi uživatelem definované úlohy.
Virtualizace kontejnerů VS KVM
Jak kontejnery, tak virtualizační technologie KVM mají výhody a nevýhody, které řídí případ použití nebo prostředí k nasazení. Pro začátek vyžadují virtuální stroje KVM vlastní jádro, zatímco kontejnery sdílejí hostitelské jádro. Jednou z klíčových výhod kontejnerů je tedy spouštění více kontejnerů než virtuálních strojů využívajících stejné hardwarové prostředky.
Linuxové kontejnery
Výhody | Nevýhody |
---|---|
Navrženo pro správu izolace kontejnerizovaných aplikací. | Izolace kontejnerů není na stejné úrovni jako virtualizace KVM. |
V každém kontejneru jsou viditelné systémové konfigurace nebo změny hostitele. | Větší složitost při správě kontejnerů. |
Kontejnery jsou lehké a nabízejí rychlejší škálovatelnost vaší architektury. | Vyžaduje rozsáhlé dovednosti správce systému ve správě protokolů, trvalá data se správným oprávněním pro čtení a zápis. |
Umožňuje rychlé vytváření a distribuci aplikací. | |
Usnadňuje nižší skladovací a provozní náklady, pokud jde o vývoj obrazu kontejneru a jeho pořízení. |
Oblasti použití:
- Architektura aplikace, která vyžaduje rozsáhlé škálování.
- Architektura mikroslužeb.
- Vývoj místních aplikací.
Virtualizace KVM
Výhody | Nevýhody |
---|---|
KVM umožňuje úplné spuštění operačních systémů jako Linux, Unix, macOS a Windows. | Vyžaduje rozsáhlou správu celého virtuálního prostředí |
Virtuální počítač hosta je izolován od změn hostitele a systémových konfigurací. Na hostiteli a virtuálním počítači můžete spouštět různé verze aplikace. | Nastavení nového virtuálního prostředí může trvat déle, a to i s automatizačními nástroji. |
Spuštění samostatných jader poskytuje lepší zabezpečení a oddělení. | Vyšší provozní náklady spojené s virtuálním počítačem, správou a vývojem aplikací |
Jasné rozdělení zdrojů. |
Oblasti použití:
- Prostředí systémů, která vyžadují jasné vyhrazené zdroje.
- Systémy, které vyžadují nezávislé běžící jádro.
Kontejner založený na obrázcích
Kontejnery založené na obrázcích balí aplikace s jednotlivými zásobníky doby běhu, díky čemuž jsou zřízené kontejnery nezávislé na hostitelském operačním systému. V podstatě můžete spustit několik instancí aplikace, každou na jiné platformě. Aby byla taková architektura možná, musíte nasadit a spustit kontejner a dobu běhu aplikace jako obrázek.
Architektura systému vytvořená z kontejnerů založených na obrazech vám umožňuje hostovat více instancí aplikace s minimální režií a flexibilitou. Umožňuje přenositelnost kontejnerů, které nejsou závislé na konfiguracích specifických pro hostitele. Obrázky mohou existovat bez kontejnerů. Aby však kontejner mohl existovat, potřebuje spustit obrázek. V podstatě jsou kontejnery závislé na obrázcích, aby vytvořily běhové prostředí pro spuštění aplikace.
Kontejner
Kontejner je vytvořen na základě obrazu, který obsahuje potřebná konfigurační data k vytvoření aktivní komponenty, která běží jako aplikace. Spuštěním kontejneru se nad zadaným obrazem vytvoří zapisovatelná vrstva pro uložení změn konfigurace.
Obrázek
Obrázek je statický snímek konfiguračních dat kontejneru v konkrétním čase. Je to vrstva pouze pro čtení, kde můžete definovat všechny změny konfigurace v nejvyšší zapisovatelné vrstvě. Můžete jej uložit pouze vytvořením nového obrázku. Každý obrázek závisí na jednom nebo více nadřazených obrázcích.
Obrázek platformy
Obrázek platformy nemá nadřazeného prvku. Místo toho jej můžete použít k definování běhového prostředí, balíčků a utilit nezbytných pro spuštění a spuštění kontejnerizované aplikace. Chcete-li například pracovat s kontejnery Docker, natáhnete obrázek platformy pouze pro čtení. Jakékoli definované změny se projeví ve zkopírovaných obrázcích naskládaných na počáteční obrázek Dockeru. Dále vytvoří aplikační vrstvu, která obsahuje přidané knihovny a závislosti pro kontejnerizovanou aplikaci.
Kontejner může být velmi velký nebo malý v závislosti na počtu balíčků a závislostí zahrnutých v aplikační vrstvě. Navíc je možné další vrstvení obrazu pomocí nezávislého softwaru a závislostí třetích stran. Z provozního hlediska tedy může být za obrazem mnoho vrstev. Vrstvy se však uživateli zobrazují pouze jako jeden kontejner.
Docker kontejnery
Docker je kontejnerové virtuální prostředí pro vývoj, údržbu, nasazení a orchestraci aplikací a služeb. Kontejnery Docker nabízejí menší režii při konfiguraci nebo nastavení virtuálních prostředí. Kontejnery nemají samostatné jádro a spouštějí se přímo z hostitelského operačního systému. Využívá jmenné prostory a řídicí skupiny k efektivnímu využívání zdrojů hostitelského operačního systému.
Instance kontejneru spouští jeden proces izolovaně bez ovlivnění ostatních aplikací. V podstatě má každá kontejnerizovaná aplikace jedinečné konfigurační soubory.
Démon Docker umožňuje kontejnerům ping zpět a přiděluje prostředky kontejnerizované aplikaci v závislosti na tom, jak moc potřebuje běžet. Na rozdíl od linuxového kontejneru (LXC) se docker kontejner specializuje na nasazování jednotlivých kontejnerových aplikací. Běží nativně na Linuxu, ale podporuje také další operační systémy, jako jsou macOS a Windows.
Klíčové výhody dokovacích kontejnerů
- Přenositelnost:– Kontejnerizovanou aplikaci můžete nasadit v jakémkoli jiném systému, kde běží Docker Engine, a vaše aplikace bude fungovat přesně tak, jako když jste ji testovali ve svém vývojovém prostředí. Jako vývojář můžete s jistotou sdílet dockerovou aplikaci, aniž byste museli instalovat další balíčky nebo software, bez ohledu na operační systém, který vaše týmy používají. Docker jde ruku v ruce s verzováním a kontejnerizované aplikace můžete snadno sdílet bez porušení kódu.
- Kontejnery mohou běžet kdekoli a na jakémkoli podporovaném operačním systému, jako jsou Windows, VM, macOS, Linux, On-prem a ve veřejném cloudu. Široká popularita obrázků Docker vedla k rozsáhlému přijetí ze strany poskytovatelů cloudu, jako jsou Amazon Web Services (AWS), Google Compute Platform (GCP) a Microsoft Azure.
- Výkon:– Kontejnery neobsahují operační systém, který vytváří mnohem menší nároky než virtuální stroje a obecně se rychleji vytváří a spouští.
- Agility:– Výkon a přenositelnost kontejnerů umožňuje týmu vytvořit agilní vývojový proces, který zlepšuje strategie nepřetržité integrace a nepřetržitého doručování (CI/CD) s cílem dodávat správný software ve správný čas.
- Izolace:– Kontejner Docker s aplikací také obsahuje relevantní verze všech závislostí a softwaru, které vaše aplikace vyžaduje. Kontejnery Docker jsou na sobě nezávislé a ve stejné architektuře mohou bez problémů existovat další kontejnery/aplikace, které vyžadují různé verze specifikovaných softwarových závislostí. Například zajišťuje, že aplikace jako Docker MariaDB využívá své prostředky pouze k udržení konzistentního výkonu systému.
- Škálovatelnost:– Docker vám umožňuje vytvářet nové kontejnery a aplikace na vyžádání.
- Spolupráce:– Proces kontejnerizace v Dockeru umožňuje segmentovat proces vývoje aplikace. Umožňuje vývojářům rychle sdílet, spolupracovat a řešit jakékoli potenciální problémy bez nutnosti rozsáhlého přepracování a vytvoření nákladově efektivního a časově úsporného vývojového procesu.
Ovládání kontejnerů
Kontejnerová orchestrace je proces automatizace nasazení, zajišťování, správy, škálování, zabezpečení, životního cyklu, vyvažování zátěže a vytváření sítí kontejnerových služeb a pracovních zátěží. Hlavním přínosem orchestrace je automatizace. Orchestration podporuje DevOps nebo agilní vývojový proces, který umožňuje týmům vyvíjet a nasazovat v iterativních cyklech a uvolňovat nové funkce rychleji. Mezi oblíbené nástroje pro orchestraci patří Kubernetes, Amazon ECR Docker Swarm a Apache Mesos.
Orchestrace kontejneru v podstatě zahrnuje tříkrokový proces, kdy vývojář zapíše konfigurační soubor (YAML nebo JSON), který definuje stav konfigurace. Orchestrační nástroj pak spustí soubor, aby dosáhl požadovaného stavu systému. Soubor YAML nebo JSON obvykle definuje následující součásti:
- Obrázky kontejneru, které tvoří aplikaci a registr obrázků.
- Poskytuje kontejner se zdroji, jako je úložiště.
- Za třetí, definuje konfigurace sítě mezi kontejnery.
- Určuje verzi obrázku.
Nástroj Orchestration naplánuje nasazení kontejnerů nebo replik kontejnerů na hostitele na základě dostupné kapacity CPU, paměti nebo jiných omezení uvedených v konfiguračním souboru. Jakmile nasadíte kontejnery, nástroj pro orchestraci spravuje životní cyklus aplikace na základě souboru definice kontejneru (Dockerfile). Dockerfile můžete například použít ke správě následujících aspektů:
- Správa zvýšení nebo snížení škálovatelnosti, alokace zdrojů, vyvažování zátěže.
- Udržujte dostupnost a výkon kontejnerů v případě výpadku nebo nedostatku systémových prostředků.
- Shromažďujte a ukládejte data protokolu za účelem sledování stavu a výkonu kontejnerových aplikací.
Kubernetes
Kubernetes je jednou z nejoblíbenějších platforem pro orchestraci kontejnerů, která se používá k definování architektury a operací nativních cloudových aplikací, aby se vývojáři mohli soustředit na vývoj produktů, kódování a inovace. Kubernetes vám umožňuje vytvářet aplikace, které zahrnují více kontejnerů, plánovat je v rámci clusteru, škálovat je a spravovat jejich stav a výkon v průběhu času. V podstatě odstraňuje manuální procesy spojené s nasazováním a škálováním kontejnerizovaných aplikací.
Klíčové součásti Kubernetes
- Cluster:Řídicí rovina s jedním nebo více výpočetními stroji/uzly.
- Řídicí rovina:Soubor procesů, které řídí různé uzly.
- Kubelet:Běží na uzlech a zajišťuje, že se kontejnery mohou spustit a efektivně spustit.
- Pod:Skupina kontejnerů nasazených do jednoho uzlu. Všechny kontejnery v podu sdílejí IP adresu, název hostitele, IPC a další zdroje.
Kubernetes se stal průmyslovým standardem v orchestraci kontejnerů. Poskytuje rozsáhlé možnosti kontejnerů, obsahuje dynamickou komunitu přispěvatelů, je vysoce rozšiřitelný a přenosný. Můžete jej provozovat v široké škále prostředí, jako je on-prem, veřejné nebo cloudové prostředí, a efektivně jej používat s dalšími technologiemi kontejnerů.
Koneckonců
Kontejnery jsou lehké, spustitelné aplikační komponenty sestávající ze zdrojového kódu, knihoven OS a závislostí potřebných ke spuštění kódu v jakémkoli prostředí. Kontejnery se staly široce dostupnými v roce 2013, kdy byla vytvořena platforma Docker. V důsledku toho často narazíte na uživatele v linuxové komunitě, kteří používají kontejnery Docker a kontejnery zaměnitelně k označení stejné věci.
Použití kontejnerů Docker má několik výhod. Ne všechny aplikace jsou však vhodné pro provoz v kontejnerech. Obecně platí, že aplikace s grafickým uživatelským rozhraním nejsou vhodné pro použití s Dockerem. Proto jsou kontejnerové mikroslužby nebo bezserverové architektury nezbytné pro cloudové nativní aplikace.
Tento článek vám poskytl úvodního průvodce kontejnery v Linuxu, obrázky Docker a nástroje pro orchestraci kontejnerů, jako je Kubernetes. Tato příručka bude stavět na práci s kontejnery, Docker Engine a Kubernetes, kde se vývojář může naučit vyvíjet a sdílet kontejnerizované aplikace.