âPilvemaandatudâ (cloud native) vĂ”i lihtsalt âpilveâ rakendused luuakse spetsiaalselt toimima pilvplatvormides. Need on tavaliselt ĂŒles ehitatud nĂ”rkade sidemetega mikroteenustest, mis on pakitud konteineritesse, mida haldab pilveplatvorm. Sellised rakendused on vaikimisi hĂ€irekindlad, mistĂ”ttu toimivad ja skaleeruvad nad usaldusvÀÀrselt ka tĂ”siste infrastruktuuri rikete korral. Teiselt poolt on piirangute kogum (lepingud), mida pilveplatvorm rakendustele rakendab, et suuta neid automaatreĆŸiimis hallata.

MĂ”istes hĂ€sti ĂŒlemineku tĂ€htsust ja vajalikkust pilve rakendustele, ei tea paljud organisatsioonid siiski, kust alustada. Selles postituses vaatame mitmeid pĂ”himĂ”tteid, mille jĂ€rgimine konteinerirakenduste arendamisel vĂ”imaldab tĂ€ielikult Ă€ra kasutada pilveteenuseid ning saavutada rakenduste usaldusvÀÀrne toimimine ja skaleerimine isegi tĂ”siste IT-infrastruktuuri tĂ”rgete korral. Siin esitatud pĂ”himĂ”tete lĂ”ppeesmĂ€rk on Ă”ppida looma rakendusi, mida saavad automaatselt hallata pilveplatvormid nagu Kubernetes.
Tarkvaraarenduse pÔhimÔtted
Programmeermise maailmas mĂ”istetakse pĂ”himĂ”tete all ĂŒsna ĂŒldiseid reegleid, mida tuleb jĂ€rgida tarkvara arendamisel. Neid saab rakendada igas programmeerimiskeeles. Igal pĂ”himĂ”ttel on oma eesmĂ€rgid, mille saavutamiseks kasutatakse tavaliselt malle ja praktikaid. Samuti on rida pĂ”hieesmĂ€rke kvaliteetse tarkvara loomise pĂ”himĂ”tteid, millest kĂ”ik teised pĂ”himĂ”tted tulenevad. Toome vĂ€lja mĂ”ned pĂ”hieesmĂ€rkide nĂ€ited:
- (Keep it simple, stupid) â mitte keeruliseks muuta;
- (Donât repeat yourself) â Ă€ra korduma;
- (You arenât gonna need it) â Ă€ra loo seda, mida sul hetkel ei ole vaja;
- (Separation of concerns) â lahenda mured eraldi.
Nagu nĂ€ha, need printsiibid ei sea mingit konkreetset reeglistikku, vaid kuuluvad âterve mĂ”istuseâ kategooriasse, mis tugineb praktilisele kogemusele ja mida jagavad paljud arendajad ning millele nad regulaarselt viitavad.
Lisaks on olemas â viis esimest objekti-orienteeritud programmeerimise ja projekteerimise printsiipi, mille sĂ”nastas Robert Martin. SOLID hĂ”lmab ĂŒldistatud ja tĂ”lgendatavates vastastikku tĂ€iustavaid printsiiple, mis â kui neid kokku rakendada â aitavad luua kvaliteetsemaid tarkvarasĂŒsteeme ja paremini neid pikaajaliselt hooldada.
SOLID pĂ”himĂ”tted kuuluvad OOP valdkonda ja on formuleeritud selliste mĂ”istete ja kontseptide keeles nagu klassid, liidesed ja pĂ€rimine. Analoogiliselt on ka pilvepĂ”histe rakenduste jaoks vĂ”imalik sĂ”nastada arenduse pĂ”himĂ”tted, kus pĂ”hielemendiks ei ole klass, vaid konteiner. Nende pĂ”himĂ”tete jĂ€rgimine vĂ”imaldab luua konteineripĂ”hiseid rakendusi, mis vastavad paremini pilveteenuste, nagu Kubernetes, eesmĂ€rkidele ja ĂŒlesannetele.
PilvepÔhised konteinerid: Red Hat'i lÀhenemine
TÀnapÀeval on konteineritesse suhteliselt lihtne panna praktiliselt igasuguseid rakendusi. Kuid et rakendusi oleks tÔhusalt automatiseeritud ja orkestreeritud pilveplatvormil nagu Kubernetes, on vajalik teha lisapingutusi.
Allpool esitatud ideede aluseks on metodoloogia ja palju teisi töid, mis kĂ€sitlevad veebirakenduste loomise erinevaid aspekte, alates allika juhtimisest kuni skaleerimisemudelite jaotamiseni. Kirjeldatud pĂ”himĂ”tted kehtivad ainult konteineripĂ”histe rakenduste arendamiseks, mis on loodud mikroteenuste alusel ja mĂ”eldud pilveplatvormidele, nagu Kubernetes. Meie arutluse aluseks on konteineri pilt, ning sihtkeskkonnana mĂ”istetakse konteinerite orkestreerimise platvormi. Pakutud pĂ”himĂ”tete eesmĂ€rk on luua konteinerid, mille jaoks enamikul orkestreerimisplatvormidel on vĂ”imalik automatiseerida ĂŒlesannete ajastamist (scheduling â hosti valimine konteineri eksemplari kĂ€ivitamiseks), skaleerimist ja jĂ€lgimist. PĂ”himĂ”tted esitatakse vabakujuliselt.
Ăhe mure pĂ”himĂ”te (Single Concern Principle, SCP)
See pĂ”himĂ”te on paljuski sarnane ĂŒhe vastutuse pĂ”himĂ”ttega (Single Responsibility Principle, ), mis on SOLID'i osa ja ĂŒtleb, et igal objektidel peab olema ĂŒks vastutus, ja see vastutus peab olema tĂ€ielikult kapseldatud klassis. SRP olemus seisneb selles, et iga vastutus on muutuste pĂ”hjus, ning klassil peab olema ĂŒks ja ainult ĂŒks muutuste pĂ”hjus.
SCP puhul kasutame sĂ”na "vastutus" (responsibility) asemel sĂ”na "ĂŒlesanne" (concern), et viidata kĂ”rgemale abstraktsioonitasemele ja laiemale konteineri mÀÀratlemisele vĂ”rreldes OOP-klassi. Ja kui SRP eesmĂ€rk on omada ainult ĂŒhte muutuste pĂ”hjust, siis SCP taga on soov suurendada konteinerite uuesti kasutamise ja asendamise vĂ”imalusi. JĂ€rgides SRP-d ja luues konteineri, mis lahendab ainult ĂŒhe ĂŒlesande ja teeb seda funktsionaalselt tĂ€iendavalt, suurendate tĂ”enĂ€osust, et selle konteineri mudelit saab kasutada erinevates rakenduse kontekstides.
SCP pĂ”himĂ”te ĂŒtleb, et iga konteiner peab lahendama ĂŒhe kindla ĂŒlesande ja tegema seda hĂ€sti. SCP saavutamine konteinerite maailmas on lihtsam kui SRP OOP-is, kuna konteinerid tĂ€idavad tavaliselt ĂŒhte protsessi, mis enamiku ajast tegeleb ĂŒhe ja ainulaadse ĂŒlesandega.
Kui mingisugune konteineripĂ”hine mikroteenus peab lahendama korraga mitmeid ĂŒlesandeid, saab selle jagada ĂŒhekordseteks konteineriteks ja koostada need ĂŒhe podi (konteineripakettide levitamiseks mĂ”eldud ĂŒksus) alla, kasutades sidecar ja init-konteineri mudeleid. Lisaks lihtsustab SCP vana konteineri (nt veebiserveri vĂ”i sĂ”numi vahendi) asendamist uuega, mis lahendab sama ĂŒlesande, kuid omab laiendatud funktsionaalsust vĂ”i paremat skaleeritavust.

