
Esimene samm Kubernetes'is juurutamisel on teie rakenduse paigutamine konteinerisse. Selles sarjas vaatleme, kuidas luua vÀikese ja turvalise konteineri pilti.
Dockeri abil pole konteineri piltide loomine kunagi olnud nii lihtne. MÀÀrake pÔhijoon ja lisage oma muudatused ning looge konteiner.

Kuid kuigi see meetod sobib suurepÀraselt alustamiseks, vÔivad vaikesed pÔhifotod tuua kaasa suurte haavatavate piltide kasutamise, mis on tÀis turvaprobleeme.
Enamik Docker'i pilte kasutavad peamiseks pildiks Debianit vĂ”i Ubuntu't, ja kuigi see tagab suurepĂ€rase ĂŒhilduvuse ja lihtsa kohandamise (Docker'i fail vajab ainult kahte koodirida), vĂ”ivad pĂ”hifotod lisada teie konteinerisse sadu megabaite tĂ€iendavat koormust. NĂ€iteks lihtne node.js rakenduse Go fail "hello-world" kaalub umbes 700 megabaiti, samas kui teie rakenduse suurus on vaid paar megabaiti.

Seega on kogu see tĂ€iendav koormus digitaalruumi raiskamine ning suurepĂ€rane peidukoht haavatavuste ja turvakĂŒsimuste jaoks. SeetĂ”ttu vaatame kaht viisi konteineri pildi suuruse vĂ€hendamiseks.
Esimene on vÀikese suurusega pÔhifotode kasutamine, teine on Builder Patterni kujunduspahenduse kasutamine. VÀiksemate pÔhifotode kasutamine on tÔenÀoliselt kÔige lihtsam viis teie konteineri suuruse vÀhendamiseks. TÔenÀoliselt pakub teie kasutatav keel vÔi virn rakenduse originaalpildi, mis on palju vÀiksem kui vaikepilt. Vaatame meie node.js konteinerit.

Vaikimisi on Dockeri baasimage'i node:8 suurus 670 MB ja image'i node:8-alpine suurus vaid 65 MB, mis on kĂŒmme korda vĂ€iksem. Kasutades vĂ€iksemat Alpine'i baasimage'i, vĂ€hendate oluliselt oma konteineri suurust. Alpine on vĂ€ike ja kerge Linuxi distributsioon, mis on Dockeri kasutajate seas vĂ€ga populaarne, kuna see on ĂŒhilduv paljude rakendustega, sĂ€ilitades samas konteinerite vĂ€ikese suuruse. Erinevalt tavalistest Dockeri image'itest
Et minna vÀiksemale baasimage'ile, vÀrskendage lihtsalt Dockeri faili, et alustada uue baasimage'iga:

NĂŒĂŒd, erinevalt vanast onbuild image'ist, peate oma koodi konteinerisse kopeerima ja kĂ”ik sĂ”ltuvused installima. Uus Dockeri fail algab image'iga node:alpine, seejĂ€rel loob koodile katalooge, installib sĂ”ltuvused NPM-i pakettihalduri abil ja lĂ”puks kĂ€ivitab server.js.

Selle uuenduse abil saadakse kĂŒmme korda vĂ€iksema suurusega konteiner. Kui teie programmeerimiskeel vĂ”i tehnoloogia ei toeta baasimage'i vĂ€hendamise funktsiooni, kasutage Alpine Linuxi. See annab ka vĂ”imaluse tĂ€ielikult hallata konteineri sisu. VĂ€ikese suurusega baasimage'ide kasutamine on suurepĂ€rane viis vĂ€ikeste konteinerite kiireks loomiseks. Kuid veelgi suurema vĂ€hendamise saavutamiseks vĂ”ib kasutada Builder Pattern'i.

TÔlgitud keeltes edastatakse lÀhtekood kÔigepealt tÔlkijale ja seejÀrel tÔeliselt kÀivitatakse. Kompileeritavatest keeltest muudetakse lÀhtekood esmalt kompileeritud koodiks. Samas kasutab kompileerimine sageli tööriistu, mida tegelikult koodi kÀivitamiseks ei vajata. See tÀhendab, et saate need tööriistad lÔplikust konteinerist tÀielikult eemaldada. Selleks vÔib kasutada Builder Pattern'it.

Kood luuakse esimeses konteineris ja kompileeritakse. SeejÀrel pakitakse kompileeritud kood lÔplikku konteinerisse ilma kompilaatorite ja tööriistadeta, mis on vajalikud selle koodi kompileerimiseks. Vaatame seda protsessi lÀbi Go rakenduse. Esiteks, liigume onbuild image'ilt Alpine Linuxile.

Uues Docker-failis algab konteiner pildist golang:alpine. SeejÀrel loob ta katalooge koodi jaoks, kopeerib sinna lÀhtekoodi, ehitab selle ja kÀivitab rakenduse. See konteiner on oluliselt vÀiksem kui onbuild konteiner, kuid see sisaldab siiski kompilaatorit ja teisi Go tööriistu, mis meid tegelikult ei huvita. Seega laseme lihtsalt kompileeritud programmi vÀlja ja pakime selle enda konteinerisse.

VÔite mÀrgata midagi kummalist selles Docker-failis: see sisaldab kahte FROM rida. Esimene neljast reast nÀeb vÀlja just nagu eelmine Docker-fail, vÀlja arvatud see, et see kasutab mÀrksÔna AS, et nimetada seda etappi. JÀrgmises osas on uus FROM rida, mis vÔimaldab alustada uut pilti, kasutades alusena mitte golang:alpine, vaid Raw alpine.
Raw Alpine Linuxil ei ole peale installitud SSL-sertifikaate, mis toob kaasa enamikus API-ĂŒhendustes HTTPS-protokolli tĂ”rke, seega laseme installida mĂ”ned juure CA-sertifikaadid.
Ja nĂŒĂŒd kĂ”ige huvitavam: kompileeritud koodi kopeerimiseks esimesest konteinerist teise vĂ”ime lihtsalt kasutada COpy kĂ€sku, mis asub teises jaotises 5. reas. See kopeerib ainult ĂŒhe rakenduse faili ega puuduta Go tööriistu. Uus mitmeastmeline Docker-fail sisaldab konteineri pilti, mille suurus on vaid 12 megabaiti, kuigi algse konteineri pilt oli 700 megabaiti, mis on suur vahe!
Seega on vÀikeste aluskujutiste ja Builder Pattern'i kasutamine suurepÀrased viisid konteinerite loomiseks, mille suurus on oluliselt vÀiksem ilma palju vaeva nÀgemata.
VĂ”ib-olla sĂ”ltuvalt rakenduse tehnoloogiapakist on ka tĂ€iendavaid viise, kuidas pilti ja konteineri suurust vĂ€hendada, kuid kas tĂ”eliselt vĂ€ikesed konteinerid pakuvad mÔÔdetavat eelist? Vaadakem kaht aspekti, kus vĂ€ikesed konteinerid on ÀÀrmiselt tĂ”husad â need on jĂ”udlus ja turvalisus.
Selleks, et hinnata jÔudluse kasvu, vaatleme konteineri loomise, selle registrisse panemise (push) ja sealt eemaldamise (pull) protsessi kestvust. NÀete, et vÀiksema suurusega konteineril on ilmne eelis suurema konteineri ees.

Docker teeb kihtide vahemĂ€llu salvestamise, seega jĂ€rgnevate kogumiste tegemine toimub vĂ€ga kiiresti. Kuid paljudes CI-sĂŒsteemides, mida kasutatakse konteinerite kogumiseks ja testimiseks, kihte ei vahemĂ€lustata, mis tĂ€hendab, et siin on mĂ€rkimisvÀÀrne aja kokkuhoid. Nagu nĂ€ete, kestab suure konteineri koostamise aeg sĂ”ltuvalt teie masina vĂ”imsusest 34 kuni 54 sekundit, samas kui vĂ€iksemate konteinerite kasutamisel, mis on vĂ€hendatud Builder Patterniga, kestab see 23 kuni 28 sekundit. Sellise tĂŒĂŒpi operatsioonide korral on jĂ”udluse kasvu mÀÀr 40-50%. Niisiis, mĂ”elge lihtsalt, kui tihti te oma koodi loote ja testite.
PĂ€rast konteineri koostamist peate konteineri pildi (push container image) konteineriregistrisse panema, et saaksite seda hiljem kasutada oma Kubernetes'i klastris. Soovitan kasutada Google'i konteineriregistrit.

Kasutades Google Container Registry (GCR), maksate ainult âtooreâ salvestuse ja vĂ”rgu eest, lisatasu konteinerite haldamise eest ei kĂŒsita. See on konfidentsiaalne, turvaline ja vĂ€ga kiire. GCR kasutab paljusid nippe, et kiirendada pull-operatsiooni. Nagu nĂ€ete, kestab Docker Container Image'i pildi panemine kasutades go:onbuild olenevalt arvuti jĂ”udlusest 15 kuni 48 sekundit, samas kui sama operatsioon vĂ€iksema konteineri puhul kestab 14 kuni 16 sekundit, kusjuures madalama jĂ”udlusega masinate puhul suureneb kiirus kolm korda. Suuremate masinate puhul on aeg enam-vĂ€hem sama, kuna GCR kasutab globaalseid vahemĂ€lusid ĂŒldiste piltide andmebaasi jaoks, seega ei pea te neid ĂŒldse laadima. Madala jĂ”udlusega arvutis on CPU kitsaskohaks, seega on vĂ€ikeste konteinerite kasutamise eelis palju tuntavam.
Kui kasutate GCR-i, soovitan tungivalt kasutada Google Container Builderit (GCB) osana teie kogumissĂŒsteemist.

Nagu nĂ€ha, vĂ”imaldab selle kasutamine saavutada palju paremaid tulemusi Build+Push operatsiooni kestuse vĂ€hendamisel, vĂ”rreldes isegi vĂ”imsa masinaga â sellisel juhul kiireneb konteinerite koostamise ja saatmise protsess peaaegu kaks korda. Lisaks saad iga pĂ€ev 120 minutit tasuta koostamist, mis enamikul juhtudel rahuldab konteinerite loomise vajadusi.
Edasi tuleb kĂ”ige olulisem jĂ”udlusmÔÔdik â konteinerite tĂ”mbamise kiirus. Ja kui sind ei huvita liiga palju push operatsiooni kestus, siis pull protsessi kestus mĂ”jutab tĂ”siselt sĂŒsteemi ĂŒldist jĂ”udlust. Oletame, et sul on kolm sĂ”lme sisaldav klaster ja ĂŒks neist ebaĂ”nnestub. Kui kasutad haldussĂŒsteemi, nagu Google Kubernetes Engine, asendab see automaatselt mittetöötava sĂ”lme uuega. Kuid see uus sĂ”lm on tĂ€iesti tĂŒhi ning pead tĂ”mbama kĂ”ik oma konteinerid, et see hakkaks töötama. Kui pull operatsioon kestab liiga kaua, töötab kogu selle aja su klaster madalama jĂ”udlusega.
On palju olukordi, kus see vÔib juhtuda: see vÔib olla uue sÔlme lisamine klastrisse, sÔlmede vÀrskendamine vÔi isegi uue konteineri vahetamine juurutamiseks. SeetÔttu on pull tÔmbamisaega minimeerimine vÔtmetegur. Kindel on see, et vÀike konteiner laetakse alla palju kiiremini kui suur. Kui kasutad Kuberneteses mitut konteinerit, vÔib ajakulu olla vÀga mÀrkimisvÀÀrne.

Vaata antud vÔrdlust: pull operatsioon vÀikeste konteineritega vÔtab sÔltuvalt masina vÔimsusest 4-9 korda vÀhem aega kui sama operatsioon go:onbuild kasutamisel. VÀikese suurusega jagatud aluspiltide kasutamine kiirendab oluliselt aega ja kiirus, millega uued Kuberneteses sÔlmed saavad juurutada ja internetti siseneda.
Vaatame turvalisuse kĂŒsimust. Arvatakse, et vĂ€iksemad konteinerid on palju turvalisemad kui suured, kuna nende rĂŒnnakupind on vĂ€iksem. Kas see tĂ”esti nii on? Ăks Google Container Registry'i kasulikumaid funktsioone on vĂ”imalus automaatselt skaneerida teie konteinereid haavatavuste olemasolu osas. MĂ”ni kuu tagasi lĂ”in nii onbuild kui ka mitmeastmelisi anumaid, nii et vaatame, kas seal on mĂ”ni haavatav koht.

Tulemus on tĂ€helepanuvÀÀrne: vĂ€ikestes konteinerites leiti vaid 3 keskmist haavatavust, samas kui suurtes â 16 kriitilist ja 376 muud haavatavust. Kui vaadata suurte konteinerite sisu, on selge, et enamus turvaprobleeme ei ole seotud meie rakendusega, vaid programmidega, mida me isegi ei kasuta. Seega, kui inimesed rÀÀgivad suurest rĂŒnnakupinnast, mĂ”tlevad nad just sellele.

JĂ€reldus on selge: looge vĂ€ikeseid konteinereid, kuna need pakuvad reaalseid eeliseid teie sĂŒsteemi jĂ”udluses ja turvalisuses.

Veidi reklaami đ
AitÀh, et olete meiega. Kas teile meeldivad meie artiklid? Kas soovite nÀha rohkem huvitavat sisu? Toetage meid, tellides teenuse vÔi soovitades meid tuttavatele. , ainulaadne entry-level serverite analoog, mille oleme teie jaoks vÀlja mÔelnud: (saadaval RAID1 ja RAID10 variandid, kuni 24 tuuma ja kuni 40GB DDR4).
Dell R730xd on Equinixi Tier IV andmekeskuses Amsterdamis kaks korda odavam? Ainult meie juures Hollandis! Dell R420 â 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB â alates $99! Lugege sellest
Allikas: habr.com
