Pwoblèm nan netwayaj "entelijan" nan imaj veso ak solisyon li yo nan werf

Pwoblèm nan netwayaj "entelijan" nan imaj veso ak solisyon li yo nan werf

Atik la diskite pwoblèm yo nan netwayaj imaj ki akimile nan rejis veso (Docker Rejis ak analogue li yo) nan reyalite yo nan tiyo modèn CI/CD pou aplikasyon nwaj natif natal lage nan Kubernetes. Yo bay kritè prensipal yo pou enpòtans imaj yo ak difikilte ki lakòz yo nan otomatize netwayaj, ekonomize espas ak satisfè bezwen ekip yo. Finalman, sèvi ak egzanp yon pwojè Open Source espesifik, nou pral di w ki jan difikilte sa yo ka simonte.

Entwodiksyon

Kantite imaj nan yon rejis veso ka grandi rapidman, pran plis espas depo e konsa siyifikativman ogmante pri li yo. Pou kontwole, limite oswa kenbe kwasans akseptab nan espas ki okipe nan rejis la, li aksepte:

  1. sèvi ak yon kantite fiks tags pou imaj;
  2. netwaye imaj yo nan kèk fason.


Premye limit la pafwa akseptab pou ti ekip yo. Si devlopè yo gen ase tag pèmanan (latest, main, test, boris elatriye), rejis la pa pral anfle nan gwosè epi pou yon tan long ou pa pral oblije reflechi sou netwaye li nan tout. Apre yo tout, tout imaj ki pa enpòtan yo efase, epi tou senpleman pa gen okenn travay kite pou netwaye (tout se fè pa yon pèseptè fatra regilye).

Sepandan, apwòch sa a limite anpil devlopman epi li raman aplikab nan pwojè CI/CD modèn. Yon pati entegral nan devlopman an te automatisation, ki pèmèt ou teste, deplwaye ak delivre nouvo fonksyonalite itilizatè yo pi vit. Pou egzanp, nan tout pwojè nou yo, yo kreye yon tiyo CI otomatikman ak chak komèt. Nan li, imaj la reyini, teste, woule soti nan divès sikwi Kubernetes pou debogaj ak chèk ki rete yo, epi si tout se byen, chanjman yo rive nan itilizatè final la. Lè sa a se pa syans fize ankò, men yon ensidan chak jou pou anpil moun - gen plis chans pou ou, depi w ap li atik sa a.

Depi ranje ensèk ak devlope nouvo fonksyonalite fèt an paralèl, ak degaje yo ka fèt plizyè fwa nan yon jounen, li evidan ke pwosesis devlopman an akonpaye pa yon kantite siyifikatif nan komèt, ki vle di. yon gwo kantite imaj nan rejis la. Kòm yon rezilta, pwoblèm nan nan òganize netwayaj efikas nan rejis la rive, i.e. retire imaj ki pa enpòtan.

Men, ki jan ou menm detèmine si yon imaj enpòtan?

Kritè pou enpòtans imaj la

Nan vas majorite ka yo, kritè prensipal yo pral:

1. Premye a (ki pi evidan ak pi kritik nan tout) se imaj yo ki kounye a itilize nan Kubernetes. Retire imaj sa yo ka lakòz gwo depans D' pwodiksyon (pa egzanp, imaj yo ka nesesè pou replikasyon) oswa anile efò ekip la debogaj sou nenpòt nan bouk yo. (Pou rezon sa a nou menm te fè yon espesyal Ekspòtatè Prometheus, ki swiv absans imaj sa yo nan nenpòt gwoup Kubernetes.)

2. Dezyèm (mwens evidan, men tou trè enpòtan ak ankò gen rapò ak eksplwatasyon) - imaj ki obligatwa pou rollback nan ka deteksyon pwoblèm grav nan vèsyon aktyèl la. Pou egzanp, nan ka Helm, sa yo se imaj ki itilize nan vèsyon sove nan liberasyon an. (Bon wout la, pa default nan Helm limit la se 256 revizyon, men li fasil ke nenpòt moun reyèlman bezwen sove. tankou yon yon gwo kantite vèsyon?..) Apre yo tout, nou, an patikilye, sere vèsyon pou nou ka itilize yo pita, i.e. "retounen" ba yo si sa nesesè.

