Osvedčené postupy Kubernetes. Vytváranie malých nádob

Osvedčené postupy Kubernetes. Vytváranie malých nádob

Prvým krokom nasadenia do Kubernetes je umiestnenie vašej aplikácie do kontajnera. V tejto sérii sa pozrieme na to, ako môžete vytvoriť malý, bezpečný obrázok kontajnera.
Vďaka Dockeru nebolo vytváranie obrázkov kontajnerov nikdy jednoduchšie. Zadajte základný obrázok, pridajte zmeny a vytvorte kontajner.

Osvedčené postupy Kubernetes. Vytváranie malých nádob

Aj keď je táto technika skvelá na začiatok, používanie predvolených základných obrázkov môže viesť k nebezpečnej práci s veľkými obrázkami plnými zraniteľností.

Väčšina obrázkov v Dockeri navyše používa ako základný obrázok Debian alebo Ubuntu, a hoci to poskytuje vynikajúcu kompatibilitu a jednoduché prispôsobenie (súbor Docker zaberá iba dva riadky kódu), základné obrázky môžu do vášho kontajnera pridať ďalšie stovky megabajtov. Napríklad jednoduchý súbor node.js pre aplikáciu Go „hello-world“ má približne 700 megabajtov, zatiaľ čo vaša skutočná aplikácia má veľkosť len niekoľko megabajtov.

Osvedčené postupy Kubernetes. Vytváranie malých nádob

Celá táto dodatočná záťaž je teda plytvaním digitálnym priestorom a skvelým úkrytom pre bezpečnostné slabiny a chyby. Pozrime sa teda na dva spôsoby, ako zmenšiť veľkosť obrázka kontajnera.

Prvým je použitie malých základných obrázkov, druhým je použitie Builder Pattern. Použitie menších základných obrázkov je pravdepodobne najjednoduchší spôsob, ako zmenšiť veľkosť kontajnera. Jazyk alebo zásobník, ktorý používate, s najväčšou pravdepodobnosťou poskytuje pôvodný obrázok aplikácie, ktorý je oveľa menší ako predvolený obrázok. Pozrime sa na náš kontajner node.js.

Osvedčené postupy Kubernetes. Vytváranie malých nádob

Štandardne je v Dockeri veľkosť základného obrázka node:8 670 MB a veľkosť obrázka uzla: 8-alpine je iba 65 MB, teda 10-krát menšia. Použitím menšieho základného obrázka Alpine výrazne zmenšíte veľkosť vašej nádoby. Alpine je malá a ľahká distribúcia Linuxu, ktorá je medzi používateľmi Dockeru veľmi populárna, pretože je kompatibilná s mnohými aplikáciami, pričom kontajnery sú malé. Na rozdiel od štandardného obrazu „uzla“ Docker, „node:alpine“ odstraňuje množstvo servisných súborov a programov a ponecháva len tie, ktoré postačujú na spustenie vašej aplikácie.

Ak chcete prejsť na menší základný obrázok, jednoducho aktualizujte súbor Dockerfile, aby ste mohli začať pracovať s novým základným obrázkom:

Osvedčené postupy Kubernetes. Vytváranie malých nádob

Teraz, na rozdiel od starého onbuild obrazu, musíte skopírovať kód do kontajnera a nainštalovať všetky závislosti. V novom súbore Dockerfile kontajner začína obrázkom node:alpine, potom vytvorí adresár pre kód, nainštaluje závislosti pomocou správcu balíkov NPM a nakoniec spustí server.js.

Osvedčené postupy Kubernetes. Vytváranie malých nádob

Výsledkom tejto inovácie je kontajner, ktorý je 10-krát menší. Ak váš programovací jazyk alebo zásobník nemá funkciu redukcie základného obrazu, použite Alpine Linux. Poskytne tiež možnosť plne spravovať obsah nádoby. Použitie malých základných obrázkov je skvelý spôsob, ako rýchlo vytvoriť malé nádoby. Ale ešte väčšie zníženie je možné dosiahnuť pomocou Builder Pattern.

Osvedčené postupy Kubernetes. Vytváranie malých nádob

V interpretovaných jazykoch sa zdrojový kód najprv odovzdá tlmočníkovi a potom sa priamo spustí. V kompilovaných jazykoch sa zdrojový kód najskôr prevedie na kompilovaný kód. Kompilácia však často využíva nástroje, ktoré v skutočnosti nie sú potrebné na spustenie kódu. To znamená, že tieto nástroje môžete z finálnej nádoby úplne odstrániť. Na to môžete použiť vzor Builder.

Osvedčené postupy Kubernetes. Vytváranie malých nádob

Kód je vytvorený v prvom kontajneri a skompilovaný. Kompilovaný kód je potom zabalený do konečného kontajnera bez kompilátorov a nástrojov potrebných na kompiláciu tohto kódu. Spustite aplikáciu Go týmto procesom. Najprv prejdeme z onbuild obrazu na Alpine Linux.

