
Prvi korak u implementaciji Kubernetesa je postavljanje vaše aplikacije u kontejner. U ovoj seriji ćemo pogledati kako stvoriti malu i sigurnu sliku kontejnera.
Zahvaljujući Dockeru, stvaranje slika kontejnera nikad nije bilo lakše. Odredite osnovnu sliku, dodajte promjene i stvorite kontejner.

Iako je ova tehnika izvrsna za početak, korištenje zadanih osnovnih slika može dovesti do nesigurnosti pri radu s velikim slikama koje su pune ranjivosti.
Кроме того, большинство образов в Docker используют для базового образа Debian ili Ubuntu, и хотя это обеспечивает отличную совместимость и легкую адаптацию (файл Docker занимает всего две строки кода), базовые образы способны добавить сотни мегабайтов дополнительной нагрузки в ваш контейнер. Например, простой файл node.js приложения Go «hello-world» занимают около 700 мегабайт, при том, что размер собственно вашего приложения составляет всего лишь несколько мегабайтов.

Dakle, sav ovaj dodatni opterećenje je rasipanje digitalnog prostora i savršeno skrovište za ranjivosti i sigurnosne greške. Pogledajmo stoga dva načina za smanjenje veličine slike spremnika.
Prvo je korištenje malih osnovnih slika, drugo je korištenje Builder Pattern-a. Korištenje manjih osnovnih slika vjerojatno je najlakši način za smanjenje veličine vašeg kontejnera. Vjerojatno vaš jezik ili stog stvara izvornu sliku aplikacije koja je puno manja od zadane slike. Pogledajmo naš Node.js kontejner.

По умолчанию в Docker размер базового образа node:8 равен 670 МБ, а размер node: 8-alpine составляет всего 65 МБ, то есть в 10 раз меньше. Используя меньший базовый образ Alpine, вы существенно сократите размер вашего контейнера. Alpine -это небольшой и легкий дистрибутив Linux, который очень популярен среди пользователей Docker, потому что он совместим со многими приложениями, сохраняя при этом небольшой размер контейнеров. В отличие от стандартного образа Docker «node», «node:alpine» удаляет множество служебных файлов и программ, оставляя только те, которых достаточно для запуска вашего приложения.
Za prelazak na manju osnovnu sliku, jednostavno ažurirajte Dockerfile da biste započeli s novom osnovnom slikom:

Sada, za razliku od stare onbuild slike, morate kopirati svoj kod u kontejner i instalirati sve ovisnosti. U novoj Dockerfile datoteci, kontejner počinje sa slikom node:alpine, zatim stvara direktorij za kod, instalira ovisnosti pomoću NPM upravitelja paketa i na kraju pokreće server.js.

С помощью этого обновления получается контейнер в 10 раз меньшего размера. Если ваш язык программирования или стек не имеет функции уменьшения базового образа, используйте Alpine Linux. Он также предоставит возможность полностью управлять содержимым контейнера. Использование базовых образов маленького размера — отличный способ быстрого создания небольших контейнеров. Но можно достичь еще большего уменьшения, используя Builder Pattern.

U interpretiranim jezicima, izvorni kod se prvo prosljeđuje interpreteru, a zatim izvršava. U kompiliranim jezicima, izvorni kod se prvo pretvara u kompilirani kod. Kompilacija često koristi alate koji zapravo nisu potrebni za pokretanje koda. To znači da te alate možete potpuno ukloniti iz konačnog spremnika. Za to možete koristiti obrazac Builder.

Код создается в первом контейнере и компилируется. Затем скомпилированный код упаковывается в конечный контейнер без компиляторов и инструментов, необходимых для компиляции этого кода. Давайте пропустим через этот процесс приложение Go. Во-первых, мы перейдем от образа onbuild к Alpine Linux.

