
Artiklis kĂ€sitletakse konteinerite registrites (nt Docker Registry) kogunevate piltide puhastamise probleeme kaasaegsete CI/CD torujuhtmete tingimustes, mis on mĂ”eldud Kuberneteses tarnitavatele pilvepĂ”histele rakendustele. Toome vĂ€lja peamised piltide aktuaalsuse kriteeriumid ja nendest tulenevad raskused puhastamise automatiseerimisel, ruumi sÀÀstmisel ja meeskondade vajaduste rahuldamisel. LĂ”puks rÀÀgime konkreetse avatud lĂ€htekoodiga projekti nĂ€itel, kuidas neid raskusi ĂŒletada.
Sissejuhatus
Konteinerite registris olevate piltide arv vÔib kiiresti kasvada, hÔivates rohkem ruumi salvestuses ja suurenedes seelÀbi oluliselt selle maksumust. Ruumi kontrollimiseks, piiramiseks vÔi vastuvÔetava kasvu sÀilitamiseks registry's kasutatakse tavaliselt:
- fikseeritud arvu silte piltide jaoks;
- millelegi muule nagu piltide puhastamine.
Esimene piirang on mĂ”nikord lubatav vĂ€ikestes meeskondades. Kui arendajatele piisab pĂŒsivatest siltest (latest, main, test, boris jne), ei paisu register suuruseks ja saab pikka aega tĂ€ielikult unustada puhastamisest. KĂ”ik mitteaktuaalsed pildid ĂŒksteise ĂŒle kirjutatakse ja puhastamiseks ei jÀÀ lihtsalt tööd (kĂ”ik toimub tavapĂ€rase rĂ€mpsupĂŒĂŒdja kaudu).
Siiski piirab selline lĂ€henemine tugevalt arendustegevust ja on harva kasutatav kaasaegsetes CI/CD projektides. Arendamise lahutamatuks osaks on saanud automaatika, mis vĂ”imaldab uute funktsioonide testimist, juurutamist ja tarnimist kasutajatele palju kiiremini. NĂ€iteks meie kĂ”igis projektides luuakse iga commiti ajal automaatselt CI-pipe. Seal luuakse pilt, testitakse, suunatakse erinevatesse Kubernetes keskkondadesse tĂ”rgete vĂ€ltimiseks ja ĂŒlejÀÀnud kontrollide jaoks, ja kui kĂ”ik on hĂ€sti, jĂ”uavad muudatused lĂ”ppkasutajani. See pole ammu mitte raketiteadus, vaid paljudele igapĂ€evane praktika â tĂ”enĂ€oliselt ka teile, kuna loete seda artiklit.
Kuna vigade kĂ”rvaldamine ja uue funktsionaalsuse arendamine toimub paralleelselt ning vĂ€ljastamine vĂ”ib toimuda mitu korda pĂ€evas, on ilmselge, et arendusprotsessiga kaasneb mĂ€rkimisvÀÀrne arv commit'e, ja seega - suure arvu piltide olemasolu registry's.SeetĂ”ttu kerkib teravalt ĂŒles kĂŒsimus efektiivse registry puhastamise korraldamisest, st mitteaktuaalsete piltide eemaldamisest.
Kuidas aga kindlaks teha, kas pilt on asjakohane?
Pildi asjakohasuse kriteeriumid
Enamikul juhtudel on peamised kriteeriumid jÀrgmised:
1. Esimene (kĂ”ige ilmsem ja kĂ”ikidest kĂ”ige kriitilisem) â need on pildid, mis hetkel kasutatakse Kuberneteses. Nende eemaldamine vĂ”ib pĂ”hjustada tĂ”siseid kulusid seoses produktsiooni seiskumisega (nĂ€iteks vĂ”ivad pildid olla vajalikud kopeerimise ajal) vĂ”i tĂŒhistada meeskonna pingutused, kes tegeleb tĂ”rgete tĂ”rkeotsinguga mĂ”nes kontuuris. (SellepĂ€rast tegime eraldi , mis jĂ€lgib selliste piltide puudumist igas Kubernetes-klastris.)
2. Teine (vĂ€hem ilmne, kuid samuti vĂ€ga oluline ja jĂ€lle seotud kasutamisega) â pildid, mis on vajalikud rikka juhtudel, kui esinevad tĂ”sised probleemid praeguses versioonis. NĂ€iteks, kui rÀÀkida Helm'ist, siis on need pildid, mis on kasutusel salvestatud vĂ€ljalaskeversioonides. (Muide, Helm'il on vaikimisi 256 revideerimise piirmÀÀr, kuid kas kellelgi on tĂ”eliselt vajadust sĂ€ilitada nii suurt versioonide arvu?..) Me hoiame versioone just selleks, et neid hiljem kasutada, st et saaksime vajadusel âtagasi pöördudaâ.
3. Kolmas â arendajate vajadused: kĂ”ik pildid, mis on seotud nende praeguste töödega. NĂ€iteks, kui vaatame PR'i, on mĂ”istlik jĂ€tta pilt, mis vastab viimasele commit'ile ja, ĂŒtleme, eelmisele commit'ile: nii saab arendaja kiiresti naasta igasse ĂŒlesandesse ja töötada viimaste muudatustega.
4. Neljas â pildid, mis vastavad meie rakenduse versioonidele, st on lĂ”pptooted: v1.0.0, 20.04.01, sierra jms.
NB: Siin vĂ€lja toodud kriteeriumid on formuleeritud loodud on pĂ”hinedes kogemustele, mis on saadud koostöös kĂŒmnete arendajate meeskondadega erinevatest ettevĂ”tetest. Kuid loomulikult vĂ”ivad need kriteeriumid erinevalt sĂ”ltuda arendusprotsesside ja kasutatava infrastruktuuri (nt kui Kubernetesit ei kasutata) spetsiifikast.
Kriteeriumite vastavus ja olemasolevad lahendused
Populaarsed konteineriregistrite teenused pakuvad tavaliselt oma pildipuhastuspoliitikat: nendes saate mÀÀrata tingimused, mille alusel silt kustutatakse registrist. Kuid nende tingimuste vÔimalused on piiratud selliste parameetritega nagu nimed, loomise aeg ja siltide arv*.
* SĂ”ltub konkreetsest konteineriregistri rakendusest. Oleme uurinud jĂ€rgmiste lahenduste vĂ”imalusi: Azure CR, Docker Hub, ECR, GCR, GitHub Packages, GitLab Container Registry, Harbor Registry, JFrog Artifactory, Quay.io â seisuga septembr â2020.
Selline parameetrite kogum on piisav, et rahuldada neljandat kriteeriumi â see tĂ€hendab valides pilte, mis vastavad versioonidele. KĂ”ikide ĂŒlejÀÀnud kriteeriumite puhul peab aga leidma mingisuguse kompromissi (karmema vĂ”i vastupidi, leebema poliitika) vastavalt ootustele ja rahalistele vĂ”imalustele.
NĂ€iteks kolmas kriteerium â arendajate vajadustega seotud â vĂ”ib lahendada meeskondade sees toimingute korraldamise kaudu: spetsiifiliste piltide nimetamine, spetsiaalsete lubade loetelu koostamine ja sisemised kokkulepped. Kuid lĂ”puks tuleb see ikkagi automatiseerida. Ja kui valmis lahendused ei rahulda vajadusi, tuleb teha midagi oma kĂ€tega.
Sarnane olukord on ka kahe esimese kriteeriumiga: neid ei saa tĂ€ita ilma andmete saamiseta vĂ€lisest sĂŒsteemist â just sellest, kus rakenduste juurutamine toimub (meie puhul on see Kubernetes).
Töövoo illustratsioon Git-is
Oletame, et töötate umbes sellise skeemi jÀrgi Git-is:

