VietÄjie faili, migrÄjot lietojumprogrammu uz Kubernetes
Veidojot CI/CD procesu, izmantojot Kubernetes, dažkÄrt rodas problÄmas nesaderÄ«ba starp jaunÄs infrastruktÅ«ras prasÄ«bÄm un uz to pÄrsÅ«tÄ«to lietojumprogrammu. Jo Ä«paÅ”i lietojumprogrammas izveides stadijÄ ir svarÄ«gi iegÅ«t viens attÄls, kas tiks izmantots viss projektu vides un klasteri. Å is princips ir pareizÄ pamatÄ saskaÅÄ ar Google konteineru pÄrvaldÄ«ba (vairÄk nekÄ vienu reizi par to teica un mÅ«su tehniskajÄ nodaļÄ).
TomÄr jÅ«s neredzÄsit nevienu situÄcijÄs, kad vietnes kods izmanto gatavu ietvaru, kura izmantoÅ”ana ierobežo tÄs turpmÄko izmantoÅ”anu. Un, lai gan ānormÄlÄ vidÄā ar to ir viegli tikt galÄ, Kubernetes Ŕī uzvedÄ«ba var kļūt par problÄmu, it Ä«paÅ”i, ja ar to saskaraties pirmo reizi. Lai gan atjautÄ«gs prÄts var nÄkt klajÄ ar infrastruktÅ«ras risinÄjumiem, kas pirmajÄ mirklÄ« Ŕķiet paÅ”saprotami vai pat labi... ir svarÄ«gi atcerÄties, ka vairums situÄciju var un vajag jÄatrisina arhitektoniski.
ApskatÄ«sim populÄros risinÄjumus failu glabÄÅ”anai, kas var radÄ«t nepatÄ«kamas sekas, darbinot klasteru, kÄ arÄ« norÄdÄ«sim pareizÄku ceļu.
StatiskÄ krÄtuve
Lai ilustrÄtu, apsveriet tÄ«mekļa lietojumprogrammu, kas izmanto sava veida statisko Ä£eneratoru, lai iegÅ«tu attÄlu, stilu un citu lietu kopu. PiemÄram, Yii PHP ietvarÄ ir iebÅ«vÄts lÄ«dzekļu pÄrvaldnieks, kas Ä£enerÄ unikÄlus direktoriju nosaukumus. AttiecÄ«gi izvade ir statiskÄs vietnes acÄ«mredzami nekrustojoÅ”u ceļu kopa (tas tika darÄ«ts vairÄku iemeslu dÄļ - piemÄram, lai novÄrstu dublikÄtus, ja vienu un to paÅ”u resursu izmanto vairÄki komponenti). TÄtad, pirmo reizi piekļūstot tÄ«mekļa resursu modulim, statiskie faili (patiesÄ«bÄ bieži vien simbolu saites, bet vairÄk par to vÄlÄk) tiek izveidoti un izkÄrtoti ar kopÄ«gu saknes direktoriju, kas ir unikÄls Å”ai izvietoÅ”anai:
webroot/assets/2072c2df/css/ā¦
webroot/assets/2072c2df/images/ā¦
webroot/assets/2072c2df/js/ā¦
Ko tas nozÄ«mÄ klastera izteiksmÄ?
VienkÄrÅ”Äkais piemÄrs
Å emsim diezgan izplatÄ«tu gadÄ«jumu, kad statisko datu izplatÄ«Å”anai un vienkÄrÅ”u pieprasÄ«jumu apstrÄdei PHP priekÅ”Ä ir nginx. VieglÄkais veids - IzvietoÅ”anas ar diviem konteineriem:
Kad pirmo reizi piekļūstat vietnei, lÄ«dzekļi tiek parÄdÄ«ti PHP konteinerÄ. Bet gadÄ«jumÄ, ja vienÄ podÄ ir divi konteineri, nginx neko nezina par Å”iem statiskajiem failiem, kuri (pÄc konfigurÄcijas) viÅiem bÅ«tu jÄiedod. RezultÄtÄ klients visiem pieprasÄ«jumiem uz CSS un JS failiem redzÄs kļūdu 404. VienkÄrÅ”Äkais risinÄjums Å”eit bÅ«tu izveidot kopÄ«gu konteineru direktoriju. PrimitÄ«vs variants - vispÄrÄ«gs emptyDir:
Tagad nginx pareizi apkalpo konteinerÄ Ä£enerÄtos statiskos failus. Bet ļaujiet man atgÄdinÄt, ka tas ir primitÄ«vs risinÄjums, kas nozÄ«mÄ, ka tas ir tÄlu no ideÄla un tam ir savas nianses un trÅ«kumi, par kuriem mÄs runÄsim tÄlÄk.
Uzlabota krÄtuve
Tagad iedomÄjieties situÄciju, kad lietotÄjs apmeklÄja vietni, ielÄdÄja lapu ar konteinerÄ pieejamajiem stiliem un, kamÄr viÅÅ” lasÄ«ja Å”o lapu, mÄs atkÄrtoti izvietojÄm konteineru. AktÄ«vu katalogs ir kļuvis tukÅ”s, un ir nepiecieÅ”ams pieprasÄ«jums PHP, lai sÄktu Ä£enerÄt jaunus. TomÄr pat pÄc tam saitÄm uz veco statiku nebÅ«s nozÄ«mes, kas radÄ«s kļūdas statikas attÄloÅ”anÄ.
TurklÄt mums, visticamÄk, ir vairÄk vai mazÄk ielÄdÄts projekts, kas nozÄ«mÄ, ka ar vienu aplikÄcijas eksemplÄru nepietiks:
PalielinÄsim to mÄrogu IzvietoÅ”anas lÄ«dz divÄm replikÄm.
Pirmoreiz piekļūstot vietnei, lÄ«dzekļi tika izveidoti vienÄ replikÄ.
KÄdÄ brÄ«dÄ« ingress nolÄma (slodzes lÄ«dzsvaroÅ”anas nolÅ«kos) nosÅ«tÄ«t pieprasÄ«jumu otrajai kopijai, un Å”ie lÄ«dzekļi tur vÄl nebija. Vai varbÅ«t to vairs nav, jo mÄs lietojam RollingUpdate un Å”obrÄ«d mÄs veicam izvietoÅ”anu.
KopumÄ rezultÄts atkal ir kļūdas.
Lai nezaudÄtu vecos lÄ«dzekļus, varat mainÄ«t emptyDir par hostPath, fiziski pievienojot klastera mezglam statisku. Å Ä« pieeja ir slikta, jo mums tas patiesÄ«bÄ ir jÄdara saistÄ«ties ar konkrÄtu klastera mezglu savu lietojumprogrammu, jo - pÄrejas uz citiem mezgliem gadÄ«jumÄ - direktorijÄ nebÅ«s nepiecieÅ”amie faili. Vai arÄ« ir nepiecieÅ”ama kÄda veida fona direktoriju sinhronizÄcija starp mezgliem.
KÄdi ir risinÄjumi?
Ja aparatÅ«ra un resursi atļauj, varat izmantot cephfs organizÄt vienlÄ«dz pieejamu direktoriju statiskÄm vajadzÄ«bÄm. OficiÄlÄ dokumentÄcija iesaka SSD diskus, vismaz trÄ«skÄrÅ”u replikÄciju un stabilu ābiezuā savienojumu starp klastera mezgliem.
MazÄk prasÄ«ga iespÄja bÅ«tu organizÄt NFS serveri. TomÄr tad jums ir jÄÅem vÄrÄ iespÄjamais atbildes laika palielinÄjums tÄ«mekļa servera pieprasÄ«jumu apstrÄdei, un kļūdu tolerance atstÄs daudz vÄlamo. Neveiksmes sekas ir katastrofÄlas: kalna zaudÄÅ”ana nolemj kopu lÄ«dz nÄvei zem debesÄ«s steidzÄ«gÄs LA slodzes spiediena.
Cita starpÄ bÅ«s nepiecieÅ”amas visas pastÄvÄ«gas krÄtuves izveides iespÄjas fona tÄ«rÄ«Å”ana novecojuÅ”as failu kopas, kas uzkrÄtas noteiktÄ laika periodÄ. PriekÅ”Ä konteinerus ar PHP var likt DaemonSet no keÅ”atmiÅas saglabÄÅ”anas nginx, kurÄ ierobežotu laiku tiks glabÄtas lÄ«dzekļu kopijas. Å o darbÄ«bu var viegli konfigurÄt, izmantojot proxy_cache ar uzglabÄÅ”anas dziļumu dienÄs vai gigabaitos diska vietas.
Å Ä«s metodes apvienoÅ”ana ar iepriekÅ” minÄtajÄm izplatÄ«tajÄm failu sistÄmÄm nodroÅ”ina milzÄ«gu iztÄles lauku, ko ierobežo tikai to cilvÄku budžets un tehniskais potenciÄls, kuri to ieviesÄ«s un atbalstÄ«s. No pieredzes mÄs varam teikt, ka jo vienkÄrÅ”Äka sistÄma, jo stabilÄk tÄ darbojas. Pievienojot Å”Ädus slÄÅus, kļūst daudz grÅ«tÄk uzturÄt infrastruktÅ«ru, un tajÄ paÅ”Ä laikÄ palielinÄs laiks, kas tiek patÄrÄts diagnosticÄÅ”anai un atveseļoÅ”anai pÄc jebkÄdÄm kļūmÄm.
Ieteikums
Ja arÄ« piedÄvÄto uzglabÄÅ”anas iespÄju ievieÅ”ana tev Ŕķiet nepamatota (sarežģīta, dÄrga...), tad ir vÄrts paskatÄ«ties uz situÄciju no citas puses. Proti, iedziļinÄties projekta arhitektÅ«rÄ un novÄrsiet problÄmu kodÄ, kas ir saistÄ«ts ar kÄdu statisku datu struktÅ«ru attÄlÄ, nepÄrprotama satura definÄ«cija vai procedÅ«ra āiesildÄ«Å”anaiā un/vai lÄ«dzekļu iepriekÅ”Äjai kompilÄÅ”anai attÄla montÄÅ”anas stadijÄ. TÄdÄ veidÄ mÄs iegÅ«stam absolÅ«ti paredzamu uzvedÄ«bu un vienÄdu failu kopu visÄm vidÄm un darbojoÅ”Äs lietojumprogrammas replikÄm.
Ja atgriežamies pie konkrÄtÄ piemÄra ar Yii ietvaru un neiedziļinÄmies tÄ struktÅ«rÄ (kas nav raksta mÄrÄ·is), pietiek norÄdÄ«t uz divÄm populÄrÄm pieejÄm:
Mainiet attÄla veidoÅ”anas procesu, lai lÄ«dzekļus novietotu paredzamÄ vietÄ. Tas ir ieteikts/ieviests tÄdos paplaÅ”inÄjumos kÄ yii2-static-assets.
DefinÄjiet Ä«paÅ”us lÄ«dzekļu direktoriju jaucÄjus, kÄ aprakstÄ«ts piem. Ŕī prezentÄcija (sÄkot no slaida Nr. 35). Starp citu, ziÅojuma autors galu galÄ (un ne bez iemesla!) iesaka pÄc lÄ«dzekļu salikÅ”anas bÅ«vÄÅ”anas serverÄ« augÅ”upielÄdÄt tos centrÄlajÄ krÄtuvÄ (piemÄram, S3), kuras priekÅ”Ä ievieto CDN.
LejupielÄdÄjami faili
VÄl viens gadÄ«jums, kas noteikti parÄdÄ«sies, migrÄjot lietojumprogrammu uz Kubernetes klasteru, ir lietotÄja failu glabÄÅ”ana failu sistÄmÄ. PiemÄram, mums atkal ir PHP lietojumprogramma, kas pieÅem failus, izmantojot augÅ”upielÄdes veidlapu, kaut ko veic ar tiem darbÄ«bas laikÄ un nosÅ«ta tos atpakaļ.
ProgrammÄ Kubernetes vietai, kur Å”ie faili jÄnovieto, jÄbÅ«t kopÄjai visÄm lietojumprogrammas replikÄm. AtkarÄ«bÄ no lietojumprogrammas sarežģītÄ«bas un nepiecieÅ”amÄ«bas organizÄt Å”o failu noturÄ«bu, iepriekÅ” minÄtÄs koplietotÄs ierÄ«ces opcijas var bÅ«t Å”Äda vieta, taÄu, kÄ redzam, tÄm ir savi trÅ«kumi.
Ieteikums
Viens risinÄjums ir izmantojot ar S3 saderÄ«gu krÄtuvi (pat ja tÄ ir sava veida paÅ”mitinÄta kategorija, piemÄram, minio). Lai pÄrslÄgtos uz S3, bÅ«s nepiecieÅ”amas izmaiÅas koda lÄ«menÄ«, un to, kÄ saturs tiks piegÄdÄts priekÅ”pusÄ, mÄs jau esam sapratuÅ”i ŠæŠøŃŠ°Š»Šø.
LietotÄju sesijas
AtseviŔķi ir vÄrts atzÄ«mÄt lietotÄju sesiju uzglabÄÅ”anas organizÄÅ”anu. Bieži vien tie ir arÄ« faili diskÄ, kas Kubernetes kontekstÄ novedÄ«s pie pastÄvÄ«giem autorizÄcijas pieprasÄ«jumiem no lietotÄja, ja viÅa pieprasÄ«jums nonÄk citÄ konteinerÄ.
ProblÄma daļÄji tiek atrisinÄta, ieslÄdzot stickySessions par iekļūŔanu (funkcija tiek atbalstÄ«ta visos populÄrajos ieejas kontrolleros ā sÄ«kÄku informÄciju skatiet mÅ«su pÄrskats)lai saistÄ«tu lietotÄju ar noteiktu aplikÄciju ar lietojumprogrammu:
Bet tas nenovÄrsÄ«s problÄmas ar atkÄrtotu izvietoÅ”anu.
Ieteikums
PareizÄks veids bÅ«tu pÄrsÅ«tÄ«t pieteikumu uz sesiju glabÄÅ”ana memcached, Redis un lÄ«dzÄ«gos risinÄjumos - kopumÄ pilnÄ«bÄ atsakieties no failu opcijÄm.
SecinÄjums
TekstÄ aplÅ«kotie infrastruktÅ«ras risinÄjumi ir izmantoÅ”anas vÄrti tikai pagaidu ākruÄ·uā formÄtÄ (kas angliski izklausÄs skaistÄk kÄ risinÄjums). Tie var bÅ«t svarÄ«gi lietojumprogrammas migrÄÅ”anas uz Kubernetes pirmajos posmos, taÄu tiem nevajadzÄtu iesakÅoties.
VispÄrÄjais ieteicamais ceļŔ ir atbrÄ«voties no tiem par labu lietojumprogrammas arhitektoniskÄm modifikÄcijÄm saskaÅÄ ar daudziem jau labi zinÄmo. 12 faktoru lietotne. TaÄu tas ā aplikÄcijas pÄrveÅ”ana uz bezvalstnieku formu ā neizbÄgami nozÄ«mÄ, ka bÅ«s nepiecieÅ”amas izmaiÅas kodÄ, un Å”eit ir svarÄ«gi atrast lÄ«dzsvaru starp biznesa iespÄjÄm/prasÄ«bÄm un izredzÄm ieviest un uzturÄt izvÄlÄto ceļu. .