Osvedčené postupy Kubernetes. Vytváranie malých nádob

V novom súbore Dockerfile kontajner začína obrázkom golang:alpine. Potom vytvorí adresár pre kód, skopíruje ho do zdrojového kódu, zostaví tento zdrojový kód a spustí aplikáciu. Tento kontajner je oveľa menší ako kontajner onbuild, ale stále obsahuje kompilátor a ďalšie nástroje Go, ktoré v skutočnosti nepotrebujeme. Takže len extrahujeme skompilovaný program a vložíme ho do vlastného kontajnera.

Osvedčené postupy Kubernetes. Vytváranie malých nádob

V tomto súbore Docker si môžete všimnúť niečo zvláštne: obsahuje dva riadky FROM. Prvá 4 riadková sekcia vyzerá úplne rovnako ako predchádzajúci súbor Dockerfile okrem toho, že na pomenovanie tejto fázy používa kľúčové slovo AS. Ďalšia sekcia má nový riadok FROM na spustenie nového obrázka, kde namiesto obrázka golang:alpine použijeme ako základný obrázok Raw alpine.

Raw Alpine Linux nemá nainštalované žiadne certifikáty SSL, čo spôsobí zlyhanie väčšiny volaní API cez HTTPS, takže nainštalujte nejaké koreňové certifikáty CA.

Teraz prichádza zábavná časť: na skopírovanie skompilovaného kódu z prvého kontajnera do druhého môžete jednoducho použiť príkaz COPY umiestnený na riadku 5 druhej časti. Skopíruje iba jeden súbor aplikácie a neovplyvní nástroje pomôcky Go. Nový viacstupňový súbor Docker bude obsahovať obrázok kontajnera, ktorý má veľkosť iba 12 megabajtov v porovnaní s pôvodným obrázkom kontajnera, ktorý mal 700 megabajtov, čo je veľký rozdiel!
Takže použitie malých základných obrázkov a Builder Pattern sú skvelé spôsoby, ako vytvoriť oveľa menšie kontajnery bez veľkého množstva práce.
Je možné, že v závislosti od zásobníka aplikácií existujú ďalšie spôsoby, ako znížiť veľkosť obrázka a kontajnera, ale majú malé kontajnery skutočne merateľný prínos? Pozrime sa na dve oblasti, kde sú malé kontajnery mimoriadne efektívne – výkon a bezpečnosť.

Ak chcete vyhodnotiť zvýšenie výkonu, zvážte trvanie procesu vytvárania kontajnera, jeho vloženia do registra (push) a následného načítania odtiaľ (pull). Môžete vidieť, že menšia nádoba má výraznú výhodu oproti väčšej nádobe.

Osvedčené postupy Kubernetes. Vytváranie malých nádob

Docker uloží vrstvy do vyrovnávacej pamäte, takže následné zostavenia budú veľmi rýchle. Mnohé systémy CI používané na vytváranie a testovanie kontajnerov však neukladajú vrstvy do vyrovnávacej pamäte, takže dochádza k výraznej úspore času. Ako vidíte, čas na zostavenie veľkého kontajnera je v závislosti od výkonu vášho stroja od 34 do 54 sekúnd a pri použití kontajnera skrátený pomocou Builder Pattern - od 23 do 28 sekúnd. Pre operácie tohto druhu bude zvýšenie produktivity o 40 – 50 %. Takže len premýšľajte o tom, koľkokrát vytvárate a testujete svoj kód.

Po vytvorení kontajnera musíte vložiť jeho obrázok (obraz kontajnera push) do registra kontajnerov, aby ste ho potom mohli použiť vo svojom klastri Kubernetes. Odporúčam použiť register kontajnerov Google.

Osvedčené postupy Kubernetes. Vytváranie malých nádob

S registrom kontajnerov Google (GCR) platíte iba za nespracovaný úložný priestor a sieť a neplatia sa žiadne ďalšie poplatky za správu kontajnerov. Je to súkromné, bezpečné a veľmi rýchle. GCR používa mnoho trikov na urýchlenie operácie ťahania. Ako vidíte, vloženie kontajnera Docker Container Image pomocou go:onbuild bude trvať od 15 do 48 sekúnd v závislosti od výkonu počítača a rovnaká operácia s menším kontajnerom bude trvať od 14 do 16 sekúnd a pre menej produktívne stroje výhoda v prevádzkovej rýchlosti sa zvyšuje 3-krát. V prípade väčších počítačov je čas približne rovnaký, pretože GCR používa globálnu vyrovnávaciu pamäť pre zdieľanú databázu obrázkov, čo znamená, že ich nemusíte vôbec načítať. V počítači s nízkou spotrebou energie je prekážkou CPU, takže výhoda použitia malých kontajnerov je tu oveľa väčšia.

Ak používate GCR, dôrazne vám odporúčam používať Google Container Builder (GCB) ako súčasť vášho zostavovacieho systému.