KÔrge jÀlgitavuse pÔhimÔte (High Observability Principle, HOP)
Konteinerite kasutamine rakenduste standardiseeritud pakkimise ja kĂ€ivitamise viisina tĂ€hendab, et rakendused ise kĂ€sitletakse kui âmust kastiâ. Siiski, kui need on pilve-konteinerid, peavad nad pakkuma kĂ€ituskeskkonnale spetsiifilisi API-liideseid, et kontrollida konteinerite seisukorda ja vajadusel vĂ”tta vastavad meetmed. Ilma selleta ei ole vĂ”imalik standardiseerida konteinerite uuendamise automatiseerimist ja nende elutsĂŒkli haldamist, mis omakorda halvendab tarkvarasĂŒsteemi töökindlust ja kasutusmugavust.
Praktikas peaks konteinerirakendusel olema vĂ€hemalt API erinevate staatuse kontrollide jaoks: aktiivsuse (liveness) ja valmisoleku (readiness) testide jaoks. Kui rakendus nĂ”uab rohkem, peaks see pakkuma ka muid vahendeid oma seisundi kontrollimiseks. NĂ€iteks oluliste sĂŒndmuste logimist STDERR ja STDOUT kaudu, et logisid koguda selliste tööriistade abil nagu Fluentd, Logstash ja teised sarnased. Samuti integreerimine jĂ€lgimise ja mÔÔtmiste kogumise teekidega, nagu OpenTracing, Prometheus jne.
Ăldiselt vĂ”ib rakendust endiselt kĂ€sitleda kui 'must kaste', kuid seda tuleb varustada kĂ”igi API-dega, mis on vajalikud platvormile, et seda parimal viisil jĂ€lgida ja juhtida.
ElutsĂŒkli vastavuse printsiip (Life-cycle Conformance Principle, LCP)
LCP on HOP-i vastand. Kui HOP ĂŒtleb, et konteiner peab platvormile pakkuma API-liideseid lugemiseks, siis LCP nĂ”uab rakenduselt vĂ”imet vastu vĂ”tta teavet platvormilt. Samuti peab konteiner mitte ainult sĂŒndmusi saama, vaid ka nendel reageerima. Seega on see printsiip, mida saab kĂ€sitleda nĂ”udena pakkuda platvormile API-liideseid kirjutamiseks.