Scheemis mÀrgitud pea ikooniga on konteineripildid, mis on hetkel juurutatud Kuberneteses mÔnedele kasutajatele (lÔppkasutajatele, testijatele, juhtidele jne) vÔi mida arendajad kasutavad tÔrgete tÔrkeotsinguks ja muudel eesmÀrkidel.
Mida juhtub, kui puhastuspoliitikad lubavad jÀtta (mitte kustutada) pilte ainult mÀÀrapidude nimede jÀrgi?

Ilmselgelt ei meeldi see stsenaarium kellelegi.
Mis muutub, kui poliitikad vĂ”imaldavad mitte kustutada pilte mÀÀratud ajavahemiku / viimaseid commitâe arvu pĂ”hjal?

Tulemus on olnud mĂ€rkimisvÀÀrselt parem, kuid on endiselt kaugel ideaalist. LĂ”ppude lĂ”puks on meil endiselt arendajaid, kellele on vaja pilte registris (vĂ”i isegi juurutatud K8s-s), et tĂ”rkeid tĂ”rkeotsinguksâŠ
KokkuvĂ”ttes ei paku konteineriregistrite kaudu saadaval olevad funktsioonid piisavat paindlikkust puhastamise osas, mille peamine pĂ”hjus on vĂ€lismaailmaga suhtlemise puudumine. Tulemuseks on see, et meeskonnad, kes vajavad sellist paindlikkust, peavad piltide eemaldamist âvĂ€ljastpooltâ ise rakendama, kasutades Docker Registry API-d (vĂ”i vastava rakenduse natiivset API-d).
Otsisime universaalset lahendust, mis automatiseeriks piltide puhastamise erinevate meeskondade jaoks, kes kasutavad erinevaid registreidâŠ
Meie tee universaalse piltide puhastamiseni
Kust see vajadus tuleb? Asi on selles, et me ei ole ĂŒksi arendajate rĂŒhm, vaid meeskond, mis teenindab mitmeid selliseid rĂŒhmi, aidates komplekselt lahendada CI/CD kĂŒsimusi. Ja peamine tehniline tööriist selleks on avatud lĂ€htekoodiga utiliit . Selle eripĂ€ra on see, et see ei tĂ€ida ainult ĂŒhte funktsiooni, vaid toob esile pideva tarnimise protsessid kĂ”igil etappidel: kogumisest kuni juurutamiseni.
Piltide registreerimine* (kohe pĂ€rast nende koostamist) on sellise utiliidi ilmne funktsioon. Ja kuna pildid pannakse sinna sĂ€ilitamiseks, siis â kui teie ladustamine ei ole lĂ”putu â tuleb vastutada ka nende hilisema puhastamise eest. Edasi rÀÀgime, kuidas me selles osas edu saavutasime, jĂ€rgides kĂ”iki ette antud kriteeriume.
* Kuigi registreerimised vĂ”ivad olla erinevad (Docker Registry, GitLabi konteineri register, Harbor jne), seisavad nende kasutajad silmitsi sama probleemiga. Meie universaalne lahendus ei sĂ”ltu registreerimise rakendusest, kuna see tehakse vĂ€ljaspool registreid ja pakub ĂŒhtlast kĂ€itumist kĂ”igile.
Kuigi kasutame werfi rakenduse nÀitena, loodame, et rakendatud lÀhenemised on kasulikud ka teistele meeskondadele, kes silmitsi seisavad sarnaste raskustega.
Nii et me asusime vĂ€lis mehhanismi rakendama piltide puhastamiseks â selle asemel, et kasutada konteineriregistrites juba olemasolevaid vĂ”imalusi. Esimene samm oli Docker Registry API kasutamine nende lihtsate poliitikate loomiseks, mis kĂ€sitlesid siltide arvu ja nende loomise aega (nagu eespool mainitud). Neile lisati lubatud nimekiri pĂ”hjal, mida kasutati juurutatud infrastruktuuris, st, Kubernetes. Viimase jaoks oli piisav, et lĂ€bi Kubernetes API lĂ€bida kĂ”ik juurutatud ressursid ja saada vÀÀrtuste nimekirja. image.
See lihtne lahendus lahendas kÔige kriitilisema probleemi (kriteerium nr 1), kuid see oli vaid meie teekonna algus puhastusmehhanismi parendamiseks. JÀrgmine ja palju huvitavam samm oli lahendamine seostada avaldatud pildid Git'i ajalooga..
Siltimisplaanid
Alustuseks valisime lĂ€henemise, mille kohaselt peab lĂ”pppilt salvestama vajalikku teavet puhastamiseks ja me ehitasime protsessi siltimisplaanide peale. Pildi avaldamisel valis kasutaja teatud siltimisvĂ”imaluse (git-haru, git-commit vĂ”i git-silt) ja kasutas vastavat vÀÀrtust. CI-sĂŒsteemides seadistati need vÀÀrtused automaatselt keskkonnamuutujate alusel. Sisuliselt seostati lĂ”pppilt teatud Git'i primitiiviga,hoides vajalikku teavet puhastamiseks silte.
Selle lÀhenemise raames saadi poliitikate kogum, mis vÔimaldas Git'i kasutada ainsa tÔe allikana:
- Kui haru/silt eemaldati Git'is, eemaldati automaatselt ka seotud pildid registrist.
- Piltide arv, mis oli seotud Git'i siltide ja commit'idega, sai reguleerida valitud skeemis kasutatud siltide arvu ja seotud commit'i loomise aega.
KokkuvĂ”ttes rahuldas saadud rakendus meie vajadusi, kuid peagi ootas meid uus vĂ€ljakutse. Asi on selles, et Git'i primitiivide siltimisplaanide kasutamise ajal sattusime mitmete puudustega kokku. (Kuna nende kirjeldamine ĂŒletab selle artikli teema, saavad kĂ”ik huvilised tutvuda ĂŒksikasjadega. .) SeetĂ”ttu, otsustades ĂŒle minna efektiivsemale siltimisvĂ”imalusele (sisu pĂ”hine siltimine), pidime meie rakendust piltide puhastamiseks ĂŒle vaatama.
Uus algoritm
Miks? Siltimise kÀigus sisu pÔhine siltimine vÔimaldab igal sildil rahuldada mitmeid Git'i commit'e. Piltide puhastamisel ei saa enam lÀhtuda seda commit'ist, mille pÔhjal uus silt registrisse lisati.
Uue puhastusalgoritmi jaoks otsustati ĂŒle minna siltimisplaanidest ja luua protsess meta-piltide peale,igaĂŒks neist salvestab sideme:
- commit, mille avaldamine toimus (ilma et oleks oluline, kas pilt registris konteinerites lisandus, muutus vÔi jÀi samaks);
- ja meie sisemise identifikaatori, mis vastab kogutud pildile.
TeisisÔnu, oli tagatud avaldatud siltide seos Git commitidega.
LĂ”plik konfiguratsioon ja ĂŒldine algoritm
Kasutajatele on konfigureerimise puhastamisel saadaval poliitikad, mille alusel valitakse aktuaalsed pildid. Iga selline poliitika mÀÀratletakse:
- mitme viite kaudu, st Git-siltide vÔi Git-haru kaudu, mida kasutatakse skannimise ajal;
- ja otsitava pildi limiit iga viite jaoks.
Illustratsiooni jaoks â siin on, kuidas vaikimisi poliitikad vĂ€lja nĂ€evad:
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 pilti 10 viimase Git-sildi jaoks (sildi loomise kuupÀeva jÀrgi).
- Hoida mitte rohkem kui 2 pilti, mis on avaldatud viimase nÀdala jooksul, mitte rohkem kui 10 haru jaoks, mis on aktiivsed viimase nÀdala jooksul.
- Hoida 10 pilti harude jaoks
main,stagingjaproduction.
LÔplik algoritm sisaldab jÀrgmisi samme:
- Manifestide saamine konteineri registrist.
- Piltide eemaldamine, mida kasutatakse Kuberneteses, kuna need on juba eelnevalt vĂ€ljavalitud, kĂŒsides K8s API-lt.
- Git-ajaloo skannimine ja piltide eemaldamine antud poliitikate jÀrgi.
- ĂlejÀÀnud piltide eemaldamine.
Tagasi meie illustratsiooni juurde, siin on, mida werfiga saate:

Kuid isegi kui te ei kasuta werf-i, vĂ”ib sarnane lĂ€henemine edasisele piltide puhastamisele â ĂŒhel vĂ”i teisel viisil (vastavalt eelistatud piltide sildistamise lĂ€henemisele) â olla rakendatud ka muudes sĂŒsteemides/ utiliitides. Sellega piisab, kui meeles pidada, milliseid probleeme vĂ”ib esineda, ja leida vĂ”imalused teie teeninduskeskkonnas, mis vĂ”imaldavad nende lahendust sujuvalt integreerida. Loodame, et meie lĂ€bipĂ”idud tee aitab teil nĂ€ha ka teie erijuhtumit uute detailide ja mĂ”tetega.
KokkuvÔte
- Varsti vĂ”i hiljem puutub enamik meeskondi kokku registri ĂŒletĂ€itumise probleemiga.
- Otsuste tegemisel tuleb esmalt mÀÀratleda pildikehtivuse kriteeriumid.
- Tuntud konteineriregistrite teenuste pakutavad tööriistad vÔimaldavad organiseerida vÀga lihtsa puhastamise, mis ei arvesta 'vÀlist maailma': Kuberneteses kasutatavad pildid ja meeskonna tööprotsesside eripÀrad.
- Paindlik ja tÔhus algoritm peaks olema teadlik CI/CD protsessidest, hallates mitte ainult Docker-piltide andmeid.
P.S.
Lugege ka meie blogist:
- «»;
- «»;
- «»;
- «».
Allikas: habr.com