Osvedčené postupy Kubernetes. Vytváranie malých nádob

Ako vidíte, jeho použitie vám umožňuje dosiahnuť oveľa lepšie výsledky pri skrátení doby trvania operácie Build+Push ako dokonca aj pri produktívnom stroji - v tomto prípade sa proces zostavovania a odosielania kontajnerov hostiteľovi zrýchli takmer 2-krát. . Navyše, každý deň získate 120 bezplatných minút na stavbu, čo vo väčšine prípadov pokryje vaše potreby na stavbu kontajnerov.

Nasleduje najdôležitejšia metrika výkonu – rýchlosť načítavania alebo sťahovania kontajnerov Pull. A ak sa veľmi nestaráte o čas strávený push operáciou, potom má dĺžka procesu sťahovania vážny vplyv na celkový výkon systému. Povedzme, že máte zhluk troch uzlov a jeden z nich zlyhá. Ak používate systém správy, ako je Google Kubernetes Engine, automaticky nahradí mŕtvy uzol novým. Tento nový uzol však bude úplne prázdny a budete doň musieť pretiahnuť všetky svoje kontajnery, aby začal fungovať. Ak operácia vytiahnutia trvá dostatočne dlho, váš klaster bude po celý čas pracovať s nižším výkonom.

Existuje mnoho prípadov, kedy sa to môže stať: pridanie nového uzla do klastra, inovácia uzlov alebo dokonca prechod na nový kontajner na nasadenie. Kľúčovým faktorom sa teda stáva minimalizácia doby extrakcie ťahom. Je nepopierateľné, že malý kontajner sa sťahuje oveľa rýchlejšie ako veľký. Ak používate viacero kontajnerov v klastri Kubernetes, úspora času môže byť významná.

Osvedčené postupy Kubernetes. Vytváranie malých nádob

Pozrite sa na toto porovnanie: ťahová operácia na malých kontajneroch trvá 4-9 krát menej času, v závislosti od výkonu stroja, ako rovnaká operácia pomocou go:onbuild. Používanie zdieľaných obrázkov malých kontajnerov výrazne urýchľuje čas a rýchlosť, s akou je možné nasadiť nové uzly Kubernetes a sprístupniť ich online.

Pozrime sa na otázku bezpečnosti. Menšie nádoby sa považujú za oveľa bezpečnejšie ako väčšie, pretože majú menšiu útočnú plochu. Je to naozaj? Jednou z najužitočnejších funkcií databázy Google Container Registry je schopnosť automaticky skenovať vaše kontajnery na zraniteľné miesta. Pred pár mesiacmi som vytvoril onbuild aj viacstupňové kontajnery, tak sa pozrime, či tam nie sú nejaké zraniteľnosti.

Osvedčené postupy Kubernetes. Vytváranie malých nádob

Výsledok je úžasný: v malom kontajneri boli zistené iba 3 stredné zraniteľnosti a vo veľkom kontajneri bolo nájdených 16 kritických a 376 iných zraniteľností. Ak sa pozrieme na obsah veľkého kontajnera, môžeme vidieť, že väčšina bezpečnostných problémov nemá nič spoločné s našou aplikáciou, ale súvisí s programami, ktoré ani nepoužívame. Takže keď ľudia hovoria o veľkej útočnej ploche, majú na mysli práve to.

Osvedčené postupy Kubernetes. Vytváranie malých nádob

Riešenie je jasné: stavajte malé kontajnery, pretože vášmu systému poskytujú skutočný výkon a výhody v oblasti bezpečnosti.

Osvedčené postupy Kubernetes. Organizácia Kubernetes s menným priestorom

Nejaké inzeráty 🙂

Ďakujeme, že ste zostali s nami. Páčia sa vám naše články? Chcete vidieť viac zaujímavého obsahu? Podporte nás zadaním objednávky alebo odporučením priateľom, cloud VPS pre vývojárov od 4.99 USD, jedinečný analóg serverov základnej úrovne, ktorý sme pre vás vymysleli: Celá pravda o VPS (KVM) E5-2697 v3 (6 jadier) 10GB DDR4 480GB SSD 1Gbps od 19 USD alebo ako zdieľať server? (k dispozícii s RAID1 a RAID10, až 24 jadier a až 40 GB DDR4).

Dell R730xd 2 krát lacnejší v dátovom centre Equinix Tier IV v Amsterdame? Len tu 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6 GHz 14C 64 GB DDR4 4 x 960 GB SSD 1 Gbps 100 TV od 199 USD v Holandsku! Dell R420 – 2x E5-2430 2.2 GHz 6C 128 GB DDR3 2 x 960 GB SSD 1 Gb/s 100 TB – od 99 USD! Čítať o Ako vybudovať infraštruktúru spol. triedy s využitím serverov Dell R730xd E5-2650 v4 v hodnote 9000 XNUMX eur za cent?

Zdroj: hab.com

Pridať komentár