3. Twazyèm - bezwen pwomotè: Tout imaj ki gen rapò ak travay aktyèl yo. Pou egzanp, si nou ap konsidere yon PR, Lè sa a, li fè sans yo kite yon imaj ki koresponn ak dènye komèt la ak, di, komèt anvan an: fason sa a pwomotè a ka byen vit retounen nan nenpòt travay epi travay ak dènye chanjman yo.

4. Katriyèm - imaj ki koresponn ak vèsyon aplikasyon nou an, i.e. se pwodwi final la: v1.0.0, 20.04.01/XNUMX/XNUMX, sierra, elatriye.

NB: Kritè yo defini isit la te fòmile baze sou eksperyans kominike avèk plizyè douzèn ekip devlopman ki soti nan konpayi diferan. Sepandan, nan kou, tou depann de spesifik yo nan pwosesis devlopman yo ak enfrastrikti yo itilize (pa egzanp, Kubernetes pa itilize), kritè sa yo ka diferan.

Elijiblite ak solisyon ki egziste deja

Sèvis popilè ak rejis veso yo, kòm yon règ, ofri pwòp politik netwayaj imaj yo: nan yo ou ka defini kondisyon ki anba ki yon tag yo retire nan rejis la. Sepandan, kondisyon sa yo limite pa paramèt tankou non, tan kreyasyon, ak kantite tags*.

* Depann sou aplikasyon rejis veso espesifik. Nou konsidere posiblite solisyon sa yo: Azure CR, Docker Hub, ECR, GCR, GitHub Packages, GitLab Container Rejis, Harbour Registry, JFrog Artifactory, Quay.io - apati septanm 2020.

Sa a seri paramèt se ase ase pou satisfè katriyèm kritè a - se sa ki, yo chwazi imaj ki koresponn ak vèsyon yo. Sepandan, pou tout lòt kritè, yonn gen pou chwazi yon jan de solisyon konpwomi (yon politik pi di ou, Okontrè, plis indulgent) - selon attentes Et finansye kapasite.

Pou egzanp, twazyèm kritè a - ki gen rapò ak bezwen yo nan devlopè - ka rezoud pa òganize pwosesis nan ekip: nonmen espesifik nan imaj, kenbe espesyal pèmèt lis ak akò entèn yo. Men, finalman li toujou bezwen otomatize. Men, si kapasite yo nan solisyon pare yo pa ase, ou dwe fè yon bagay nan pwòp ou yo.

Sitiyasyon an ak de premye kritè yo sanble: yo pa ka satisfè san yo pa resevwa done ki sòti nan yon sistèm ekstèn - youn nan kote aplikasyon yo deplwaye (nan ka nou an, Kubernetes).

Ilistrasyon workflow nan Git

Ann di w ap travay yon bagay tankou sa a nan Git:

Pwoblèm nan netwayaj "entelijan" nan imaj veso ak solisyon li yo nan werf

Ikòn ki gen yon tèt nan dyagram nan endike imaj veso ki kounye a deplwaye nan Kubernetes pou nenpòt itilizatè (itilizatè final, tèsteur, administratè, elatriye) oswa yo itilize pa devlopè pou debogaj ak rezon menm jan an.

Kisa k ap pase si règleman netwayaj sèlman pèmèt imaj yo dwe konsève (pa efase) pa bay non tag?

Pwoblèm nan netwayaj "entelijan" nan imaj veso ak solisyon li yo nan werf

Li evidan, yon senaryo konsa pa pral fè pèsonn kontan.

Ki sa ki pral chanje si règleman yo pèmèt imaj yo pa dwe efase? dapre yon entèval tan bay / kantite dènye komèt?

Pwoblèm nan netwayaj "entelijan" nan imaj veso ak solisyon li yo nan werf

Rezilta a vin pi bon, men li toujou lwen ideyal. Apre yo tout, nou toujou gen devlopè ki bezwen imaj nan rejis la (oswa menm deplwaye nan K8s) pou debogaj pinèz ...