Platvormidel on erinevat liiki sĂŒndmusi, mis aitavad hallata konteineri elutsĂŒklit. Kuid otsustada, milliseid neist tajuda ja kuidas reageerida, peab rakendus ise.
On selge, et mĂ”ned sĂŒndmused on olulisemad kui teised. NĂ€iteks, kui rakendus ei talu ootamatut sulgemist, peab see aktsepteerima signaale signal: terminate (SIGTERM) ja kĂ€ivitama oma sulgemisprotseduuri nii kiiresti kui vĂ”imalik, et jĂ”uda signaalini signal: kill (SIGKILL), mis jĂ€rgneb SIGTERM-le.
Lisaks vĂ”ivad rakenduse elutsĂŒkli jaoks olla olulised sellised sĂŒndmused nagu PostStart ja PreStop. NĂ€iteks pĂ€rast kĂ€ivitamist vĂ”ib rakendusel olla vaja teatud aega âĂŒles soojendamiseksâ, enne kui see suudab pĂ€ringutele vastata. VĂ”i peab rakendus teatud viisil vabastama ressursid, kui see lĂ”petab töötamise.
Konteineripildi muutumatuse pÔhimÔte (Image Immutability Principle, IIP)
On ĂŒldiselt arvatud, et konteinerirakendused peavad pĂ€rast kokkupanekut jÀÀma muutmatuks, isegi kui neid kĂ€ivitatakse erinevates keskkondades. Seega tuleneb vajadus andmete salvestamine kĂ€itamise ajal eksternaliseerida (teisisĂ”nu, kasutada selleks vĂ€list vahendit) ning toetuda vĂ€listelt, konkreetse kĂ€ituskeskkonna jaoks seadistatud konfiguratsioonidelt, selle asemel et modifitseerida vĂ”i luua unikaalseid konteinerid igaks keskkonnaks. PĂ€rast rakenduses tehtud muudatusi tuleb konteineri kujundus uuesti kokku panna ja rakendada kĂ”ikides kasutatavates keskkondades. Muide, IT-sĂŒsteemide haldamisel kasutatakse sarnast pĂ”himĂ”tet, mida tuntakse serverite ja infrastruktuuri muutumatuse printsiibina.
IIP eesmĂ€rk on vĂ€ltida eraldi konteineripiltide loomist erinevate kĂ€ituskeskkondade jaoks ja kasutada igal pool sama pilti koos konkreetse keskkonna jaoks sobiva konfiguratsiooniga. Selle pĂ”himĂ”tte jĂ€rgimine vĂ”imaldab rakendada olulisi pilvesĂŒsteemide automatiseerimise praktikaid, nagu rakenduse uuenduste tagasivĂ”tmine (roll-back) ja edasi viimine (roll-forward).

Protsesside ĂŒhekordsuse pĂ”himĂ”te (Process Disposability Principle, PDP)
Ăks konteineri olulisemaid omadusi on selle efemeersus: konteineri koopia on lihtsalt loodav ja hĂ€vitatav, seega vĂ”ib selle igal hetkel hĂ”lpsasti asendada teise koopia vastu. Asendamiseks vĂ”ib olla palju pĂ”hjuseid: tĂ”rge, rakenduse skaleerimine, teisaldamine teisele serverile, ressursiotsing vĂ”i muud olukorrad.
SeetĂ”ttu peavad konteinerirakendused salvestama oma oleku mingite vĂ€listest vahenditest vĂ”i kasutama selleks sisemisi jaotatud skeeme koos ĂŒleliiga. Lisaks peab rakendus kiiresti kĂ€ivituma ja kiiresti lĂ”petama ning olema valmis Ă€kilisteks seadme riketeks.
Ăks praktika, mis aitab seda pĂ”himĂ”tet ellu viia, on vĂ€ikeste konteinerite loomine. Pilveteenused saavad automaatselt valida hosti konteineri koopia kĂ€ivitamiseks, seega, mida vĂ€iksem on konteineri suurus, seda kiiremini see kĂ€ivitatakse â see lihtsalt kopeeritakse kiiremini sihtserverile ĂŒle vĂ”rgu.
Iseseisvuse pÔhimÔte (Self-containment Principle, S-CP)
Selle pĂ”himĂ”tte kohaselt sisaldab konteiner koostamise etapis kĂ”iki vajalikke komponente. Konteinerit tuleb ehitada eeldusel, et sĂŒsteemis on ainult puhas Linuxi tuum, seega peavad kĂ”ik vajalikud tĂ€iendavad teegid olema konteineris. Seal peavad olema ka sellised asjad nagu vastava programmeerimiskeele tööelu keskkond, rakenduste platvorm (vajadusel) ja muud sĂ”ltuvused, mis on vajalikud konteinerirakenduse töötamiseks.

Erandid tehakse vaid konfigureerimisele, mis varieeruvad keskkondade vahel ja tuleb esitada kÀitamise etapis, nÀiteks Kubernetes ConfigMapi kaudu.
Rakendus vĂ”ib sisaldada mitmeid konteineriseeritud komponente, nĂ€iteks eraldi andmebaasi konteinerit konteineriseeritud veebirakenduse osana. S-CP pĂ”himĂ”tte kohaselt ei tohiks neid kokku liita, vaid peab tagama, et andmebaasi konteiner sisaldab kĂ”ike vajalikku andmebaasi tööks ja veebirakenduse konteiner â kĂ”ike vajalikku veebirakenduse töötamiseks, sealhulgas veebiserver. SeetĂ”ttu sĂ”ltub veebirakenduse konteiner andmebaasi konteinerist ja pöördub selle poole vastavalt vajadusele.
KÀitusaja piirangu pÔhimÔte (Runtime Confinement Principle, RCP)
S-CP pĂ”himĂ”te mÀÀrab, kuidas konteinerit koguda ja mida binÀÀrfail pilt peaks sisaldama. Kuid konteiner ei ole lihtsalt 'must kast', millel on ainult ĂŒks omadus â failisuurus. KĂ€itamise ajal omandab konteiner ka teisi mÔÔtmeid: kasutatava mĂ€lu maht, CPU aeg ja teised sĂŒsteemiressursid.

Siin tuleb appi RCP printsiip, mille kohaselt peab konteiner dekodeerima oma nĂ”udmised sĂŒsteemiressurssidele ja edastama need platvormile. Omades iga konteineri ressursiprofiile (kui palju tal on vaja protsessorivĂ”imet, mĂ€lu, vĂ”rgu ja salvestusruumi), saab platvorm optimaalselt teostada haldamise ja automaatse skaaleerimise, hallata IT-vĂ”imekusi ja tagada SLA tasemed konteinerite jaoks.
Lisaks konteineri ressursinĂ”uete rahuldamisele on rakendusele samuti oluline mitte ĂŒletada enda mÀÀratud piire. Vastupidisel juhul, ressursi puudujÀÀgi korral, on platvorm palju tĂ”enĂ€olisem, et lisab selle rakenduste nimekirja, mida tuleb katkestada vĂ”i migreerida.
RÀÀkides pilve-fookusest, mÔistame me eelkÔige tööviisi.
Oleme ĂŒlalpool sĂ”nastanud mitmeid ĂŒldpĂ”himĂ”tteid, mis loovad metoodilise aluse kvaliteetsete konteinerirakenduste ehitamiseks pilveskeskkondades.
Oluline on mĂ€rkida, et lisaks nendele ĂŒldistele pĂ”himĂ”tetele vajate ka tĂ€iendavaid edasijĂ”udnud meetodeid ja tehnikate kasutamiseks konteinerite haldamisel. Samuti oleme koostanud mĂ”ned lĂŒhikesed soovitused, millel on spetsiifilisem sisu ja mida tuleb rakendada (vĂ”i mitte rakendada) vastavalt olukorrale:
- PĂŒĂŒdke vĂ€hendada kujutiste suurust: kustutage ajutised failid ja vĂ€ltige tarbetute pakettide installimist â mida vĂ€iksem on konteiner, seda kiiremini see ehitatakse ja kopeeritakse sihthostile ĂŒle vĂ”rgu.
- Seadke oma kasutajapalve juhuslikele User-ID-dele: Àrge kasutage sudo kÀsku ega mingeid erilisi userid'e oma konteinerite kÀitamiseks.
- MĂ€rgistage olulised pordid: pordinumme saab mÀÀrata ka kĂ€itamise ajal, kuid parem on need mÀÀrata EXPOSE kĂ€su abil â teistel inimestel ja programmidel on teie kujutiste kasutamine lihtsam.
- Salvestage pĂŒsivad andmed mahtudele: andmed, mis peavad jÀÀma pĂ€rast konteineri kustutamist, tuleks salvestada mahtudele.
- Kirjutage kujutise metaandmed: sildid, mĂ€rgid ja annotatsioonid lihtsustavad kujutiste kasutamist â teised arendajad on teile tĂ€nulikud.
- SĂŒnkroniseerige host ja pildid: teatud konteinerirakenduste jaoks on vaja sĂŒnkroniseerida konteiner hostiga teatud atribuutide, nĂ€iteks aja vĂ”i masina ID kaudu.
- LÔpetuseks jagame malle ja parimaid praktikaid, mis aitavad tÔhusamalt rakendada eespool loetletud printsiipe:
11. juuni kell 11.00
Mida te Ôppida saate:
- Immutable Red Hat Enterprise Linux CoreOS
- OpenShift teenusevahetus
- Operator raamistik
- Knative raamistik
Allikas: habr.com
