Kubernetes labākā prakse. Mazo konteineru veidoŔana

Kubernetes labākā prakse. Mazo konteineru veidoŔana

Pirmais solis izvietoÅ”anai pakalpojumā Kubernetes ir lietojumprogrammas ievietoÅ”ana konteinerā. Å ajā sērijā mēs apskatÄ«sim, kā varat izveidot mazu, droÅ”u konteinera attēlu.
Pateicoties Docker, konteinera attēlu izveide nekad nav bijusi tik vienkārÅ”a. Norādiet pamata attēlu, pievienojiet izmaiņas un izveidojiet konteineru.

Kubernetes labākā prakse. Mazo konteineru veidoŔana

Lai gan Ŕī metode ir lieliska darba sākÅ”anai, noklusējuma bāzes attēlu izmantoÅ”ana var izraisÄ«t nedroÅ”u darbu ar lieliem attēliem, kas ir pilni ar ievainojamÄ«bām.

Turklāt lielākajā daļā Docker attēlu bāzes attēlam tiek izmantots Debian vai Ubuntu, un, lai gan tas nodroÅ”ina izcilu saderÄ«bu un vieglu pielāgoÅ”anu (Docker fails aizņem tikai divas koda rindiņas), pamata attēli var pievienot simtiem megabaitu papildu slodzi jÅ«su konteineram. Piemēram, vienkārÅ”ais fails node.js lietojumprogrammai Go "hello-world" ir aptuveni 700 megabaiti, savukārt jÅ«su faktiskā lietojumprogramma ir tikai dažus megabaitus liels.

Kubernetes labākā prakse. Mazo konteineru veidoŔana

Tātad visa Ŕī papildu darba slodze ir digitālās telpas izniekoÅ”ana un lieliska droŔības ievainojamÄ«bu un kļūdu slēptuve. Tāpēc apskatÄ«sim divus veidus, kā samazināt konteinera attēla izmēru.

Pirmais ir mazu bāzes attēlu izmantoÅ”ana, otrais ir Builder Pattern izmantoÅ”ana. Mazāku bāzes attēlu izmantoÅ”ana, iespējams, ir vienkārŔākais veids, kā samazināt konteinera izmēru. Visticamāk, jÅ«su izmantotā valoda vai steks nodroÅ”ina oriÄ£inālo lietojumprogrammas attēlu, kas ir daudz mazāks par noklusējuma attēlu. ApskatÄ«sim mÅ«su konteineru node.js.

Kubernetes labākā prakse. Mazo konteineru veidoŔana

Pēc noklusējuma programmā Docker node:8 bāzes attēla izmērs ir 670 MB, bet node: 8-alpine attēla izmērs ir tikai 65 MB, tas ir, 10 reizes mazāks. Izmantojot mazāko Alpu bāzes attēlu, jÅ«s ievērojami samazināsiet konteinera izmēru. Alpine ir maza un viegla Linux izplatÄ«Å”ana, kas ir ļoti populāra Docker lietotāju vidÅ«, jo tā ir saderÄ«ga ar daudzām lietojumprogrammām, vienlaikus saglabājot mazus konteinerus. AtŔķirÄ«bā no standarta Docker ā€œnodeā€ attēla, ā€œnode:alpineā€ noņem daudz pakalpojumu failu un programmu, atstājot tikai tos, kas ir pietiekami, lai palaistu lietojumprogrammu.

Lai pārietu uz mazāku pamata attēlu, vienkārÅ”i atjauniniet Dockerfile, lai sāktu darbu ar jauno pamata attēlu:

Kubernetes labākā prakse. Mazo konteineru veidoŔana

Tagad atŔķirÄ«bā no vecā onbuild attēla jums ir jākopē savs kods konteinerā un jāinstalē visas atkarÄ«bas. Jaunā Dockerfile konteiners sākas ar node:alpine attēlu, pēc tam izveido koda direktoriju, instalē atkarÄ«bas, izmantojot NPM pakotņu pārvaldnieku, un visbeidzot palaiž server.js.

Kubernetes labākā prakse. Mazo konteineru veidoŔana