Pou rezime sitiyasyon aktyèl la sou mache a: fonksyon ki disponib nan rejis veso yo pa ofri ase fleksibilite lè netwaye, e rezon prensipal pou sa a se pa gen okenn fason yo kominike ak mond lan deyò. Li sanble ke ekip ki mande pou fleksibilite sa yo fòse yo aplike endepandamman sipresyon imaj "soti nan deyò a", lè l sèvi avèk Docker Rejis API a (oswa API natif natal nan aplikasyon ki koresponn lan).

Sepandan, nou t ap chèche yon solisyon inivèsèl ki ta otomatize netwayaj imaj pou diferan ekip lè l sèvi avèk diferan rejis...

Chemen nou nan netwayaj imaj inivèsèl

Ki kote bezwen sa a soti? Reyalite a se ke nou pa yon gwoup separe nan devlopè, men yon ekip ki sèvi anpil nan yo nan yon fwa, ede yo konplè rezoud pwoblèm CI/CD. Ak zouti prensipal la teknik pou sa a se sèvis piblik Open Source werf. Espesyalite li se ke li pa fè yon sèl fonksyon, men li akonpaye pwosesis livrezon kontinyèl nan tout etap: soti nan asanble deplwaman.

Pibliye imaj nan rejis la* (tousuit apre yo fin bati yo) se yon fonksyon evidan nan yon sèvis piblik konsa. Epi depi imaj yo mete la pou depo, Lè sa a, - si depo ou a pa san limit - ou bezwen responsab pou netwaye ki vin apre yo. Ki jan nou reyalize siksè nan sa a, satisfè tout kritè yo espesifye, yo pral diskite pi lwen.

* Malgre ke rejis yo tèt yo ka diferan (Docker Rejis, GitLab Container Rejis, Harbour, elatriye), itilizatè yo fè fas a menm pwoblèm yo. Solisyon an inivèsèl nan ka nou an pa depann de aplikasyon an nan rejis la, paske kouri deyò nan rejis yo tèt yo epi li ofri menm konpòtman an pou tout moun.

Malgre ke nou ap itilize werf kòm yon egzanp aplikasyon, nou espere ke apwòch yo itilize yo pral itil nan lòt ekip ki fè fas ak difikilte menm jan an.

Se konsa, nou te okipe ekstèn aplikasyon yon mekanis pou netwaye imaj - olye pou yo kapasite sa yo ki deja bati nan rejis pou resipyan yo. Premye etap la se te sèvi ak API Rejis Docker pou kreye menm politik primitif pou kantite tags ak tan kreyasyon yo (mansyone pi wo a). Te ajoute nan yo pèmèt lis ki baze sou imaj yo itilize nan enfrastrikti deplwaye, i.e. Kubernetes. Pou lèt la, li te ase yo sèvi ak Kubernetes API a iterasyon atravè tout resous deplwaye epi jwenn yon lis valè. image.

Solisyon trivial sa a rezoud pwoblèm ki pi kritik (kritè nimewo 1), men li te sèlman kòmansman vwayaj nou an pou amelyore mekanis netwayaj la. Pwochen - ak pi enteresan - etap la se te desizyon an asosye imaj pibliye ak istwa Git.

Tagging rapid

Pou kòmanse, nou te chwazi yon apwòch nan ki imaj final la ta dwe estoke enfòmasyon ki nesesè pou netwaye, ak bati pwosesis la sou plan tagging. Lè yo pibliye yon imaj, itilizatè a chwazi yon opsyon tag espesifik (git-branch, git-commit oswa git-tag) epi itilize valè ki koresponn lan. Nan sistèm CI, valè sa yo te etabli otomatikman baze sou varyab anviwònman an. An reyalite imaj final la te asosye ak yon espesifik Git primitif, estoke done ki nesesè pou netwaye nan etikèt.

Apwòch sa a te lakòz yon seri règleman ki pèmèt Git yo dwe itilize kòm yon sèl sous laverite:

  • Lè w ap efase yon branch/tag nan Git, imaj ki asosye yo nan rejis la te otomatikman efase.
  • Kantite imaj ki asosye ak tag Git ak komite yo ta ka kontwole pa kantite tag yo itilize nan chema chwazi a ak lè yo te kreye komite ki asosye a.