U novoj Docker datoteci, kontejner počinje sa slikom golang:alpine. Zatim stvara direktorij za kod, kopira ga u izvorni kod, izgrađuje taj izvorni kod i pokreće aplikaciju. Ovaj kontejner je puno manji od onbuild kontejnera, ali i dalje sadrži kompajler i ostale Go alate, koji nam zapravo ne trebaju. Zato samo izdvojimo kompajlirani program i stavimo ga u vlastiti kontejner.

Možda ćete primijetiti nešto neobično u vezi s ovom Dockerfile datotekom: sadrži dva FROM retka. Prvi odjeljak od četiri retka izgleda potpuno isto kao prethodni Dockerfile, osim što koristi ključnu riječ AS za imenovanje ove faze. Sljedeći odjeljak sadrži novi FROM redak, što nam omogućuje početak nove slike. Umjesto korištenja slike golang:alpine kao osnovne slike, koristit ćemo Raw alpine.
Raw Alpine Linux не имеет никаких установленных SSL сертификатов, что приведет к сбою большинства вызовов API по протоколу HTTPS, поэтому давайте установим несколько корневых сертификатов CA.
A sada slijedi zabavni dio: za kopiranje kompajliranog koda iz prvog kontejnera u drugi, možete jednostavno upotrijebiti naredbu COPY, koja se nalazi u retku 5 drugog odjeljka. Ovo će kopirati samo jednu datoteku aplikacije i neće utjecati na alate Go uslužnog programa. Novi višestupanjski Dockerfile sadržavat će sliku kontejnera od samo 12 megabajta, u usporedbi s izvornom veličinom slike kontejnera od 700 megabajta - velika razlika!
Dakle, korištenje malih osnovnih slika i uzorka Builder izvrsni su načini za stvaranje puno manjih spremnika bez puno rada.
Ovisno o aplikacijskom paketu, mogu postojati dodatni načini za smanjenje veličine slike i kontejnera, ali nude li mali kontejneri doista mjerljivu korist? Pogledajmo dva područja gdje su mali kontejneri izuzetno učinkoviti: performanse i sigurnost.
Za procjenu poboljšanja performansi, uzmite u obzir vrijeme potrebno za stvaranje kontejnera, njegovo umetanje u registar (push) i zatim njegovo preuzimanje (pull). Možete vidjeti da manji kontejner ima izrazitu prednost u odnosu na veći.

Docker će keširati slojeve, tako da će naknadne izgradnje biti vrlo brze. Međutim, mnogi CI sustavi koji se koriste za izgradnju i testiranje kontejnera ne keširaju slojeve, što predstavlja značajnu uštedu vremena. Kao što vidite, izgradnja velikog kontejnera traje između 34 i 54 sekunde, ovisno o performansama vašeg računala, dok korištenje kontejnera smanjenog pomoću Builder Pattern-a traje između 23 i 28 sekundi. Za ovakve operacije, dobitak u performansama je 40-50%. Dakle, samo razmislite koliko često gradite i testirate svoj kod.
Nakon što je kontejner izgrađen, potrebno je poslati njegovu sliku u registar kontejnera kako biste ga koristili u svom Kubernetes klasteru. Preporučujem korištenje Google Container Registryja.

S Google Container Registryjem (GCR) plaćate samo za sirovu pohranu i umrežavanje, bez dodatnih naknada za upravljanje kontejnerima. Privatno je, sigurno i nevjerojatno brzo. GCR koristi mnoge trikove za ubrzavanje operacija povlačenja. Kao što vidite, umetanje slike Docker kontejnera pomoću go:onbuild traje između 15 i 48 sekundi, ovisno o performansama vašeg računala, dok ista operacija s manjim kontejnerom traje između 14 i 16 sekundi, s tim da se prednost brzine utrostručuje na strojevima nižih performansi. Na većim strojevima vrijeme je otprilike isto, jer GCR koristi globalnu predmemoriju za dijeljenu bazu podataka slika, što znači da ih uopće ne morate preuzimati. Na računalu s niskom potrošnjom energije, CPU je usko grlo, pa je prednost korištenja manjih kontejnera puno uočljivija.
Ako koristite GCR, toplo preporučujem korištenje Google Container Buildera (GCB) kao dijela vašeg sustava za izgradnju.

Kao što vidite, korištenjem možete postići znatno bolje rezultate u smanjenju vremena operacije Build+Push čak i nego s visokoučinkovitim strojem - u ovom slučaju, proces izgradnje i slanja kontejnera hostu je gotovo 2 puta brži. Nadalje, svaki dan dobivate 120 minuta besplatnog vremena za izgradnju, što zadovoljava većinu potreba za stvaranjem kontejnera.
Sljedeća je najvažnija metrika performansi - brzina povlačenja ili preuzimanja kontejnera. Iako vas ne brine posebno vrijeme potrebno za povlačenje, duljina procesa povlačenja ozbiljno utječe na ukupne performanse sustava. Recimo da imate klaster s tri čvora i jedan od njih zakaže. Ako koristite sustav upravljanja poput Google Kubernetes Enginea, on će automatski zamijeniti neuspjeli čvor novim. Međutim, ovaj novi čvor bit će potpuno prazan i morat ćete na njega povući sve svoje kontejnere da biste ga pokrenuli. Ako operacija povlačenja traje dugo, vaš klaster će imati smanjene performanse tijekom tog vremena.
Postoji mnogo scenarija u kojima se to može dogoditi: dodavanje novog čvora u klaster, ažuriranje čvorova ili čak prelazak na novi kontejner za implementaciju. Stoga je ključno smanjiti vrijeme preuzimanja. Neosporno je da se mali kontejner preuzima puno brže od velikog. Ako pokrećete više kontejnera u Kubernetes klasteru, ušteda vremena može biti značajna.

Pogledajte usporedbu u nastavku: operacija povlačenja s malim kontejnerima traje 4-9 puta brže, ovisno o performansama računala, od iste operacije korištenjem go:onbuild. Korištenje dijeljenih slika malih kontejnera značajno ubrzava vrijeme i brzinu kojom se novi Kubernetes čvorovi mogu implementirati i pokrenuti.
Razmotrimo pitanje sigurnosti. Vjeruje se da su manji kontejneri puno sigurniji od većih jer imaju manju površinu za napad. Je li to doista istina? Jedna od najkorisnijih značajki Google Container Registryja je njegova sposobnost automatskog skeniranja kontejnera u potrazi za ranjivostima. Prije nekoliko mjeseci stvorio sam i onbuild i multistage kontejnere, pa da vidimo ima li kakvih ranjivosti.

Rezultati su zapanjujući: mali kontejner pronašao je samo 3 umjerene ranjivosti, dok je veliki sadržavao 16 kritičnih i 376 ostalih ranjivosti. Gledajući sadržaj velikog kontejnera, jasno je da većina sigurnosnih problema nema nikakve veze s našom aplikacijom, već su povezani s programima koje čak ni ne koristimo. Dakle, kada ljudi govore o velikoj površini napada, upravo to misle.

Poanta je jasna: stvarajte male kontejnere jer oni pružaju stvarne prednosti u performansama i sigurnosti vašeg sustava.

Neki oglasi 🙂
Hvala što ste ostali s nama. Sviđaju li vam se naši članci? Želite li vidjeti više zanimljivog sadržaja? Podržite nas narudžbom ili preporukom prijateljima, , jedinstveni analog poslužitelja početne razine, koji smo izmislili za vas: (dostupno s RAID1 i RAID10, do 24 jezgre i do 40 GB DDR4).
Dell R730xd 2 puta jeftiniji u Equinix Tier IV podatkovnom centru u Amsterdamu? Samo ovdje u Nizozemskoj! Dell R420 - 2x E5-2430 2.2 Ghz 6C 128 GB DDR3 2x960 GB SSD 1 Gbps 100 TB - od 99 USD! Pročitaj o
Izvor: www.habr.com