Å Ä« jauninājuma rezultātā tiek izveidots 10 reizes mazāks konteiners. Ja jÅ«su programmÄ“Å”anas valodai vai kaudzÄ«tei nav pamata attēla samazināŔanas funkcionalitātes, izmantojiet Alpine Linux. Tas arÄ« nodroÅ”inās iespēju pilnÄ«bā pārvaldÄ«t konteinera saturu. Mazu bāzes attēlu izmantoÅ”ana ir lielisks veids, kā ātri izveidot mazus konteinerus. Bet vēl lielāku samazinājumu var panākt, izmantojot Builder Pattern.

Kubernetes labākā prakse. Mazo konteineru veidoŔana

Interpretētajās valodās pirmkods vispirms tiek nodots tulkam un pēc tam tiek tieÅ”i izpildÄ«ts. Kompilētajās valodās avota kods vispirms tiek pārveidots par kompilētu kodu. Tomēr kompilācijā bieži tiek izmantoti rÄ«ki, kas faktiski nav nepiecieÅ”ami koda palaiÅ”anai. Tas nozÄ«mē, ka jÅ«s varat pilnÄ«bā izņemt Å”os rÄ«kus no gala konteinera. Å im nolÅ«kam varat izmantot Builder Pattern.

Kubernetes labākā prakse. Mazo konteineru veidoŔana

Kods tiek izveidots pirmajā konteinerā un apkopots. Pēc tam apkopotais kods tiek iesaiņots galÄ«gajā konteinerā bez kompilatoriem un rÄ«kiem, kas nepiecieÅ”ami Ŕī koda apkopoÅ”anai. PalaidÄ«sim lietojumprogrammu Go, izmantojot Å”o procesu. Pirmkārt, mēs pāriesim no onbuild attēla uz Alpine Linux.

Kubernetes labākā prakse. Mazo konteineru veidoŔana

Jaunajā Dockerfile konteiners sākas ar attēlu golang:alpine. Pēc tam tas izveido koda direktoriju, kopē to avota kodā, izveido Å”o avota kodu un palaiž lietojumprogrammu. Å is konteiners ir daudz mazāks nekā onbuild konteiners, taču tajā joprojām ir iekļauts kompilators un citi Go rÄ«ki, kas mums Ä«sti nav vajadzÄ«gi. Tātad vienkārÅ”i izvilksim kompilēto programmu un ievietosim to savā konteinerā.

Kubernetes labākā prakse. Mazo konteineru veidoŔana

Å ajā Docker failā varat pamanÄ«t kaut ko dÄ«vainu: tajā ir divas rindiņas FROM. Pirmā 4 rindiņu sadaļa izskatās tieÅ”i tāda pati kā iepriekŔējā Dockerfile, izņemot to, ka tā izmanto AS atslēgvārdu, lai nosauktu Å”o posmu. Nākamajā sadaļā ir jauna rindiņa FROM, lai sāktu jaunu attēlu, kur golang:alpine attēla vietā kā bāzes attēlu izmantosim Raw alpine.

Raw Alpine Linux nav instalēts neviens SSL sertifikāts, tādēļ lielākā daļa API zvanu, izmantojot HTTPS, neizdosies, tāpēc instalēsim dažus saknes CA sertifikātus.

Tagad nāk jautrā daļa: lai kopētu apkopoto kodu no pirmā konteinera uz otro, varat vienkārÅ”i izmantot komandu COPY, kas atrodas otrās sadaļas 5. rindā. Tas kopēs tikai vienu lietojumprogrammas failu un neietekmēs Go utilÄ«ta rÄ«kus. Jaunajā daudzpakāpju Docker failā bÅ«s konteinera attēls, kura izmērs ir tikai 12 megabaiti, salÄ«dzinot ar sākotnējo konteinera attēlu, kas bija 700 megabaiti, kas ir liela atŔķirÄ«ba!
Tāpēc mazu bāzes attēlu un Builder Pattern izmantoÅ”ana ir lielisks veids, kā bez liela darba izveidot daudz mazākus konteinerus.
Iespējams, ka atkarÄ«bā no lietojumprogrammu kopas ir papildu veidi, kā samazināt attēla un konteinera izmēru, taču vai maziem konteineriem patieŔām ir izmērāms ieguvums? ApskatÄ«sim divas jomas, kurās mazie konteineri ir ārkārtÄ«gi efektÄ«vi ā€“ veiktspēju un droŔību.

Lai novērtētu veiktspējas pieaugumu, apsveriet konteinera izveides procesa ilgumu, ievietoÅ”anu reÄ£istrā (push) un pēc tam izguvi no turienes (izvilkÅ”ana). JÅ«s varat redzēt, ka mazākam konteineram ir izteiktas priekÅ”rocÄ«bas salÄ«dzinājumā ar lielāku konteineru.

Kubernetes labākā prakse. Mazo konteineru veidoŔana

Docker saglabās slāņus keÅ”atmiņā, tāpēc turpmākās bÅ«ves bÅ«s ļoti ātras. Tomēr daudzas CI sistēmas, ko izmanto konteineru veidoÅ”anai un testÄ“Å”anai, neglabā slāņus keÅ”atmiņā, tāpēc tiek ietaupÄ«ts ievērojams laiks. Kā redzat, laiks liela konteinera izveidoÅ”anai atkarÄ«bā no jÅ«su maŔīnas jaudas ir no 34 lÄ«dz 54 sekundēm, un, izmantojot konteineru, tas tiek samazināts, izmantojot Builder Pattern - no 23 lÄ«dz 28 sekundēm. Šāda veida operācijām produktivitātes pieaugums bÅ«s 40-50%. Tāpēc padomājiet par to, cik reižu veidojat un pārbaudāt savu kodu.

Kad konteiners ir izveidots, tā attēls (push konteinera attēls) ir jāievieto konteinera reģistrā, lai pēc tam varētu to izmantot savā Kubernetes klasterī. Es iesaku izmantot Google konteineru reģistru.

Kubernetes labākā prakse. Mazo konteineru veidoŔana

Izmantojot Google konteineru reÄ£istru (GCR), jÅ«s maksājat tikai par neapstrādātu krātuvi un tÄ«kla izveidi, un nav jāmaksā papildu konteineru pārvaldÄ«bas maksa. Tas ir privāts, droÅ”s un ļoti ātrs. GCR izmanto daudzus trikus, lai paātrinātu vilkÅ”anas darbÄ«bu. Kā redzat, Docker Container Image konteinera ievietoÅ”ana, izmantojot go:onbuild, aizņems no 15 lÄ«dz 48 sekundēm atkarÄ«bā no datora veiktspējas, un tā pati darbÄ«ba ar mazāku konteineru aizņems no 14 lÄ«dz 16 sekundēm un mazāk produktÄ«vām iekārtām. darbÄ«bas ātruma priekÅ”rocÄ«ba palielinās 3 reizes. Lielākiem datoriem laiks ir aptuveni vienāds, jo GCR koplietojamai attēlu datubāzei izmanto globālo keÅ”atmiņu, kas nozÄ«mē, ka jums tie vispār nav jāielādē. Mazjaudas datorā centrālais procesors ir saÅ”aurinājums, tāpēc mazu konteineru izmantoÅ”anas priekÅ”rocÄ«bas Å”eit ir daudz lielākas.

Ja izmantojat GCR, es ļoti iesaku izmantot Google konteineru veidotāju (GCB) kā daļu no jÅ«su veidoÅ”anas sistēmas.

Kubernetes labākā prakse. Mazo konteineru veidoŔana

Kā redzat, tā izmantoÅ”ana ļauj sasniegt daudz labākus rezultātus Build+Push darbÄ«bas ilguma samazināŔanā nekā pat produktÄ«va maŔīna - Å”ajā gadÄ«jumā konteineru veidoÅ”anas un nosÅ«tÄ«Å”anas process resursdatoram tiek paātrināts gandrÄ«z 2 reizes. . Turklāt jÅ«s katru dienu saņemat 120 bezmaksas bÅ«vniecÄ«bas minÅ«tes, kas vairumā gadÄ«jumu sedz jÅ«su konteineru veidoÅ”anas vajadzÄ«bas.

Tālāk seko vissvarÄ«gākā veiktspējas metrika ā€” Pull konteineru izguves vai lejupielādes ātrums. Un, ja jÅ«s neinteresē laiks, kas pavadÄ«ts push darbÄ«bai, tad vilkÅ”anas procesa ilgums nopietni ietekmē kopējo sistēmas veiktspēju. Pieņemsim, ka jums ir trÄ«s mezglu kopa, un viens no tiem neizdodas. Ja izmantojat pārvaldÄ«bas sistēmu, piemēram, Google Kubernetes Engine, tā automātiski aizstās miruÅ”o mezglu ar jaunu. Tomēr Å”is jaunais mezgls bÅ«s pilnÄ«gi tukÅ”s, un jums bÅ«s jāievelk visi konteineri, lai tas sāktu darboties. Ja vilkÅ”anas darbÄ«ba aizņem pietiekami ilgu laiku, jÅ«su kopa visu laiku darbosies ar zemāku veiktspēju.