An jeneral, aplikasyon an ki te lakòz satisfè bezwen nou yo, men yon nouvo defi byento t ap tann nou. Reyalite a se ke pandan w ap itilize plan tagging ki baze sou primitif Git, nou te rankontre yon kantite enpèfeksyon. (Depi deskripsyon yo depase sijè ki abòde lan atik sa a, tout moun ka familyarize tèt yo ak detay yo isit la.) Se poutèt sa, li te deside chanje nan yon apwòch pi efikas nan balisage (balisage ki baze sou kontni), nou te oblije rekonsidere aplikasyon an nan netwayaj imaj.

Nouvo algorithm

Poukisa? Avèk tag ki baze sou kontni, chak tag ka satisfè plizyè komèt nan Git. Lè w netwaye imaj, ou pa ka asime ankò sèlman soti nan komite kote nouvo tag la te ajoute nan rejis la.

Pou nouvo algorithm netwayaj la, li te deside pou avanse pou pi lwen balisaj rapid ak bati pwosesis meta-imaj, chak nan ki estoke yon pakèt moun:

  • komite piblikasyon an te fèt (pa gen pwoblèm si imaj la te ajoute, chanje oswa rete menm jan an nan rejis veso a);
  • ak idantifyan entèn nou an ki koresponn ak imaj la reyini.

Nan lòt mo, li te bay ki lye tag pibliye ak komite nan Git.

Final konfigirasyon ak algorithm jeneral

Lè konfigirasyon netwayaj, itilizatè yo kounye a gen aksè a règleman ki chwazi imaj aktyèl yo. Chak politik sa yo defini:

  • anpil referans, i.e. Tag Git oswa branch Git ke yo itilize pandan optik;
  • ak limit la nan imaj rechèch pou chak referans nan seri a.

Pou ilistre, sa a se konfigirasyon politik default la te kòmanse sanble:

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

Konfigirasyon sa a gen twa politik ki respekte règ sa yo:

  1. Sove imaj la pou 10 dènye tags Git yo (pa dat kreyasyon tag).
  2. Sove pa plis pase 2 imaj ki te pibliye nan semèn pase a pou pa plis pase 10 fil ak aktivite nan semèn pase a.
  3. Sove 10 imaj pou branch yo main, staging и production.

Algorithm final la desann nan etap sa yo:

  • Rekipere manifest nan rejis veso.
  • Eksepte imaj yo itilize nan Kubernetes, paske Nou te deja pre-seleksyon yo pa sondaj API K8s la.
  • Analize istwa Git ak eksklizyon imaj ki baze sou règleman espesifye.
  • Retire imaj ki rete yo.

Retounen nan egzanp nou an, sa a se sa k ap pase ak werf:

Pwoblèm nan netwayaj "entelijan" nan imaj veso ak solisyon li yo nan werf

Sepandan, menm si ou pa sèvi ak werf, yon apwòch ki sanble ak netwayaj imaj avanse - nan yon aplikasyon oswa yon lòt (dapre apwòch la pi pito nan etikèt imaj) - ka aplike nan lòt sistèm / sèvis piblik. Pou fè sa, li se ase sonje pwoblèm yo ki leve epi jwenn opòtinite sa yo nan chemine ou a ki pèmèt ou entegre solisyon yo san pwoblèm ke posib. Nou espere ke chemen nou te vwayaje a ap ede ou gade nan ka patikilye ou a ak nouvo detay ak panse.

Konklizyon

  • Pi bonè oswa pita, pifò ekip yo rankontre pwoblèm nan debòde rejis la.
  • Lè w ap chèche solisyon, li nesesè premye detèmine kritè yo pou enpòtans imaj la.
  • Zouti yo ofri nan sèvis rejis veso popilè pèmèt ou òganize yon netwayaj trè senp ki pa pran an kont "mond deyò a": imaj yo itilize nan Kubernetes ak sengularite yo nan workflow ekip la.
  • Yon algorithm fleksib ak efikas dwe gen yon konpreyansyon sou pwosesis CI/CD epi opere pa sèlman ak done imaj Docker.

PS

Li tou sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè