
Artiklis kĂ€sitletakse konteinerite registrites (Docker Registry ja sarnastes) kogunevate piltide puhastamise probleemistikku, arvestades tĂ€napĂ€evaseid CI/CD torujuhtmeid cloud native rakenduste jaoks, mis on tarnitud Kubernetesesse. Esitatakse peamised kriteeriumid piltide asjakohasuse osas ja nendest tulenevad raskused puhastamise automatiseerimisel, ruumi sÀÀstmisel ja meeskondade vajaduste rahuldamisel. LĂ”puks, kasutades konkreetse Open Source projekti nĂ€idet, rÀÀgime, kuidas neid raskusi ĂŒletada.
Sissejuhatus
Konteinerite registris olevate piltide arv vÔib kiiresti suureneda, kulutades rohkem ruumi salvestusmahule ning seelÀbi suurendades oluliselt selle maksumust. Registris ruumi kontrollimise, piiramise vÔi vastuvÔetava kasvu sÀilitamise jaoks on tavaks:
- kasutada fikseeritud arvu silte piltidele;
- mingil moel piltide puhastamine.
Esimene piirang on mĂ”nikord lubatav vĂ€ikestes meeskondades. Kui arendajatele piisab pidevatest siltidest (latest, main, test, boris ja jne), register ei suureneks, ja pikalt ei pea ĂŒldse muretsema puhastamise pĂ€rast. KĂ”ik aegumatud kujutised asendatakse, ning puhastamiseks ei jÀÀ lihtsalt tööd (kĂ”ik toimub tavalise prĂŒgikoguja kaudu).
Kuid selline lĂ€henemine piirab arendust ja sageli ei ole see rakendatav kaasaegse CI/CD projektide puhul. Arenduse lahutamatu osa on automatiseerimine, mis vĂ”imaldab palju kiiremini testida, juurutada ja edastada uusi funktsioone kasutajatele. NĂ€iteks meie kĂ”igis projektides luuakse igal commitil automaatselt CI-pipeline. Seal kogutakse pilt, testitakse, juurutatakse erinevatesse Kubernetes'i keskkondadesse tĂ”rgeteotsimiseks ja jĂ€relejÀÀnud kontrollide lĂ€biviimiseks, ning kui kĂ”ik on hĂ€sti, jĂ”uavad muudatused lĂ”ppkasutajani. See ei ole ammu enam rocket science, vaid iga pĂ€evane praktika paljudele â tĂ”enĂ€oliselt ka teile, kui loete seda artiklit.
Kuna vigade kĂ”rvaldamine ja uute funktsioonide arendamine toimub paralleelselt ning vĂ€ljalasked vĂ”ivad toimuda mitu korda pĂ€evas, on ilmne, et arendusprotsessiga kaasneb mĂ€rkimisvÀÀrne hulk commit'e, seega â registreerimises on palju pilte. SeetĂ”ttu tekib terav kĂŒsimus tĂ”husast registri puhastamisest, st mittesobivate piltide eemaldamisest.
Aga kuidas ĂŒldse mÀÀrata, kas pilt on asjakohane?
Pildi asjakohasuse kriteeriumid
Enamikul juhtudel on pÔhikriteeriumid jÀrgmised:
1. Esimene (kĂ”ige ilmsem ja kriitilisem) â see on pildid, mis on hetkel kasutusel Kuberneteses. Nende piltide eemaldamine vĂ”ib pĂ”hjustada tĂ”siseid kulusid seoses tootmise seiskumisega (nĂ€iteks vĂ”ivad need pildid olla vajalikud replikatsiooniks) vĂ”i tĂŒhistada meeskonna pingutused, mis tegeleb silumine ĂŒhe vĂ”i teise kontuuri peal. (Sel pĂ”hjusel oleme isegi loonud spetsiaalse , mis jĂ€lgib selliste piltide puudumist igas Kubernetesi klastris.)
2. Teine (vĂ€hem ilmne, kuid samuti vĂ€ga oluline ja jĂ€lle tootmisega seotud) â pildid, mis on vajalikud tagasipöördumiseks tĂ”siste probleemide ilmnemisel praeguses versioonis. NĂ€iteks, Helmiga seoses on need pildid, mida kasutatakse salvestatud versioonides. (Muide, Helmil on vaikimisi 256 versiooni piirmÀÀr, kuid tĂ”enĂ€oliselt pole kellelgi tegelikult vajadust salvestada sellist suur hulk versioone?..) Just selleks me versioone salvestame, et saaksime neid hiljem kasutada, st âtagasi keridaâ, kui on vaja.
3. Kolmas â arendajate vajadused: kĂ”ik pildid, mis on seotud nende praeguste töödega. NĂ€iteks, kui vaatame PR-i, siis on mĂ”istlik hoida pilt, mis vastab viimasele commit'ile ja ĂŒtleme, eelmisele commit'ile: nii saab arendaja kiiresti naasta mis tahes ĂŒlesande juurde ja töötada viimaste muudatustega.
4. Neljas â pildid, mis vastavad meie rakenduse versioonidele, st on lĂ”pp-produkt: v1.0.0, 20.04.01, sierra jne.
NB: Siin mÀÀratletud kriteeriumid on koostatud kogenud arendustiimide koostöökogemuse pÔhjal erinevatest ettevÔtetest. Kuid loomulikult vÔivad need kriteeriumid varieeruda sÔltuvalt arendusprotsesside ja kasutatava infrastruktuuri (nt Kubernetes'i mittekasutamine) spetsiifilisusest.
Kriteeriumite vastavus ja olemasolevad lahendused
Populaarsed container registry teenused pakuvad tavaliselt oma imagede puhastusreegleid: nendes on vÔimalik mÀÀrata tingimusi, mille kohaselt silt registry's kustutatakse. Kuid nende tingimuste vÔimalused on piiratud selliste parameetritega nagu nimed, loomise aeg ja siltide arv*.
* SĂ”ltub konkreetsete container registry rakenduste vĂ”imalustest. Oleme vaadanud jĂ€rgmiste lahenduste funktsioone: Azure CR, Docker Hub, ECR, GCR, GitHub Packages, GitLab Container Registry, Harbor Registry, JFrog Artifactory, Quay.io â seisuga september 2020.
Selliste parameetrite kogum on tĂ€iesti piisav, et tĂ€ita neljas kriteerium â see tĂ€hendab valida pilte, mis vastavad versioonidele. Kuid kĂ”igi teiste kriteeriumide puhul tuleb teha mingisugune kompromisslahendus (rangem vĂ”i vastupidi, leebem poliitika) â sĂ”ltuvalt ootustest ja rahalistest vĂ”imalustest.
NĂ€iteks kolmandat kriteeriumi â mis on seotud arendajate vajadustega â saab lahendada protsesside korraldamise kaudu meeskondades: spetsiifilised pildinimed, spetsiaalsete lubatud loendite koostamine ja sisemised kokkulepped. Kuid lĂ”puks on vaja see ikkagi automatiseerida. Ja kui valmis lahenduste vĂ”imalused ei piisa, tuleb midagi oma kĂ€tega teha.
Sama kehtib kahe esimese kriteeriumi kohta: neid ei saa tĂ€ita, saamata andmeid vĂ€lisest sĂŒsteemist â just sealt, kus rakenduste juurutamine toimub (meie puhul on see Kubernetes).
Workflowsi illustreerimine Git-is
Eeldame, et töötate umbes sellise skeemi jÀrgi Git-is:

Kujutise ikooniga on nÀidatud konteinerite pildid, mis on praegu Kuberneteses kasutuses mÔne kasutaja (lÔppkasutajad, testijad, juhendajad jne) jaoks vÔi mida arendajad kasutavad tÔrgete silumiseks ja sarnaste eesmÀrkide jaoks.
Mis juhtub, kui puhastuspoliitikad lubavad jÀtta (mitte kustutada) pildid ainult mÀÀratud sildinimede jÀrgi.?

Ilmselgelt ei meeldi selline stsenaarium kellelegi.
Mis muutub, kui poliitikad lubavad mitte kustutada pilte mÀÀratud ajavahemiku / viimaste commitide arvu jÀrgi.?

Tulemus on mÀrgatavalt parem, kuid siiski kaugel ideaalist. Meil on endiselt arendajaid, kellele on vajalikud registris olevad pildid (vÔi isegi Kuberneteses kasutatavad) tÔrkeotsingu jaoks...
KokkuvĂ”ttes valitsev olukord turul: konteineriregistrites pakutavad funktsioonid ei paku puhastamiseks piisavalt paindlikkust ja peamine pĂ”hjus on â puudub vĂ”imalus suhelda vĂ€lismaailmaga.. Tundub, et meeskonnad, kellele on vajalik selline paindlikkus, peavad ise teostama piltide eemaldamise âvĂ€ljastpooltâ, kasutades Docker Registry API-d (vĂ”i vastava teostuse natiivset API-d).
Kuid me otsisime universaalset lahendust, mis automatiseeriks piltide puhastamise erinevate meeskondade jaoks, kes kasutavad erinevaid registrite...
Meie tee universaalse piltide puhastamise suunal
Kust see vajadus tuleb? Asi on selles, et me ei ole eraldi arendajate rĂŒhm, vaid meeskond, mis teenindab korraga mitut sellist, aidates lahendada CI/CD kĂŒsimusi terviklikult. Ja peamine tehniline tööriist selle jaoks on avatud lĂ€htekoodiga utiliit. . Selle eripĂ€ra on see, et see ei tĂ€ida ĂŒhteainust funktsiooni, vaid toetab pideva kohaletoimetamise protsesse kĂ”igil etappidel: kogumisest kuni juurutamiseni.
Piltide avaldamine registris* (vahetult pĂ€rast nende kogumist) on sellise utiliidi ilmselge funktsioon. Ja kuna pildid pannakse sinna hoidmiseks, siis â kui teie salvestusruum ei ole piiramatud â peate vastutama ka nende edasise puhastamise eest. Edasi rÀÀgime sellest, kuidas me oleme selles edukad, rahuldades kĂ”ik seatud kriteeriumid.
* Kuigi registrid vÔivad olla erinevad (Docker Registry, GitLabi konteineri register, Harbor jne), seisavad nende kasutajad silmitsi samade probleemidega. Universaalne lahendus meie puhul ei sÔltu registri rakendusest, kuna see teostatakse registritest vÀljaspool ja pakub kÔigile sama kÀitumist.
Kuigi kasutame werfi nÀitena rakendusest, loodame, et rakendatud lÀhenemisviisid on kasulikud ka teistele meeskondadele, kes seisavad silmitsi sarnaste keerukustega.
Nii et me vĂ”tsime kĂ€sile vĂ€lise mehhanismi piltide puhastamiseks â erinevalt neist vĂ”imalustest, mis on juba konteinerite registrites sisse ehitatud. Esimene samm oli Docker Registry API kasutamine, et luua endiselt primitiivseid poliitikaid siltide arvu ja nende loomise aja kohta (nagu juba mainitud). Neile lisati lubamise nimekiri, mis pĂ”hineb rakendatud infrastruktuuris kasutatavatel piltidel, st Kubernetes. Viimase jaoks oli piisav, kui Kubernetes API kaudu lĂ€bi kĂ€ia kĂ”ik juurutatud ressursid ja saada nimekiri vÀÀrtustest. pilt.
See lihtne lahendus lahendas kÔige kriitilisema probleemi (kriteerium nr 1), kuid oli alles meie teekonna algus puhastusmehhanismi tÀiustamiseks. JÀrgmine ja palju huvitavam samm oli seostada avaldatud pildid Git'i ajalooga.
MĂ€rgistamisstrateegiad
Alguses valisime lĂ€henemise, kus lĂ”plik pilt peab sisaldama vajalikku teavet puhastamiseks, ja ĂŒles ehitasime protsessi mĂ€rgistusstrateegiate pĂ”hjal. Pildi avaldamisel valis kasutaja kindla mĂ€rgistamisvaliku (git-branch, git-commit vĂ”i git-tag) ja kasutas vastavat vÀÀrtust. CI-sĂŒsteemides mÀÀrati need vÀÀrtused automaatselt keskkonnamuutujate alusel. Sisuliselt seoti lĂ”plik pilt kindla Git'i primitiiviga, hoides puhastamiseks vajalikke andmeid etikettides.
Selle lÀhenemise raames loodi poliitikate kogum, mis vÔimaldas kasutada Git'i kui ainust tÔepÀdevuse allikat:
- Kui Git'is kustutati haru/tag, kustutati automaatselt ka seotud pildid registrist.
- Git-tÀgidega ja commit'idega seotud piltide arvu saab reguleerida valitud skeemis kasutatud etiketide arvuga ja seotud commit'i loomise ajaga.
KokkuvĂ”ttes vastas valminud teostus meie vajadustele, kuid peagi ootas meid uus vĂ€ljakutse. Asi on selles, et Git'i primitiivide pĂ”histe etiketiskeemide kasutamise ajal oleme kokku puutunud mitmete puudustega. (Kuna nende kirjeldus jÀÀb kĂ€esoleva artikli teemast vĂ€lja, vĂ”ivad kĂ”ik huvilised tutvuda ĂŒksikasjadega .) SeetĂ”ttu, otsustades liikuda tĂ”husama lĂ€henemise suunas etiketiseerimise (sisupĂ”hine etikettimine) osas, pidime lĂ€bi vaatama ka piltide puhastamise teostuse.
Uus algoritm
Miks? SisupÔhises etikettimises vÔib iga etikett rahuldada mitmeid commit'e Git'is. Piltide puhastamisel ei saa enam lÀhtuda ainult commit'ist, mille alusel uus etikett registrisse lisati.
Uue puhastuse algoritmi jaoks otsustati loobuda etiketiseerimise skeemidest ja luua protsess meta-piltide pĂ”hjal, millest igaĂŒhes hoitakse sidet:
- kommiit, millega tehti avaldamine (ilmtingimata ei oma tÀhtsust, kas pilt konteinerristis lisandus, muutus vÔi jÀi samaks);
- ja meie sisemise identifikaatori, mis vastab koostatud pildile.
TeisisÔnu, tagati avaldatud siltide ja Git'i kommintide seos.
LĂ”plik konfigureerimine ja ĂŒldine algoritm
Kasutajad said puhastuskonfiguratsioonis kÀtte poliitikad, mille alusel valitakse aktuhed pildid. Iga selline poliitika mÀÀratletakse:
- rohke reference'iga, st Git'i siltide vÔi Git'i harudega, mida kasutatakse skannimisel;
- ja otsitava pildi limiidiga iga reference'i jaoks.
Ilustratsiooniks â siin on, kuidas vaikimisi poliitikate konfiguratsioon vĂ€lja nĂ€gi:
cleanup:
keepPolicies:
- references:
tag: \/.*\/\
limit:
last: 10
- references:
branch: \/.*\/\
limit:
last: 10
in: 168h
operator: And
imagesPerReference:
last: 2
in: 168h
operator: And
- references:
branch: \/^(main|staging|production)$\/\
imagesPerReference:
last: 10
Selline konfiguratsioon sisaldab kolme poliitikat, mis vastavad jÀrgmistele reeglitele:
- Hoida pilt 10 viimase Git-sildi jaoks (sildi loomise kuupÀeva alusel).
- SÀilitada mitte rohkem kui 2 pilti, mis on avaldatud viimase nÀdala jooksul, kuni 10 haru tegevusega viimase nÀdala jooksul.
- SĂ€ilitada 10 pilti harude jaoks.
main,stagingjatootmisse.
KokkuvÔtlik algoritm koosneb jÀrgmistest sammudest:
- Manifestide saamine konteineri registrist.
- Piltide vĂ€listamine, mida kasutatakse Kuberneteses, kuna need on juba eelnevalt valitud, kĂŒsides K8s API-lt.
- Git-i ajaloos skaneerimine ja piltide vÀlistamine vastavalt mÀÀratud poliitikatele.
- JÀrelejÀÀnud piltide kustutamine.
Naastes meie illustratsiooni juurde, siin on see, mis juhtub werfiga:

Kuid isegi kui te ei kasuta werf'i, vĂ”ib sarnane lĂ€henemine piltide edasisele puhastamisele â mis tahes rakenduses (vastavalt eelistatud piltide sildistamise lĂ€henemisele) â olla rakendatav ka muudes sĂŒsteemides/utiliitides. Piisab, kui mĂ€letada neid probleeme, mis vĂ”ivad tekkida, ja leida need vĂ”imalused oma tehnoloogias, mis vĂ”imaldavad nende lahendusi sujuvalt integreerida. Loodame, et meie lĂ€bitud tee aitab vaadata ka teie konkreetset juhtumit uute detailide ja mĂ”tetega.
KokkuvÔte
- Varem vÔi hiljem puutub enamik meeskondi kokku registri tÀitumise probleemiga.
- Lahenduste otsimisel on esmalt vaja mÀÀratleda piltide asjakohasuse kriteeriumid.
- Populaarsete konteineriregistri teenuste pakkumised vÔimaldavad korraldada vÀga lihtsa puhastuse, mis ei arvesta "vÀlist maailma": pildid, mida kasutatakse Kuberneteses, ja meeskonna tööprotsesside eripÀrad.
- Paindlik ja tÔhus algoritm peaks arvestama CI/CD-protsessidega, töötlema mitte ainult Docker-pilte.
P.S.
Lugege ka meie blogist:
- «»;
- «»;
- «»;
- «».
Allikas: habr.com