Tas var notikt daudzos gadÄ«jumos: jauna mezgla pievienoÅ”ana klasterim, mezglu jaunināŔana vai pat pāreja uz jaunu konteineru izvietoÅ”anai. Tādējādi par galveno faktoru kļūst vilkÅ”anas ekstrakcijas laika samazināŔana. Nav noliedzams, ka mazs konteiners tiek lejupielādēts daudz ātrāk nekā liels. Ja Kubernetes klasterÄ« izmantojat vairākus konteinerus, laika ietaupÄ«jums var bÅ«t ievērojams.

Kubernetes labākā prakse. Mazo konteineru veidoŔana

Apskatiet Å”o salÄ«dzinājumu: mazo konteineru vilkÅ”ana aizņem 4ā€“9 reizes mazāk laika, atkarÄ«bā no iekārtas jaudas, nekā tāda pati darbÄ«ba, izmantojot go:onbuild. Izmantojot koplietotus, mazu konteineru bāzes attēlus, ievērojami paātrina jaunu Kubernetes mezglu izvietoÅ”anas un tieÅ”saistes savienoÅ”anas laiku un ātrumu.

ApskatÄ«sim droŔības jautājumu. Mazāki konteineri tiek uzskatÄ«ti par daudz droŔākiem nekā lielāki, jo tiem ir mazāka uzbrukuma virsma. Vai tieŔām? Viena no noderÄ«gākajām Google konteineru reÄ£istra funkcijām ir iespēja automātiski skenēt jÅ«su konteinerus, lai noteiktu ievainojamÄ«bas. Pirms dažiem mēneÅ”iem es izveidoju gan onbuild, gan daudzpakāpju konteinerus, tāpēc paskatÄ«simies, vai tur nav ievainojamÄ«bas.

Kubernetes labākā prakse. Mazo konteineru veidoŔana

Rezultāts ir pārsteidzoÅ”s: nelielā konteinerā tika atklātas tikai 3 vidējas ievainojamÄ«bas, bet lielā konteinerā tika atrastas 16 kritiskas un 376 citas ievainojamÄ«bas. Ja paskatāmies uz liela konteinera saturu, redzams, ka lielākajai daļai droŔības problēmu nav nekāda sakara ar mÅ«su lietojumprogrammu, bet gan tās ir saistÄ«tas ar programmām, kuras mēs pat neizmantojam. Tātad, kad cilvēki runā par lielu uzbrukuma virsmu, tas ir tas, ko viņi domā.

Kubernetes labākā prakse. Mazo konteineru veidoŔana

Ņemiet vērā, ka ir skaidrs: izveidojiet mazus konteinerus, jo tie nodroÅ”ina reālas veiktspējas un droŔības priekÅ”rocÄ«bas jÅ«su sistēmai.

Kubernetes labākā prakse. Kubernetes organizācija ar nosaukumvietu

Dažas reklāmas šŸ™‚

Paldies, ka palikāt kopā ar mums. Vai jums patīk mūsu raksti? Vai vēlaties redzēt interesantāku saturu? Atbalsti mūs, pasūtot vai iesakot draugiem, mākoņa VPS izstrādātājiem no 4.99 USD, unikāls sākuma līmeņa serveru analogs, ko mēs jums izgudrojām: Visa patiesība par VPS (KVM) E5-2697 v3 (6 kodoli) 10GB DDR4 480GB SSD 1Gbps no 19$ vai kā koplietot serveri? (pieejams ar RAID1 un RAID10, līdz 24 kodoliem un līdz 40 GB DDR4).

Dell R730xd 2x lētāk Equinix Tier IV datu centrā Amsterdamā? Tikai Å”eit 2x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV no 199$ NÄ«derlandē! Dell R420 ā€” 2x E5-2430 2.2 GHz 6C 128 GB DDR3 2x960 GB SSD 1 Gbps 100 TB ā€” no 99 USD! LasÄ«t par Kā izveidot infrastruktÅ«ras uzņēmumu klase ar Dell R730xd E5-2650 v4 serveru izmantoÅ”anu 9000 eiro par santÄ«mu?

Avots: www.habr.com

Pievieno komentāru