Konteineru attÄlu "gudrÄs" tÄ«rÄ«Å”anas problÄma un tÄs risinÄjums werf
RakstÄ ir apskatÄ«tas konteineru reÄ£istros (Docker Registry un tÄ analogos) uzkrÄjuÅ”os attÄlu tÄ«rÄ«Å”anas problÄmas mÅ«sdienu CI/CD konveijeru realitÄtÄ mÄkoÅdatoÅ”anas lietojumprogrammÄm, kas tiek piegÄdÄtas Kubernetes. Tiek doti galvenie kritÄriji attÄlu atbilstÄ«bai un no tÄ izrietoÅ”ajÄm grÅ«tÄ«bÄm tÄ«rÄ«Å”anas automatizÄcijÄ, vietas taupÄ«Å”anÄ un komandu vajadzÄ«bu apmierinÄÅ”anÄ. Visbeidzot, izmantojot konkrÄta atvÄrtÄ koda projekta piemÄru, mÄs jums pastÄstÄ«sim, kÄ Å”Ä«s grÅ«tÄ«bas var pÄrvarÄt.
Ievads
AttÄlu skaits konteineru reÄ£istrÄ var strauji pieaugt, aizÅemot vairÄk vietas krÄtuvÄ un tÄdÄjÄdi ievÄrojami palielinot tÄ izmaksas. Lai kontrolÄtu, ierobežotu vai uzturÄtu pieÅemamu reÄ£istrÄ aizÅemtÄs vietas pieaugumu, tiek pieÅemts:
izmantot fiksÄtu skaitu tagu attÄliem;
kaut kÄdÄ veidÄ notÄ«riet attÄlus.
Pirmais ierobežojums dažkÄrt ir pieÅemams mazÄm komandÄm. Ja izstrÄdÄtÄjiem ir pietiekami daudz pastÄvÄ«go atzÄ«mju (latest, main, test, boris utt.), reÄ£istrs nepalielinÄsies un ilgu laiku jums vispÄr nebÅ«s jÄdomÄ par tÄ tÄ«rÄ«Å”anu. Galu galÄ visi neatbilstoÅ”ie attÄli tiek izdzÄsti, un tÄ«rÄ«Å”anai vienkÄrÅ”i neatliek darba (visu dara parasts atkritumu savÄcÄjs).
TomÄr Ŕī pieeja ievÄrojami ierobežo attÄ«stÄ«bu un reti ir piemÄrojama mÅ«sdienu CI/CD projektiem. NeatÅemama attÄ«stÄ«bas sastÄvdaļa bija automatizÄcija, kas ļauj daudz ÄtrÄk pÄrbaudÄ«t, izvietot un piegÄdÄt lietotÄjiem jaunas funkcionalitÄtes. PiemÄram, visos mÅ«su projektos CI konveijers tiek automÄtiski izveidots ar katru apÅemÅ”anos. TajÄ attÄls tiek samontÄts, testÄts, izrullÄts dažÄdÄs Kubernetes shÄmÄs atkļūdoÅ”anai un atlikuÅ”ajÄm pÄrbaudÄm, un, ja viss ir kÄrtÄ«bÄ, izmaiÅas nonÄk lÄ«dz gala lietotÄjam. Un tÄ vairs nav raÄ·eÅ”u zinÄtne, bet gan ikdiena daudziem ā visticamÄk, jums, jo lasÄt Å”o rakstu.
TÄ kÄ kļūdu laboÅ”ana un jaunas funkcionalitÄtes izstrÄde tiek veikta paralÄli un izlaidumus var veikt vairÄkas reizes dienÄ, ir acÄ«mredzams, ka izstrÄdes procesu pavada ievÄrojams skaits commit, kas nozÄ«mÄ liels skaits attÄlu reÄ£istrÄ. RezultÄtÄ rodas jautÄjums par efektÄ«vas reÄ£istra tÄ«rÄ«Å”anas organizÄÅ”anu, t.i. neatbilstoÅ”u attÄlu noÅemÅ”ana.
Bet kÄ vispÄr noteikt, vai attÄls ir atbilstoÅ”s?
AttÄla atbilstÄ«bas kritÄriji
LielÄkajÄ daÄ¼Ä gadÄ«jumu galvenie kritÄriji bÅ«s:
1. Pirmais (visredzamÄkais un kritiskÄkais no visiem) ir attÄli, kas paÅ”laik izmanto Kubernetes. Å o attÄlu noÅemÅ”ana var radÄ«t ievÄrojamas ražoÅ”anas dÄ«kstÄves izmaksas (piemÄram, attÄli var bÅ«t nepiecieÅ”ami replikÄcijai) vai liegt komandai veikt atkļūdoÅ”anu jebkurÄ no cilpÄm. (Å Ä« iemesla dÄļ mÄs pat izveidojÄm Ä«paÅ”u Prometheus eksportÄtÄji, kas izseko Å”Ädu attÄlu neesamÄ«bu nevienÄ Kubernetes klasterÄ«.)
2. Otrais (mazÄk acÄ«mredzams, bet arÄ« ļoti svarÄ«gs un atkal saistÄ«ts ar ekspluatÄciju) - attÄli, kas nepiecieÅ”ama atcelÅ”anai nopietnu problÄmu atklÄÅ”anas gadÄ«jumÄ paÅ”reizÄjÄ versijÄ. PiemÄram, Helm gadÄ«jumÄ tie ir attÄli, kas tiek izmantoti saglabÄtajÄs laidiena versijÄs. (Starp citu, HelmÄ pÄc noklusÄjuma ierobežojums ir 256 pÄrskati, taÄu maz ticams, ka kÄdam patieÅ”Äm bÅ«s jÄsaglabÄ tÄds liels skaits versiju?..) Galu galÄ mÄs, jo Ä«paÅ”i, glabÄjam versijas, lai mÄs tÄs varÄtu izmantot vÄlÄk, t.i. āatgriezietiesā pie viÅiem, ja nepiecieÅ”ams.
3. TreÅ”ais ā izstrÄdÄtÄju vajadzÄ«bÄm: visi attÄli, kas ir saistÄ«ti ar viÅu paÅ”reizÄjo darbu. PiemÄram, ja mÄs apsveram PR, tad ir jÄga atstÄt attÄlu, kas atbilst pÄdÄjai un, teiksim, iepriekÅ”Äjai apÅemÅ”anai: tÄdÄ veidÄ izstrÄdÄtÄjs var Ätri atgriezties pie jebkura uzdevuma un strÄdÄt ar jaunÄkajÄm izmaiÅÄm.
4. CeturtkÄrt - attÄli, kas atbilst mÅ«su lietojumprogrammas versijÄm, t.i. ir gala produkts: v1.0.0, 20.04.01/XNUMX/XNUMX, sierra utt.
NB: Å eit definÄtie kritÄriji tika formulÄti, pamatojoties uz pieredzi, sadarbojoties ar desmitiem izstrÄdes komandu no dažÄdiem uzÅÄmumiem. TaÄu, protams, atkarÄ«bÄ no specifikas izstrÄdes procesos un izmantotÄs infrastruktÅ«ras (piemÄram, netiek izmantota Kubernetes), Å”ie kritÄriji var atŔķirties.
AtbilstÄ«ba un esoÅ”ie risinÄjumi
PopulÄrie pakalpojumi ar konteineru reÄ£istriem, kÄ likums, piedÄvÄ savas attÄlu tÄ«rÄ«Å”anas politikas: tajÄs varat definÄt nosacÄ«jumus, kÄdos atzÄ«me tiek noÅemta no reÄ£istra. TomÄr Å”os nosacÄ«jumus ierobežo tÄdi parametri kÄ nosaukumi, izveides laiks un tagu skaits*.
Å is parametru kopums ir pilnÄ«gi pietiekams, lai izpildÄ«tu ceturto kritÄriju - tas ir, lai atlasÄ«tu versijÄm atbilstoÅ”us attÄlus. TaÄu visiem pÄrÄjiem kritÄrijiem ir jÄizvÄlas kÄds kompromisa risinÄjums (stingrÄka vai, tieÅ”i otrÄdi, pielaidÄ«gÄka politika) ā atkarÄ«bÄ no cerÄ«bÄm un finansiÄlajÄm iespÄjÄm.
PiemÄram, treÅ”o ā ar izstrÄdÄtÄju vajadzÄ«bÄm saistÄ«to ā kritÄriju var atrisinÄt, organizÄjot procesus komandÄs: konkrÄtu attÄlu nosaukÅ”anu, Ä«paÅ”u atļauju sarakstu un iekÅ”Äjo lÄ«gumu uzturÄÅ”anu. Bet galu galÄ tas joprojÄm ir jÄautomatizÄ. Un, ja ar gatavu risinÄjumu iespÄjÄm nepietiek, ir jÄdara kaut kas no paÅ”a.
SituÄcija ar pirmajiem diviem kritÄrijiem ir lÄ«dzÄ«ga: tos nevar apmierinÄt, nesaÅemot datus no ÄrÄjas sistÄmas - tÄs, kurÄ tiek izvietotas lietojumprogrammas (mÅ«su gadÄ«jumÄ Kubernetes).
DarbplÅ«smas Git ilustrÄcija
PieÅemsim, ka programmÄ Git strÄdÄjat Å”Ädi:
Ikona ar galviÅu diagrammÄ norÄda konteinera attÄlus, kas paÅ”laik ir izvietoti Kubernetes jebkuram lietotÄjam (galalietotÄjiem, testÄtÄjiem, vadÄ«tÄjiem utt.) vai kurus izstrÄdÄtÄji izmanto atkļūdoÅ”anai un lÄ«dzÄ«giem mÄrÄ·iem.
Kas notiek, ja tÄ«rÄ«Å”anas politikas ļauj tikai saglabÄt attÄlus (nevis dzÄst) pÄc dotajiem tagu nosaukumiem?
AcÄ«mredzot Å”Äds scenÄrijs nevienu neiepriecinÄs.
Kas mainÄ«sies, ja politikas atļauj attÄlus nedzÄst? atbilstoÅ”i noteiktajam laika intervÄlam / pÄdÄjo saistÄ«bu skaitam?
RezultÄts ir kļuvis daudz labÄks, taÄu joprojÄm ir tÄlu no ideÄla. Galu galÄ mums joprojÄm ir izstrÄdÄtÄji, kuriem ir nepiecieÅ”ami attÄli reÄ£istrÄ (vai pat tie ir izvietoti K8s), lai atkļūdotu kļūdas...
RezumÄjot paÅ”reizÄjo tirgus situÄciju: konteineru reÄ£istros pieejamÄs funkcijas nepiedÄvÄ pietiekamu elastÄ«bu tÄ«rÄ«Å”anÄ, un galvenais iemesls tam ir nekÄdÄ veidÄ nevar sazinÄties ar Ärpasauli. IzrÄdÄs, ka komandas, kurÄm nepiecieÅ”ama Å”Äda elastÄ«ba, ir spiestas patstÄvÄ«gi ieviest attÄlu dzÄÅ”anu āno Ärpusesā, izmantojot Docker Registry API (vai atbilstoÅ”Äs ievieÅ”anas vietÄjo API).
TomÄr mÄs meklÄjÄm universÄlu risinÄjumu, kas automatizÄtu attÄlu tÄ«rÄ«Å”anu dažÄdÄm komandÄm, izmantojot dažÄdus reÄ£istrus...
MÅ«su ceļŔ uz universÄlu attÄla tÄ«rÄ«Å”anu
No kurienes rodas Ŕī vajadzÄ«ba? Fakts ir tÄds, ka mÄs neesam atseviŔķa izstrÄdÄtÄju grupa, bet komanda, kas apkalpo daudzus no tiem vienlaikus, palÄ«dzot vispusÄ«gi atrisinÄt CI/CD problÄmas. Un galvenais tehniskais rÄ«ks tam ir atvÄrtÄ koda utilÄ«ta werf. TÄ Ä«patnÄ«ba ir tÄda, ka tÄ neveic vienu funkciju, bet pavada nepÄrtrauktus piegÄdes procesus visos posmos: no montÄžas lÄ«dz izvietoÅ”anai.
AttÄlu publicÄÅ”ana reÄ£istrÄ* (tÅ«lÄ«t pÄc to izveides) ir acÄ«mredzama Å”Ädas utilÄ«ta funkcija. Un tÄ kÄ attÄli tur tiek ievietoti uzglabÄÅ”anai, tad - ja jÅ«su krÄtuve nav neierobežota - jums ir jÄatbild par to turpmÄko tÄ«rÄ«Å”anu. Par to, kÄ mÄs guvÄm panÄkumus Å”ajÄ jomÄ, izpildot visus noteiktos kritÄrijus, tiks apspriests tÄlÄk.
* Lai gan paÅ”i reÄ£istri var atŔķirties (Docker Registry, GitLab Container Registry, Harbor u.c.), to lietotÄji saskaras ar tÄdÄm paÅ”Äm problÄmÄm. UniversÄlais risinÄjums mÅ«su gadÄ«jumÄ nav atkarÄ«gs no reÄ£istra ievieÅ”anas, jo darbojas Ärpus paÅ”iem reÄ£istriem un piedÄvÄ tÄdu paÅ”u darbÄ«bu visiem.
Lai gan mÄs izmantojam werf kÄ piemÄru, mÄs ceram, ka izmantotÄs pieejas bÅ«s noderÄ«gas citÄm komandÄm, kuras saskaras ar lÄ«dzÄ«gÄm grÅ«tÄ«bÄm.
TÄpÄc mÄs bijÄm aizÅemti ÄrÄjs attÄlu tÄ«rÄ«Å”anas mehÄnisma ievieÅ”ana - to iespÄju vietÄ, kas jau ir iebÅ«vÄtas konteineru reÄ£istros. Pirmais solis bija izmantot Docker Registry API, lai izveidotu tÄdas paÅ”as primitÄ«vas politikas tagu skaitam un to izveides laikam (minÄts iepriekÅ”). ViÅiem pievienots atļauju saraksts, pamatojoties uz attÄliem, kas izmantoti izvietotajÄ infrastruktÅ«rÄ, t.i. Kubernetes. PÄdÄjam pietika ar Kubernetes API izmantoÅ”anu, lai atkÄrtotu visus izvietotos resursus un iegÅ«tu vÄrtÄ«bu sarakstu. image.
Å is triviÄlais risinÄjums atrisinÄja viskritiskÄko problÄmu (kritÄrijs Nr. 1), taÄu bija tikai sÄkums mÅ«su ceļojumam uz tÄ«rÄ«Å”anas mehÄnisma uzlaboÅ”anu. NÄkamais ā un daudz interesantÄks ā solis bija lÄmums saistÄ«t publicÄtos attÄlus ar Git vÄsturi.
AtzÄ«mÄÅ”anas shÄmas
SÄkumÄ mÄs izvÄlÄjÄmies pieeju, kurÄ galÄ«gajÄ attÄlÄ ir jÄsaglabÄ tÄ«rÄ«Å”anai nepiecieÅ”amÄ informÄcija, un procesu veidojÄm uz marÄ·ÄÅ”anas shÄmÄm. PublicÄjot attÄlu, lietotÄjs izvÄlÄjÄs konkrÄtu marÄ·ÄÅ”anas opciju (git-branch, git-commit vai git-tag) un izmantoja atbilstoÅ”o vÄrtÄ«bu. CI sistÄmÄs Ŕīs vÄrtÄ«bas tika iestatÄ«tas automÄtiski, pamatojoties uz vides mainÄ«gajiem. PatiesÄ«bÄ gala attÄls bija saistÄ«ts ar konkrÄtu Git primitÄ«vu, saglabÄjot tÄ«rÄ«Å”anai nepiecieÅ”amos datus etiÄ·etÄs.
Å Ä«s pieejas rezultÄtÄ tika izveidots politiku kopums, kas ļÄva Git izmantot kÄ vienÄ«go patiesÄ«bas avotu:
DzÄÅ”ot filiÄli/tagu pakalpojumÄ Git, saistÄ«tie attÄli reÄ£istrÄ tika automÄtiski izdzÄsti.
Ar Git tagiem un saistÄ«bÄm saistÄ«to attÄlu skaitu var kontrolÄt, izmantojot atlasÄ«tajÄ shÄmÄ izmantoto tagu skaitu un laiku, kad tika izveidots saistÄ«tais apstiprinÄjums.
KopumÄ izstrÄdÄtÄ ievieÅ”ana apmierinÄja mÅ«su vajadzÄ«bas, taÄu drÄ«z mÅ«s sagaidÄ«ja jauns izaicinÄjums. Fakts ir tÄds, ka, izmantojot marÄ·ÄÅ”anas shÄmas, kuru pamatÄ ir Git primitÄ«vi, mÄs saskÄrÄmies ar vairÄkiem trÅ«kumiem. (TÄ kÄ to apraksts ir Ärpus Ŕī raksta darbÄ«bas jomas, ikviens var iepazÄ«ties ar detaļÄm Å”eit.) TÄpÄc, nolÄmuÅ”i pÄriet uz efektÄ«vÄku tagu pievienoÅ”anas pieeju (satura iezÄ«mÄÅ”anu), nÄcÄs pÄrskatÄ«t attÄla tÄ«rÄ«Å”anas ievieÅ”anu.
Jauns algoritms
KÄpÄc? Izmantojot uz saturu balstÄ«tu marÄ·ÄÅ”anu, katrs tags var apmierinÄt vairÄkas Git saistÄ«bas. TÄ«rot attÄlus, jÅ«s vairs nevarat pieÅemt tikai no apstiprinÄÅ”anas, kurÄ jaunais tags tika pievienots reÄ£istrÄ.
Jaunajam tÄ«rÄ«Å”anas algoritmam tika nolemts atteikties no marÄ·ÄÅ”anas shÄmÄm un veidot metatÄla process, katrÄ no kurÄm tiek glabÄta virkne:
commit, kurÄ tika veikta publikÄcija (nav nozÄ«mes tam, vai attÄls tika pievienots, mainÄ«ts vai palika nemainÄ«gs konteinera reÄ£istrÄ);
un mÅ«su iekÅ”Äjais identifikators, kas atbilst samontÄtajam attÄlam.
Citiem vÄrdiem sakot, tas tika nodroÅ”inÄts publicÄto tagu saistÄ«Å”ana ar saistÄ«bÄm pakalpojumÄ Git.
GalÄ«gÄ konfigurÄcija un vispÄrÄjais algoritms
KonfigurÄjot tÄ«rÄ«Å”anu, lietotÄjiem tagad ir piekļuve politikÄm, kas atlasa paÅ”reizÄjos attÄlus. Katra Å”Äda politika ir definÄta:
daudzas atsauces, t.i. Git tagi vai Git atzari, kas tiek izmantoti skenÄÅ”anas laikÄ;
un meklÄto attÄlu ierobežojums katrai atsaucei no kopas.
Lai ilustrÄtu, noklusÄjuma politikas konfigurÄcija sÄka izskatÄ«ties Å”Ädi:
PÄdÄjais algoritms sastÄv no Å”ÄdÄm darbÄ«bÄm:
Notiek manifestu izgūŔana no konteinera reģistra.
IzÅemot Kubernetes izmantotos attÄlus, jo MÄs jau esam tos iepriekÅ” atlasÄ«juÅ”i, aptaujÄjot K8s API.
Git vÄstures skenÄÅ”ana un attÄlu izslÄgÅ”ana, pamatojoties uz noteiktÄm politikÄm.
AtlikuÅ”o attÄlu noÅemÅ”ana.
Atgriežoties pie ilustrÄcijas, ar werf notiek Å”Ädi:
TomÄr pat tad, ja neizmantojat werf, lÄ«dzÄ«gu pieeju uzlabotai attÄla tÄ«rÄ«Å”anai vienÄ vai otrÄ ievieÅ”anÄ (atbilstoÅ”i vÄlamajai attÄla marÄ·ÄÅ”anas pieejai) var izmantot arÄ« citÄm sistÄmÄm/utilÄ«tiem. Lai to izdarÄ«tu, pietiek atcerÄties raduÅ”Äs problÄmas un savÄ kaudzÄ atrast tÄs iespÄjas, kas ļauj pÄc iespÄjas raitÄk integrÄt to risinÄjumu. MÄs ceram, ka mÅ«su noietais ceļŔ palÄ«dzÄs jums paskatÄ«ties uz jÅ«su konkrÄto gadÄ«jumu ar jaunÄm detaļÄm un pÄrdomÄm.
SecinÄjums
AgrÄk vai vÄlÄk lielÄkÄ daļa komandu saskaras ar reÄ£istra pÄrpildes problÄmu.
MeklÄjot risinÄjumus, vispirms ir jÄnosaka attÄla atbilstÄ«bas kritÄriji.
PopulÄro konteineru reÄ£istra pakalpojumu piedÄvÄtie rÄ«ki ļauj organizÄt ļoti vienkÄrÅ”u tÄ«rÄ«Å”anu, neÅemot vÄrÄ āÄrpasauliā: Kubernetes izmantotos attÄlus un komandas darbplÅ«smu Ä«patnÄ«bas.
ElastÄ«gam un efektÄ«vam algoritmam ir jÄbÅ«t izpratnei par CI/CD procesiem un jÄdarbojas ne tikai ar Docker attÄla datiem.