Sveiki visiem! Mani sauc PÄvels Agaletskis. Es strÄdÄju kÄ komandas vadÄ«tÄjs komandÄ, kas izstrÄdÄ Lamoda piegÄdes sistÄmu. 2018. gadÄ es uzstÄjos HighLoad++ konferencÄ, un Å”odien vÄlos prezentÄt sava ziÅojuma atÅ”ifrÄjumu.
Mana tÄma ir veltÄ«ta mÅ«su uzÅÄmuma pieredzei sistÄmu un pakalpojumu izvietoÅ”anÄ dažÄdÄs vidÄs. SÄkot ar aizvÄsturiskiem laikiem, kad visas sistÄmas izvietojÄm parastos virtuÄlajos serveros, beidzot ar pakÄpenisku pÄreju no Nomad uz izvietoÅ”anu Kubernetes. Es jums pastÄstÄ«Å”u, kÄpÄc mÄs to darÄ«jÄm un kÄdas problÄmas mums radÄs Å”ajÄ procesÄ.
Lietojumprogrammu izvietoÅ”ana virtuÄlajÄ maŔīnÄ
SÄksim ar to, ka pirms 3 gadiem visas uzÅÄmuma sistÄmas un pakalpojumi tika izvietoti uz parastajiem virtuÄlajiem serveriem. Tehniski tas tika organizÄts tÄ, ka viss mÅ«su sistÄmu kods tika saglabÄts un salikts, izmantojot automÄtiskos montÄžas rÄ«kus, izmantojot jenkins. Izmantojot Ansible, tas tika ieviests no mÅ«su versiju kontroles sistÄmas virtuÄlajos serveros. TurklÄt katra sistÄma, kas bija mÅ«su uzÅÄmumam, tika izvietota vismaz 2 serveros: viens no tiem galvÄ, otrs uz astes. Å Ä«s divas sistÄmas bija absolÅ«ti identiskas viena otrai visos to iestatÄ«jumos, jaudas, konfigurÄcijas utt. VienÄ«gÄ atŔķirÄ«ba starp tÄm bija tÄ, ka galva saÅÄma lietotÄju trafiku, bet aste nekad nesaÅÄma lietotÄju trafiku.
KÄpÄc tas tika darÄ«ts?
Izvietojot jaunas lietojumprogrammas versijas, mÄs vÄlÄjÄmies nodroÅ”inÄt netraucÄtu izlaiÅ”anu, tas ir, bez manÄmÄm sekÄm lietotÄjiem. Tas tika panÄkts tÄpÄc, ka nÄkamais apkopotais laidiens, izmantojot Ansible, tika izrullÄts lÄ«dz galam. Tur cilvÄki, kas bija iesaistÄ«ti izvietoÅ”anÄ, varÄja pÄrbaudÄ«t un pÄrliecinÄties, ka viss ir kÄrtÄ«bÄ: visi rÄdÄ«tÄji, sadaļas un lietojumprogrammas darbojas; tiek palaisti nepiecieÅ”amie skripti. Tikai pÄc tam, kad viÅi bija pÄrliecinÄti, ka viss ir kÄrtÄ«bÄ, satiksme tika pÄrslÄgta. Tas sÄka iet uz serveri, kas iepriekÅ” bija aste. Un tas, kas iepriekÅ” bija galvenais, palika bez lietotÄju trafika, bet tajÄ joprojÄm bija mÅ«su lietojumprogrammas iepriekÅ”ÄjÄ versija.
TÄpÄc lietotÄjiem tas bija nevainojami. TÄ kÄ pÄrslÄgÅ”anÄs notiek acumirklÄ«, jo tÄ ir vienkÄrÅ”i balansiera pÄrslÄgÅ”ana. JÅ«s varat ļoti viegli atgriezties pie iepriekÅ”ÄjÄs versijas, vienkÄrÅ”i pÄrslÄdzot balansÄtÄju atpakaļ. MÄs varÄjÄm arÄ« pÄrbaudÄ«t, vai lietojumprogramma bija spÄjÄ«ga ražot pat pirms tÄ saÅÄma lietotÄju trafiku, kas bija diezgan Ärti.
KÄdas priekÅ”rocÄ«bas mÄs saskatÄ«jÄm Å”ajÄ visÄ?
- PirmkÄrt, pietiek tas vienkÄrÅ”i darbojas. Ikviens saprot, kÄ darbojas Å”Äda izvietoÅ”anas shÄma, jo lielÄkÄ daļa cilvÄku jebkad ir izvietojuÅ”ies uz parastajiem virtuÄlajiem serveriem.
- Ar to pietiek ticami, jo izvietoÅ”anas tehnoloÄ£ija ir vienkÄrÅ”a, to pÄrbaudÄ«juÅ”i tÅ«kstoÅ”iem uzÅÄmumu. Å ÄdÄ veidÄ tiek izvietoti miljoniem serveru. Ir grÅ«ti kaut ko salauzt.
- Un beidzot mÄs varÄjÄm saÅemties atomu izvietoÅ”ana. IzvietoÅ”ana, kas lietotÄjiem notiek vienlaicÄ«gi, bez pamanÄmas pÄrslÄgÅ”anÄs no vecÄs versijas uz jauno versiju.
Bet mÄs arÄ« redzÄjÄm vairÄkus trÅ«kumus Å”ajÄ visÄ:
- Papildus ražoÅ”anas videi, izstrÄdes videi ir arÄ« citas vides. PiemÄram, qa un preproduction. TajÄ laikÄ mums bija daudz serveru un aptuveni 60 pakalpojumu. Å Ä« iemesla dÄļ tas bija nepiecieÅ”ams katram pakalpojumam uzturiet tÄ jaunÄko versiju virtuÄlÄ iekÄrta. TurklÄt, ja vÄlaties atjauninÄt bibliotÄkas vai instalÄt jaunas atkarÄ«bas, tas jÄdara visÄs vidÄs. Jums bija arÄ« jÄsinhronizÄ laiks, kad plÄnojat izvietot nÄkamo jauno lietojumprogrammas versiju, ar laiku, kad devops veic nepiecieÅ”amos vides iestatÄ«jumus. Å ajÄ gadÄ«jumÄ ir viegli nonÄkt situÄcijÄ, kad mÅ«su vide bÅ«s kaut cik atŔķirÄ«ga visÄs vidÄs vienlaikus. PiemÄram, kvalitÄtes nodroÅ”inÄÅ”anas vidÄ bÅ«s dažas bibliotÄku versijas, bet ražoÅ”anas vidÄ - dažÄdas, kas radÄ«s problÄmas.
- GrÅ«tÄ«bas atjauninÄt atkarÄ«bas jÅ«su pieteikumu. Tas ir atkarÄ«gs nevis no tevis, bet no otras komandas. Proti, no devops komandas, kas apkalpo serverus. Jums ir jÄdod viÅiem atbilstoÅ”s uzdevums un apraksts par to, ko vÄlaties darÄ«t.
- Toreiz vÄlÄjÄmies arÄ« lielos lielos monolÄ«tus, kas mums bija, sadalÄ«t atseviŔķos mazos servisos, jo sapratÄm, ka tÄdu bÅ«s arvien vairÄk. TobrÄ«d mums jau bija vairÄk nekÄ 100. Katram jaunam pakalpojumam bija nepiecieÅ”ams izveidot atseviŔķu jaunu virtuÄlo maŔīnu, kas arÄ« bija jÄuztur un jÄizvieto. TurklÄt jums ir nepiecieÅ”ama nevis viena automaŔīna, bet vismaz divas. Tam visam pievienota kvalitÄtes nodroÅ”inÄÅ”anas vide. Tas rada problÄmas un apgrÅ«tina jaunu sistÄmu izveidi un darbinÄÅ”anu. sarežģīts, dÄrgs un ilgstoÅ”s process.
TÄpÄc mÄs nolÄmÄm, ka ÄrtÄk bÅ«tu pÄriet no parasto virtuÄlo maŔīnu izvietoÅ”anas uz mÅ«su lietojumprogrammu izvietoÅ”anu doka konteinerÄ. Ja jums ir doks, jums ir nepiecieÅ”ama sistÄma, kas var palaist lietojumprogrammu klasterÄ«, jo jÅ«s nevarat vienkÄrÅ”i pacelt konteineru. Parasti jÅ«s vÄlaties sekot lÄ«dzi, cik daudz konteineru tiek pacelti, lai tie paceltos automÄtiski. Å Ä« iemesla dÄļ mums bija jÄizvÄlas vadÄ«bas sistÄma.
Ilgi domÄjÄm, kuru varÄtu paÅemt. Fakts ir tÄds, ka tajÄ laikÄ Å”Ä« izvietoÅ”anas kaudze parastajos virtuÄlajos serveros bija nedaudz novecojusi, jo tiem nebija jaunÄko operÄtÄjsistÄmu versiju. KÄdÄ brÄ«dÄ« bija pat FreeBSD, kuru nebija Ä«paÅ”i Ärti atbalstÄ«t. MÄs sapratÄm, ka mums pÄc iespÄjas ÄtrÄk jÄpÄriet uz doku. MÅ«su izstrÄdÄtÄji aplÅ«koja savu esoÅ”o pieredzi ar dažÄdiem risinÄjumiem un izvÄlÄjÄs tÄdu sistÄmu kÄ Nomad.
PÄrslÄdzieties uz Nomad
Nomad ir HashiCorp produkts. Tie ir pazÄ«stami arÄ« ar citiem risinÄjumiem:
"Konsuls" ir pakalpojumu atklÄÅ”anas rÄ«ks.
"Teraforma" - serveru pÄrvaldÄ«bas sistÄma, kas ļauj tos konfigurÄt, izmantojot konfigurÄciju, tÄ saukto infrastruktÅ«ru kÄ kodu.
"Klaidonis" ļauj izvietot virtuÄlÄs maŔīnas lokÄli vai mÄkonÄ«, izmantojot Ä«paÅ”us konfigurÄcijas failus.
Nomad tolaik Ŕķita diezgan vienkÄrÅ”s risinÄjums, uz kuru varÄja Ätri pÄrslÄgties, nemainot visu infrastruktÅ«ru. TurklÄt to ir diezgan viegli iemÄcÄ«ties. TÄpÄc mÄs to izvÄlÄjÄmies kÄ mÅ«su konteinera filtrÄÅ”anas sistÄmu.
Kas jums nepiecieÅ”ams, lai izvietotu savu sistÄmu pakalpojumÄ Nomad?
- Vispirms jums ir nepiecieÅ”ams dokera attÄls jÅ«su pieteikumu. Jums tas ir jÄizveido un jÄievieto docker attÄlu krÄtuvÄ. MÅ«su gadÄ«jumÄ Å”Ä« ir artefaktÅ«ra - sistÄma, kas ļauj tajÄ iespiest dažÄdus dažÄda veida artefaktus. TajÄ var glabÄt arhÄ«vus, doku attÄlus, komponista PHP pakotnes, NPM pakotnes utt.
- VajadzÄ«gs arÄ« konfigurÄcijas fails, kas pateiks Nomad, ko, kur un kÄdÄ daudzumÄ vÄlaties izvietot.
Kad mÄs runÄjam par Nomad, tas izmanto HCL valodu kÄ informÄcijas faila formÄtu, kas apzÄ«mÄ HashiCorp konfigurÄcijas valoda. Å is ir Yaml superkops, kas ļauj aprakstÄ«t pakalpojumu nomadu valodÄ.
Tas ļauj norÄdÄ«t, cik konteineru vÄlaties izvietot, no kuriem attÄliem izvietoÅ”anas laikÄ tiem nodot dažÄdus parametrus. TÄdÄjÄdi jÅ«s ievadÄt Å”o failu uzÅÄmumam Nomad, un tas atbilstoÅ”i tam palaiž konteinerus ražoÅ”anÄ.
MÅ«su gadÄ«jumÄ sapratÄm, ka vienkÄrÅ”i katram servisam rakstÄ«t absolÅ«ti identiskus HCL failus nebÅ«tu Ä«paÅ”i Ärti, jo servisu ir ļoti daudz un dažkÄrt gribas tos atjauninÄt. GadÄs, ka viens pakalpojums tiek izvietots nevis vienÄ, bet dažÄdos dažÄdos gadÄ«jumos. PiemÄram, vienÄ no sistÄmÄm, kas tiek ražotas, ir vairÄk nekÄ 100 ražoÅ”anas gadÄ«jumu. Tie darbojas no tiem paÅ”iem attÄliem, taÄu atŔķiras pÄc konfigurÄcijas iestatÄ«jumiem un konfigurÄcijas failiem.
TÄpÄc mÄs nolÄmÄm, ka mums bÅ«tu Ärti visus mÅ«su konfigurÄcijas failus izvietoÅ”anai glabÄt vienÄ kopÄjÄ repozitorijÄ. TÄdÄ veidÄ tie bija redzami: tos bija viegli uzturÄt, un mÄs varÄjÄm redzÄt, kÄdas sistÄmas mums ir. Ja nepiecieÅ”ams, ir arÄ« viegli kaut ko atjauninÄt vai mainÄ«t. Jaunas sistÄmas pievienoÅ”ana arÄ« nav grÅ«ta - jums vienkÄrÅ”i jÄizveido konfigurÄcijas fails jaunajÄ direktorijÄ. TÄ iekÅ”pusÄ ir Å”Ädi faili: service.hcl, kurÄ ir mÅ«su pakalpojuma apraksts, un daži env faili, kas ļauj konfigurÄt tieÅ”i Å”o pakalpojumu, kas tiek izvietots ražoÅ”anÄ.
TomÄr dažas no mÅ«su sistÄmÄm ražoÅ”anÄ tiek izvietotas nevis vienÄ eksemplÄrÄ, bet vairÄkÄs vienlaikus. TÄpÄc nolÄmÄm, ka mums bÅ«tu Ärti glabÄt nevis konfigurÄcijas tÄ«rÄ veidÄ, bet gan veidnes formÄ. Un mÄs izvÄlÄjÄmies Džindža 2. Å ajÄ formÄtÄ mÄs glabÄjam gan paÅ”a pakalpojuma konfigurÄcijas, gan tam nepiecieÅ”amos env failus.
TurklÄt mÄs esam ievietojuÅ”i repozitorijÄ visiem projektiem kopÄ«gu izvietoÅ”anas skriptu, kas ļauj palaist un izvietot pakalpojumu ražoÅ”anÄ, vÄlamajÄ vidÄ, vÄlamajÄ mÄrÄ·Ä«. GadÄ«jumÄ, ja mÄs pÄrvÄrtÄm savu HCL konfigurÄciju par veidni, HCL fails, kas iepriekÅ” bija parasta Nomad konfigurÄcija, Å”ajÄ gadÄ«jumÄ sÄka izskatÄ«ties nedaudz savÄdÄk.
Tas nozÄ«mÄ, ka mÄs aizstÄjÄm dažus konfigurÄcijas atraÅ”anÄs vietas mainÄ«gos ar ievietotiem mainÄ«gajiem, kas ir Åemti no env failiem vai citiem avotiem. TurklÄt mÄs ieguvÄm iespÄju dinamiski vÄkt HCL failus, tas ir, mÄs varam izmantot ne tikai parastos mainÄ«go ievietoÅ”anu. TÄ kÄ jinja atbalsta cilpas un nosacÄ«jumus, tur varat arÄ« izveidot konfigurÄcijas failus, kas mainÄs atkarÄ«bÄ no tÄ, kur tieÅ”i izvietojat savas lietojumprogrammas.
PiemÄram, vÄlaties izvietot savu pakalpojumu pirmsražoÅ”anas un ražoÅ”anas režīmÄ. PieÅemsim, ka pirmsražoÅ”anas laikÄ jÅ«s nevÄlaties palaist cron skriptus, bet tikai vÄlaties redzÄt pakalpojumu atseviÅ”Ä·Ä domÄnÄ, lai pÄrliecinÄtos, ka tas darbojas. Ikvienam, kurÅ” izvieto pakalpojumu, process izskatÄs ļoti vienkÄrÅ”s un pÄrskatÄms. Viss, kas jums jÄdara, ir jÄizpilda fails deploy.sh, jÄnorÄda, kuru pakalpojumu vÄlaties izvietot un uz kuru mÄrÄ·i. PiemÄram, jÅ«s vÄlaties izvietot noteiktu sistÄmu KrievijÄ, BaltkrievijÄ vai KazahstÄnÄ. Lai to izdarÄ«tu, vienkÄrÅ”i mainiet vienu no parametriem, un jums bÅ«s pareizais konfigurÄcijas fails.
Kad pakalpojums Nomad jau ir izvietots jÅ«su klasterÄ«, tas izskatÄs Å”Ädi.
PirmkÄrt, jums ir nepiecieÅ”ams kaut kÄds balansÄtÄjs ÄrpusÄ, kas saÅems visu lietotÄju trafiku. Tas strÄdÄs kopÄ ar Consul un no tÄ noskaidros, kur, kÄdÄ mezglÄ, kÄdÄ IP adresÄ atrodas konkrÄts pakalpojums, kas atbilst konkrÄtam domÄna vÄrdam. Pakalpojumi Consul nÄk no paÅ”a Nomad. TÄ kÄ tie ir viena uzÅÄmuma produkti, tie ir diezgan saistÄ«ti viens ar otru. Var teikt, ka Nomad no kastes var reÄ£istrÄt visus tajÄ uzsÄktos pakalpojumus Consul iekÅ”ienÄ.
Kad jÅ«su priekÅ”gala slodzes lÄ«dzsvarotÄjs zina, uz kuru pakalpojumu nosÅ«tÄ«t trafiku, tas pÄrsÅ«ta to uz atbilstoÅ”o konteineru vai vairÄkiem konteineriem, kas atbilst jÅ«su lietojumprogrammai. Protams, ir jÄdomÄ arÄ« par droŔību. Lai gan visi pakalpojumi darbojas vienÄs un tajÄs paÅ”Äs virtuÄlajÄs maŔīnÄs konteineros, parasti tas prasa novÄrst brÄ«vu piekļuvi jebkuram pakalpojumam. MÄs to panÄcÄm, izmantojot segmentÄciju. Katrs pakalpojums tika palaists savÄ virtuÄlajÄ tÄ«klÄ, kurÄ tika noteikti marÅ”rutÄÅ”anas noteikumi un noteikumi piekļuves atļauÅ”anai/lieÅ”anai citÄm sistÄmÄm un pakalpojumiem. Tie varÄtu atrasties gan Ŕī klastera iekÅ”pusÄ, gan Ärpus tÄ. PiemÄram, ja vÄlaties neļaut pakalpojumam izveidot savienojumu ar noteiktu datu bÄzi, to var izdarÄ«t, izmantojot tÄ«kla lÄ«meÅa segmentÄciju. Tas nozÄ«mÄ, ka pat kļūdas dÄļ jÅ«s nevarat nejauÅ”i izveidot savienojumu no testa vides ar ražoÅ”anas datu bÄzi.
Cik mums izmaksÄja pÄreja cilvÄkresursu ziÅÄ?
Visa uzÅÄmuma pÄreja uz Nomad aizÅÄma aptuveni 5-6 mÄneÅ”us. MÄs pÄrcÄlÄmies uz katru pakalpojumu atseviŔķi, taÄu diezgan ÄtrÄ tempÄ. Katrai komandai bija jÄizveido savi konteineri pakalpojumiem.
MÄs esam pieÅÄmuÅ”i tÄdu pieeju, ka katra komanda ir neatkarÄ«gi atbildÄ«ga par savu sistÄmu docker attÄliem. DevOps nodroÅ”ina izvietoÅ”anai nepiecieÅ”amo vispÄrÄjo infrastruktÅ«ru, tas ir, atbalstu paÅ”am klasterim, atbalstu CI sistÄmai un tÄ tÄlÄk. Un tajÄ laikÄ mums uz Nomad tika pÄrvietotas vairÄk nekÄ 60 sistÄmas, kas sastÄdÄ«ja aptuveni 2 tÅ«kstoÅ”us konteineru.
Devops ir atbildÄ«gs par vispÄrÄjo infrastruktÅ«ru visam, kas saistÄ«ts ar izvietoÅ”anu un serveriem. Un katra izstrÄdes komanda savukÄrt ir atbildÄ«ga par konteineru ievieÅ”anu savai konkrÄtajai sistÄmai, jo tÄ ir komanda, kas zina, kas tai kopumÄ ir nepiecieÅ”ams konkrÄtajÄ konteinerÄ.
Nomad pameŔanas iemesli
KÄdas priekÅ”rocÄ«bas mÄs ieguvÄm, cita starpÄ pÄrejot uz izvietoÅ”anu, izmantojot Nomad un Docker?
- MÄs nodroÅ”inÄti vienÄdi apstÄkļi visÄm vidÄm. IzstrÄdÄ, kvalitÄtes nodroÅ”inÄÅ”anas vidÄ, pirmsražoÅ”anÄ, ražoÅ”anÄ tiek izmantoti tie paÅ”i konteinera attÄli ar vienÄdÄm atkarÄ«bÄm. AttiecÄ«gi jums praktiski nav iespÄju, ka tas, kas nonÄks ražoÅ”anÄ, nav tas, ko iepriekÅ” pÄrbaudÄ«jÄt lokÄli vai savÄ testa vidÄ.
- MÄs arÄ« atklÄjÄm, ka ar to pietiek viegli pievienot jaunu pakalpojumu. No izvietoÅ”anas viedokļa jebkuras jaunas sistÄmas tiek palaistas ļoti vienkÄrÅ”i. VienkÄrÅ”i dodieties uz repozitoriju, kurÄ tiek glabÄtas konfigurÄcijas, pievienojiet tur citu sistÄmas konfigurÄciju, un viss ir gatavs. JÅ«s varat izvietot savu sistÄmu ražoÅ”anÄ bez jebkÄdÄm devops papildu pÅ«lÄm.
- Viss konfigurÄcijas faili vienÄ kopÄjÄ repozitorijÄ izrÄdÄ«jÄs, ka tas tiek pÄrskatÄ«ts. LaikÄ, kad mÄs izvietojÄm sistÄmas, izmantojot virtuÄlos serverus, mÄs izmantojÄm Ansible, kurÄ konfigurÄcijas atradÄs tajÄ paÅ”Ä repozitorijÄ. TomÄr lielÄkajai daļai izstrÄdÄtÄju tas bija nedaudz grÅ«tÄk strÄdÄt. Å eit konfigurÄciju un koda apjoms, kas jÄpievieno pakalpojuma izvietoÅ”anai, ir kļuvis daudz mazÄks. TurklÄt devops to ir ļoti viegli salabot vai mainÄ«t. Ja notiek pÄreja, piemÄram, uz jaunu Nomad versiju, viÅi var veikt un lielapjoma atjauninÄt visus darbÄ«bas failus, kas atrodas tajÄ paÅ”Ä vietÄ.
TaÄu mÄs saskÄrÄmies arÄ« ar vairÄkiem trÅ«kumiem:
IzrÄdÄ«jÄs, ka mÄs nevarÄja panÄkt nevainojamu izvietoÅ”anu Nomad gadÄ«jumÄ. Izlaižot konteinerus dažÄdos apstÄkļos, tas varÄja izrÄdÄ«ties darbinÄms, un Nomad to uztvÄra kÄ konteineru, kas ir gatavs uztvert trafiku. Tas notika, pirms tajÄ esoÅ”ajai lietojumprogrammai pat bija iespÄja palaist. Å Ä« iemesla dÄļ sistÄma uz Ä«su laiku sÄka ražot 500 kļūdas, jo satiksme sÄka virzÄ«ties uz konteineru, kas vÄl nebija gatavs to pieÅemt.
MÄs sastapÄmies ar dažiem pie purviem. BÅ«tiskÄkÄ kļūda ir tÄ, ka Nomad ne pÄrÄk labi apstrÄdÄ lielu kopu, ja jums ir daudz sistÄmu un konteineru. Ja vÄlaties izÅemt kÄdu no serveriem, kas ir iekļauts Nomad klasterÄ« apkopei, pastÄv diezgan liela varbÅ«tÄ«ba, ka klasteris nejutÄ«sies Ä«paÅ”i labi un izjuks. Daži konteineri, piemÄram, var nokrist un nepacelties ā tas jums izmaksÄs ļoti daudz vÄlÄk, ja visas jÅ«su ražoÅ”anas sistÄmas atrodas klasterÄ«, kuru pÄrvalda Nomad.
TÄpÄc nolÄmÄm padomÄt, kurp doties tÄlÄk. TajÄ brÄ«dÄ« mÄs daudz vairÄk apzinÄjÄmies, ko vÄlamies sasniegt. Proti: mÄs vÄlamies uzticamÄ«bu, nedaudz vairÄk funkciju, nekÄ nodroÅ”ina Nomad, un nobrieduÅ”Äku, stabilÄku sistÄmu.
Å ajÄ sakarÄ mÅ«su izvÄle krita uz Kubernetes kÄ vispopulÄrÄko klasteru palaiÅ”anas platformu. ÄŖpaÅ”i Åemot vÄrÄ, ka mÅ«su konteineru izmÄrs un skaits bija pietiekami liels. Å Ädiem nolÅ«kiem Kubernetes Ŕķita vispiemÄrotÄkÄ sistÄma, ko mÄs varÄtu apskatÄ«t.
PÄreja uz Kubernetes
Es jums nedaudz pastÄstÄ«Å”u par Kubernetes pamatjÄdzieniem un to, kÄ tie atŔķiras no Nomad.
PirmkÄrt, Kubernetes visvienkÄrÅ”ÄkÄ koncepcija ir pod jÄdziens. PÄksts ir viena vai vairÄku konteineru grupa, kas vienmÄr darbojas kopÄ. Un tie vienmÄr darbojas tÄ, it kÄ tie bÅ«tu stingri vienÄ virtuÄlajÄ maŔīnÄ. Tie ir pieejami viens otram, izmantojot IP 127.0.0.1 dažÄdos portos.
PieÅemsim, ka jums ir PHP lietojumprogramma, kas sastÄv no nginx un php-fpm - klasiskÄs shÄmas. VisticamÄk, jÅ«s vienmÄr vÄlaties turÄt kopÄ gan nginx, gan php-fpm konteinerus. Kubernetes ļauj to sasniegt, aprakstot tos kÄ vienu kopÄ«gu podiÅu. Tas ir tieÅ”i tas, ko mÄs nevarÄjÄm iegÅ«t ar Nomad.
Otrais jÄdziens ir izvietoÅ”ana. Fakts ir tÄds, ka pati pÄksts ir Ä«slaicÄ«ga lieta, tÄ sÄkas un pazÅ«d. Vai vispirms vÄlaties iznÄ«cinÄt visus savus iepriekÅ”Äjos konteinerus un pÄc tam uzreiz palaist jaunas versijas vai arÄ« vÄlaties tos izlaist pakÄpeniski? Par Å”o procesu ir atbildÄ«ga izvietoÅ”anas koncepcija. TajÄ ir aprakstÄ«ts, kÄ izvietojat savus aplikumus, kÄdÄ daudzumÄ un kÄ tos atjauninÄt.
TreÅ”ais jÄdziens ir apkalpoÅ”ana. JÅ«su pakalpojums patiesÄ«bÄ ir jÅ«su sistÄma, kas saÅem daļu trafika un pÄc tam pÄrsÅ«ta to uz vienu vai vairÄkiem jÅ«su pakalpojumam atbilstoÅ”iem podiem. Tas ir, tas ļauj teikt, ka visa ienÄkoÅ”Ä trafika uz Å”Ädu un tÄdu pakalpojumu ar tÄdu un tÄdu nosaukumu ir jÄnosÅ«ta uz Å”iem konkrÄtajiem podiem. Un tajÄ paÅ”Ä laikÄ tas nodroÅ”ina satiksmes lÄ«dzsvaroÅ”anu. Tas nozÄ«mÄ, ka varat palaist divus savas lietojumprogrammas apgabalus, un visa ienÄkoÅ”Ä trafika tiks vienmÄrÄ«gi lÄ«dzsvarota starp ar Å”o pakalpojumu saistÄ«tajiem podiem.
Un ceturtais pamatjÄdziens ir IekļūŔana. Å is ir pakalpojums, kas darbojas Kubernetes klasterÄ«. Tas darbojas kÄ ÄrÄjs slodzes balansÄtÄjs, kas pÄrÅem visus pieprasÄ«jumus. Izmantojot Kubernetes API, Ingress var noteikt, kur Å”ie pieprasÄ«jumi jÄnosÅ«ta. TurklÄt viÅÅ” to dara ļoti elastÄ«gi. Var teikt, ka visi pieprasÄ«jumi Å”im resursdatoram un tÄdiem un tÄdiem URL tiek nosÅ«tÄ«ti Å”im pakalpojumam. Un Å”ie pieprasÄ«jumi, kas tiek saÅemti uz Å”o resursdatoru un citu URL, tiek nosÅ«tÄ«ti citam pakalpojumam.
Pats forÅ”Äkais no lietojumprogrammas izstrÄdÄtÄja viedokļa ir tas, ka tu pats spÄj to visu pÄrvaldÄ«t. Iestatot Ingress config, visu trafiku, kas nÄk uz tÄdu un tÄdu API, var nosÅ«tÄ«t uz atseviŔķiem konteineriem, kas rakstÄ«ti, piemÄram, Go. Bet Ŕī trafika, kas nÄk uz to paÅ”u domÄnu, bet uz citu URL, ir jÄsÅ«ta uz PHP rakstÄ«tiem konteineriem, kur ir daudz loÄ£ikas, bet tie nav Ä«paÅ”i Ätri.
Ja salÄ«dzinÄm visus Å”os jÄdzienus ar Nomad, mÄs varam teikt, ka pirmie trÄ«s jÄdzieni visi kopÄ ir Pakalpojums. Un paÅ”Ä NomadÄ pÄdÄjÄ jÄdziena nav. MÄs izmantojÄm ÄrÄjo balansÄtÄju: tas varÄtu bÅ«t haproxy, nginx, nginx+ un tÄ tÄlÄk. Kuba gadÄ«jumÄ Å”is papildu jÄdziens nav jÄievieÅ” atseviŔķi. TomÄr, ja paskatÄs uz Ingress iekÅ”Äji, tas ir vai nu nginx, haproxy vai traefik, bet kaut kÄ iebÅ«vÄts Kubernetes.
Visi manis aprakstÄ«tie jÄdzieni faktiski ir resursi, kas pastÄv Kubernetes klasterÄ«. Lai tos aprakstÄ«tu kubÄ, tiek izmantots yaml formÄts, kas Nomad gadÄ«jumÄ ir lasÄmÄks un pazÄ«stamÄks nekÄ HCL faili. Bet strukturÄli tie apraksta to paÅ”u, piemÄram, pÄksts gadÄ«jumÄ. Saka - es gribu tur izvietot tÄdas un tÄdas pÄkstis, ar tÄdiem un tÄdiem attÄliem, tÄdÄ un tÄdÄ daudzumÄ.
TurklÄt mÄs sapratÄm, ka nevÄlamies katru atseviŔķu resursu izveidot ar rokÄm: izvietoÅ”anu, pakalpojumus, Ingress utt. TÄ vietÄ mÄs vÄlÄjÄmies izvietoÅ”anas laikÄ aprakstÄ«t katru mÅ«su sistÄmu Kubernetes izteiksmÄ, lai mums nebÅ«tu manuÄli jÄpÄrveido visas nepiecieÅ”amÄs resursu atkarÄ«bas pareizajÄ secÄ«bÄ. Helma tika izvÄlÄta kÄ sistÄma, kas ļÄva mums to izdarÄ«t.
Helmas pamatjÄdzieni
StÅ«re ir pakotÅu pÄrvaldnieks par Kubernetes. Tas ir ļoti lÄ«dzÄ«gs tam, kÄ darbojas pakeÅ”u pÄrvaldnieki programmÄÅ”anas valodÄs. Tie ļauj saglabÄt pakalpojumu, kas sastÄv, piemÄram, no izvietoÅ”anas nginx, izvietoÅ”anas php-fpm, Config for Ingress, configmaps (Ŕī ir entÄ«tija, kas ļauj iestatÄ«t env un citus parametrus jÅ«su sistÄmai) kÄ sauc par diagrammÄm. TajÄ paÅ”Ä laikÄ Helms skrien virsÅ« Kubernetes. Tas ir, Ŕī nav kÄda veida sistÄma, kas stÄv malÄ, bet tikai vÄl viens pakalpojums, kas tiek palaists kuba iekÅ”pusÄ. JÅ«s mijiedarbojaties ar to, izmantojot tÄ API, izmantojot konsoles komandu. TÄs ÄrtÄ«bas un skaistums ir tÄds, ka pat tad, ja stÅ«re salÅ«zt vai jÅ«s to izÅemat no klastera, jÅ«su pakalpojumi nepazudÄ«s, jo stÅ«re bÅ«tÄ«bÄ kalpo tikai sistÄmas palaiÅ”anai. PÄc tam Kubernetes pati ir atbildÄ«ga par pakalpojumu veiktspÄju un stÄvokli.
MÄs arÄ« to sapratÄm veidÅu veidoÅ”ana, ko iepriekÅ” bijÄm spiesti darÄ«t paÅ”i, savÄs konfigurÄcijÄs ievieÅ”ot džindzju, ir viena no galvenajÄm helm iezÄ«mÄm. Visas konfigurÄcijas, ko izveidojat savÄm sistÄmÄm, tiek glabÄtas helm veidÅu veidÄ, kas ir nedaudz lÄ«dzÄ«gas jinja, bet patiesÄ«bÄ tiek izmantotas Go valodas veidnes, kurÄ ir rakstÄ«ts helm, piemÄram, Kubernetes.
Helma mums pievieno vÄl dažus jÄdzienus.
Diagramma - Å”is ir jÅ«su pakalpojuma apraksts. Citos pakotÅu pÄrvaldniekos to sauktu par pakotni, komplektu vai kaut ko lÄ«dzÄ«gu. Å eit to sauc par diagrammu.
VÄrtÄ«bas ir mainÄ«gie, kurus vÄlaties izmantot, lai izveidotu konfigurÄcijas no veidnÄm.
Atlaidiet. Katru reizi, kad pakalpojums, kas tiek izvietots, izmantojot stÅ«ri, saÅem pakÄpenisku laidiena versiju. Helms atceras, kÄda bija pakalpojuma konfigurÄcija iepriekÅ”ÄjÄ laidienÄ, laidienÄ pirms tam utt. TÄpÄc, ja jums ir jÄatgriež, vienkÄrÅ”i palaidiet stÅ«res atzvanÄ«Å”anas komandu, norÄdot to uz iepriekÅ”Äjo laidiena versiju. Pat ja atbilstoÅ”Ä konfigurÄcija jÅ«su repozitorijÄ nav pieejama atcelÅ”anas laikÄ, Helm joprojÄm atcerÄsies, kas tÄ bija, un atgriezÄ«s jÅ«su sistÄmu tÄdÄ stÄvoklÄ«, kÄdÄ tÄ bija iepriekÅ”ÄjÄ laidienÄ.
GadÄ«jumÄ, ja mÄs izmantojam helm, arÄ« parastÄs Kubernetes konfigurÄcijas pÄrvÄrÅ”as par veidnÄm, kurÄs ir iespÄjams izmantot mainÄ«gos, funkcijas un lietot nosacÄ«jumu paziÅojumus. TÄdÄ veidÄ varat apkopot pakalpojuma konfigurÄciju atkarÄ«bÄ no vides.
PraksÄ mÄs nolÄmÄm darÄ«t lietas nedaudz savÄdÄk nekÄ ar Nomad. Ja pakalpojumÄ Nomad gan izvietoÅ”anas konfigurÄcijas, gan n-mainÄ«gie, kas bija nepiecieÅ”ami mÅ«su pakalpojuma izvietoÅ”anai, tika glabÄti vienÄ repozitorijÄ, Å”eit mÄs nolÄmÄm tos sadalÄ«t divÄs atseviŔķÄs krÄtuvÄs. āIzvietoÅ”anasā repozitorijÄ tiek glabÄti tikai izvietoÅ”anai nepiecieÅ”amie n-mainÄ«gie, un āstÅ«resā repozitorijÄ tiek saglabÄtas konfigurÄcijas vai diagrammas.
Ko tas mums deva?
Neskatoties uz to, ka paÅ”os konfigurÄcijas failos mÄs neuzglabÄjam nekÄdus patieÅ”Äm sensitÄ«vus datus. PiemÄram, paroles datu bÄzÄm. Tie tiek glabÄti kÄ noslÄpumi Kubernetes, taÄu, neskatoties uz to, tur joprojÄm ir dažas lietas, kurÄm mÄs nevÄlamies visiem sniegt piekļuvi. TÄpÄc piekļuve āizvietoÅ”anasā repozitorijai ir ierobežotÄka, un āstÅ«resā repozitorijÄ ir vienkÄrÅ”i pakalpojuma apraksts. Å Ä« iemesla dÄļ tai var droÅ”i piekļūt plaÅ”Äks cilvÄku loks.
TÄ kÄ mums ir ne tikai ražoÅ”anas, bet arÄ« citas vides, pateicoties Å”ai atdalÄ«Å”anai, mÄs varam atkÄrtoti izmantot mÅ«su stÅ«res diagrammas, lai izvietotu pakalpojumus ne tikai ražoÅ”anÄ, bet arÄ«, piemÄram, kvalitÄtes nodroÅ”inÄÅ”anas vidÄ. Pat lai tos izvietotu lokÄli, izmantojot Minikube - Ŕī lieta ir paredzÄta Kubernetes lokÄlai darbÄ«bai.
KatrÄ repozitorijÄ mÄs atstÄjÄm sadalÄ«jumu atseviŔķos direktorijos katram pakalpojumam. Tas nozÄ«mÄ, ka katrÄ direktorijÄ ir veidnes, kas saistÄ«tas ar atbilstoÅ”o diagrammu un apraksta resursus, kas jÄizvieto, lai palaistu mÅ«su sistÄmu. MÄs atstÄjÄm tikai envs āizvietoÅ”anasā repozitorijÄ. Å ajÄ gadÄ«jumÄ mÄs neizmantojÄm veidÅu veidoÅ”anu, izmantojot jinja, jo pati helm nodroÅ”ina Å”ablonu veidoÅ”anu no kastes - tÄ ir viena no tÄs galvenajÄm funkcijÄm.
MÄs atstÄjÄm izvietoÅ”anas skriptu - deploy.sh, kas vienkÄrÅ”o un standartizÄ palaiÅ”anu izvietoÅ”anai, izmantojot stÅ«ri. TÄtad ikvienam, kurÅ” vÄlas izvietot, izvietoÅ”anas saskarne izskatÄs tieÅ”i tÄda pati kÄ, izvietojot, izmantojot Nomad. Tas pats deploy.sh, jÅ«su pakalpojuma nosaukums un vieta, kur vÄlaties to izvietot. Tas izraisa stÅ«res iedarbinÄÅ”anu iekÅ”Äji. Tas, savukÄrt, savÄc konfigurÄcijas no veidnÄm, ievieto tajÄs nepiecieÅ”amos vÄrtÄ«bu failus, pÄc tam izvieto tos, palaižot tos Kubernetes.
Atzinumi
Å Ä·iet, ka Kubernetes pakalpojums ir sarežģītÄks nekÄ Nomad.
Å eit izejoÅ”Ä satiksme nonÄk uz Ingress. Tas ir tikai priekÅ”Äjais kontrolieris, kas pÄrÅem visus pieprasÄ«jumus un pÄc tam nosÅ«ta tos pakalpojumiem, kas atbilst pieprasÄ«juma datiem. Tas nosaka tos, pamatojoties uz konfigurÄcijÄm, kas ir daļa no jÅ«su vadÄ«bas lietojumprogrammas apraksta un kuras izstrÄdÄtÄji iestata paÅ”i. Pakalpojums nosÅ«ta pieprasÄ«jumus saviem podiem, tas ir, konkrÄtiem konteineriem, lÄ«dzsvarojot ienÄkoÅ”o trafiku starp visiem konteineriem, kas pieder Å”im pakalpojumam. Un, protams, mÄs nedrÄ«kstam aizmirst, ka mums nevajadzÄtu aiziet no droŔības tÄ«kla lÄ«menÄ«. TÄpÄc segmentÄcija darbojas Kubernetes klasterÄ«, kura pamatÄ ir marÄ·ÄÅ”ana. Visiem pakalpojumiem ir noteikti tagi, ar kuriem ir saistÄ«tas pakalpojumu piekļuves tiesÄ«bas noteiktiem ÄrÄjiem/iekÅ”Äjiem resursiem klasterÄ« vai Ärpus tÄ.
Veicot pÄreju, mÄs redzÄjÄm, ka Kubernetes piedÄvÄ visas iepriekÅ” izmantotÄs Nomad iespÄjas, kÄ arÄ« pievienojÄm daudz jaunu lietu. To var paplaÅ”inÄt, izmantojot spraudÅus un faktiski izmantojot pielÄgotus resursu veidus. Tas nozÄ«mÄ, ka jums ir iespÄja ne tikai izmantot kaut ko, kas ir iekļauts Kubernetes komplektÄcijÄ, bet arÄ« izveidot savu resursu un pakalpojumu, kas nolasÄ«s jÅ«su resursu. Tas sniedz papildu iespÄjas sistÄmas paplaÅ”inÄÅ”anai, nepÄrinstalÄjot Kubernetes un neprasot veikt izmaiÅas.
Å Ädas izmantoÅ”anas piemÄrs ir Prometheus, kas darbojas mÅ«su Kubernetes klasterÄ«. Lai tas sÄktu apkopot metriku no konkrÄta pakalpojuma, pakalpojuma aprakstam ir jÄpievieno papildu resursa veids, tÄ sauktais pakalpojumu monitors. TÄ kÄ Prometheus var nolasÄ«t pielÄgotu resursa veidu, kad tas tiek palaists Kubernetes, automÄtiski sÄk vÄkt metriku no jaunÄs sistÄmas. Tas ir diezgan Ärti.
PirmÄ izvietoÅ”ana Kubernetes tika veikta 2018. gada martÄ. Un Å”ajÄ laikÄ mÄs nekad ar to nesaskÄrÄmies ar problÄmÄm. Tas darbojas diezgan stabili, bez bÅ«tiskÄm kļūdÄm. TurklÄt mÄs varam to paplaÅ”inÄt vÄl vairÄk. Å odien mums ir pietiekami daudz iespÄju, kas tai ir, un mums ļoti patÄ«k Kubernetes attÄ«stÄ«bas tempi. Å obrÄ«d Kubernetes atrodas vairÄk nekÄ 3000 konteineru. Klasteris aizÅem vairÄkus mezglus. TajÄ paÅ”Ä laikÄ tas ir apkalpojams, stabils un ļoti vadÄms.
Avots: www.habr.com