Y broblem o lanhau "smart" o ddelweddau cynhwysydd a'i ateb yn werff

Y broblem o lanhau "smart" o ddelweddau cynhwysydd a'i ateb yn werff

Mae'r erthygl yn trafod problemau glanhau delweddau sy'n cronni mewn cofrestrfeydd cynwysyddion (Cofrestrfa Docker a'i analogau) yn realiti piblinellau CI / CD modern ar gyfer cymwysiadau brodorol cwmwl a ddanfonir i Kubernetes. Rhoddir y prif feini prawf ar gyfer perthnasedd delweddau a'r anawsterau canlyniadol wrth awtomeiddio glanhau, arbed lle a chwrdd ag anghenion timau. Yn olaf, gan ddefnyddio'r enghraifft o brosiect Ffynhonnell Agored penodol, byddwn yn dweud wrthych sut y gellir goresgyn yr anawsterau hyn.

Cyflwyniad

Gall nifer y delweddau mewn cofrestrfa cynhwysydd dyfu'n gyflym, gan gymryd mwy o le storio a thrwy hynny gynyddu ei gost yn sylweddol. Er mwyn rheoli, cyfyngu neu gynnal twf derbyniol o le a feddiannir yn y gofrestrfa, derbynnir:

  1. defnyddio nifer sefydlog o dagiau ar gyfer delweddau;
  2. glanhau'r delweddau mewn rhyw ffordd.


Mae'r cyfyngiad cyntaf weithiau'n dderbyniol ar gyfer timau bach. Os oes gan ddatblygwyr ddigon o dagiau parhaol (latest, main, test, boris ac ati), ni fydd maint y gofrestrfa yn chwyddo ac am amser hir ni fydd yn rhaid i chi feddwl am ei glanhau o gwbl. Wedi'r cyfan, mae'r holl ddelweddau amherthnasol yn cael eu dileu, ac yn syml, nid oes unrhyw waith ar ôl i'w lanhau (mae casglwr sbwriel rheolaidd yn gwneud popeth).

Fodd bynnag, mae'r dull hwn yn cyfyngu'n fawr ar ddatblygiad ac anaml y mae'n berthnasol i brosiectau CI/CD modern. Rhan annatod o'r datblygiad oedd awtomeiddio, sy'n eich galluogi i brofi, defnyddio a chyflwyno swyddogaethau newydd i ddefnyddwyr yn gynt o lawer. Er enghraifft, ym mhob un o'n prosiectau, mae piblinell CI yn cael ei chreu'n awtomatig gyda phob ymrwymiad. Ynddo, mae'r ddelwedd yn cael ei chydosod, ei phrofi, ei chyflwyno i wahanol gylchedau Kubernetes ar gyfer dadfygio a gwiriadau sy'n weddill, ac os yw popeth yn iawn, mae'r newidiadau'n cyrraedd y defnyddiwr terfynol. Ac nid yw hyn bellach yn wyddoniaeth roced, ond yn ddigwyddiad bob dydd i lawer - yn fwyaf tebygol i chi, gan eich bod yn darllen yr erthygl hon.

Gan fod trwsio chwilod a datblygu ymarferoldeb newydd yn cael ei wneud ochr yn ochr, a gellir rhyddhau sawl gwaith y dydd, mae'n amlwg bod nifer sylweddol o ymrwymiadau yn cyd-fynd â'r broses ddatblygu, sy'n golygu nifer fawr o ddelweddau yn y gofrestrfa. O ganlyniad, mae mater trefnu glanhau effeithiol y gofrestrfa yn codi, h.y. cael gwared ar ddelweddau amherthnasol.

Ond sut ydych chi hyd yn oed yn penderfynu a yw delwedd yn berthnasol?

Meini prawf ar gyfer perthnasedd y ddelwedd

Yn y mwyafrif helaeth o achosion, y prif feini prawf fydd:

1. Y cyntaf (yr amlycaf a'r mwyaf beirniadol o'r cwbl) yw y delwau sydd a ddefnyddir ar hyn o bryd yn Kubernetes. Gall tynnu'r delweddau hyn arwain at gostau sylweddol o ran amser segur cynhyrchu (er enghraifft, efallai y bydd angen y delweddau ar gyfer atgynhyrchu) neu gall negyddu ymdrechion y tîm i ddadfygio ar unrhyw un o'r dolenni. (Am y rheswm hwn fe wnaethon ni hyd yn oed arbennig Allforiwr Prometheus, sy'n olrhain absenoldeb delweddau o'r fath mewn unrhyw glwstwr Kubernetes.)

2. Yn ail (llai amlwg, ond hefyd yn bwysig iawn ac eto yn ymwneud â chamfanteisio) - delweddau hynny ei angen ar gyfer dychwelyd rhag ofn y canfyddir problemau difrifol yn y fersiwn gyfredol. Er enghraifft, yn achos Helm, mae'r rhain yn ddelweddau a ddefnyddir mewn fersiynau cadw o'r datganiad. (Gyda llaw, yn ddiofyn yn Helm y terfyn yw 256 o ddiwygiadau, ond mae'n annhebygol y bydd unrhyw un wir angen arbed o'r fath nifer fawr o fersiynau?..) Wedi’r cyfan, rydym ni, yn arbennig, yn storio fersiynau fel y gallwn eu defnyddio yn nes ymlaen, h.y. “rholwch yn ôl” iddyn nhw os oes angen.

3. Trydydd - anghenion datblygwr: Pob delwedd sy'n gysylltiedig â'u gwaith presennol. Er enghraifft, os ydym yn ystyried cysylltiadau cyhoeddus, yna mae'n gwneud synnwyr i adael delwedd sy'n cyfateb i'r ymrwymiad diwethaf a, dyweder, yr ymrwymiad blaenorol: fel hyn gall y datblygwr ddychwelyd yn gyflym i unrhyw dasg a gweithio gyda'r newidiadau diweddaraf.

4. Pedwerydd - delweddau hynny cyfateb i'r fersiynau o'n cais, h.y. yw'r cynnyrch terfynol: v1.0.0, 20.04.01/XNUMX/XNUMX, sierra, ac ati.

DS: Lluniwyd y meini prawf a ddiffinnir yma ar sail profiad o ryngweithio â dwsinau o dimau datblygu o wahanol gwmnïau. Fodd bynnag, wrth gwrs, yn dibynnu ar y manylion yn y prosesau datblygu a'r seilwaith a ddefnyddir (er enghraifft, ni ddefnyddir Kubernetes), gall y meini prawf hyn fod yn wahanol.

Cymhwysedd a datrysiadau presennol

Mae gwasanaethau poblogaidd gyda chofrestrfeydd cynwysyddion, fel rheol, yn cynnig eu polisïau glanhau delwedd eu hunain: ynddynt gallwch chi ddiffinio'r amodau ar gyfer tynnu tag o'r gofrestrfa. Fodd bynnag, mae'r amodau hyn wedi'u cyfyngu gan baramedrau fel enwau, amser creu, a nifer y tagiau *.

* Yn dibynnu ar weithrediadau cofrestrfa cynhwysydd penodol. Fe wnaethom ystyried posibiliadau'r atebion canlynol: Azure CR, Docker Hub, ECR, GCR, Pecynnau GitHub, Cofrestrfa Cynhwysydd GitLab, Cofrestrfa'r Harbwr, JFrog Artifactory, Quay.io - o fis Medi '2020.

Mae'r set hon o baramedrau yn ddigon i fodloni'r pedwerydd maen prawf - hynny yw, i ddewis delweddau sy'n cyfateb i'r fersiynau. Fodd bynnag, ar gyfer yr holl feini prawf eraill, mae'n rhaid i un ddewis rhyw fath o ateb cyfaddawd (polisi llymach neu, i'r gwrthwyneb, yn fwy trugarog) - yn dibynnu ar ddisgwyliadau a galluoedd ariannol.

Er enghraifft, mae'r trydydd maen prawf - sy'n ymwneud ag anghenion datblygwyr - yn gallu cael ei ddatrys trwy drefnu prosesau o fewn timau: enwi delweddau penodol, cynnal rhestrau caniatáu arbennig a chytundebau mewnol. Ond yn y pen draw mae angen ei awtomeiddio o hyd. Ac os nad yw galluoedd datrysiadau parod yn ddigon, mae'n rhaid i chi wneud rhywbeth eich hun.

Mae'r sefyllfa gyda'r ddau faen prawf cyntaf yn debyg: ni ellir eu bodloni heb dderbyn data o system allanol - yr un lle mae ceisiadau'n cael eu defnyddio (Kubernetes yn ein hachos ni).

Darlun o lif gwaith yn Git

Gadewch i ni ddweud eich bod chi'n gweithio rhywbeth fel hyn yn Git:

Y broblem o lanhau "smart" o ddelweddau cynhwysydd a'i ateb yn werff

Mae'r eicon gyda phen yn y diagram yn nodi delweddau cynhwysydd sy'n cael eu defnyddio ar hyn o bryd yn Kubernetes ar gyfer unrhyw ddefnyddwyr (defnyddwyr terfynol, profwyr, rheolwyr, ac ati) neu sy'n cael eu defnyddio gan ddatblygwyr at ddibenion dadfygio a dibenion tebyg.

Beth sy'n digwydd os yw polisïau glanhau ond yn caniatáu i ddelweddau gael eu cadw (nid eu dileu) gan enwau tagiau a roddwyd?

Y broblem o lanhau "smart" o ddelweddau cynhwysydd a'i ateb yn werff

Yn amlwg, ni fydd senario o'r fath yn gwneud unrhyw un yn hapus.

Beth fydd yn newid os bydd polisïau yn caniatáu i beidio â dileu delweddau? yn ôl cyfwng amser penodol / nifer yr ymrwymiadau olaf?

Y broblem o lanhau "smart" o ddelweddau cynhwysydd a'i ateb yn werff

Mae'r canlyniad wedi dod yn llawer gwell, ond mae'n dal i fod ymhell o fod yn ddelfrydol. Wedi'r cyfan, mae gennym ni ddatblygwyr o hyd sydd angen delweddau yn y gofrestrfa (neu hyd yn oed eu defnyddio yn K8s) i ddadfygio bygiau ...

I grynhoi sefyllfa bresennol y farchnad: nid yw'r swyddogaethau sydd ar gael mewn cofrestrfeydd cynwysyddion yn cynnig digon o hyblygrwydd wrth lanhau, a'r prif reswm am hyn yw dim ffordd o ryngweithio â'r byd y tu allan. Mae'n ymddangos bod timau sydd angen hyblygrwydd o'r fath yn cael eu gorfodi i weithredu dileu delwedd yn annibynnol “o'r tu allan”, gan ddefnyddio API Cofrestrfa Docker (neu API brodorol y gweithrediad cyfatebol).

Fodd bynnag, roeddem yn chwilio am ateb cyffredinol a fyddai'n awtomeiddio glanhau delweddau ar gyfer gwahanol dimau gan ddefnyddio gwahanol gofrestrfeydd ...

Ein llwybr i lanhau delweddau cyffredinol

O ble mae'r angen hwn yn dod? Y ffaith yw nad ydym yn grŵp ar wahân o ddatblygwyr, ond yn dîm sy'n gwasanaethu llawer ohonynt ar unwaith, gan helpu i ddatrys materion CI/CD yn gynhwysfawr. A'r prif offeryn technegol ar gyfer hyn yw'r cyfleustodau Ffynhonnell Agored werff. Ei hynodrwydd yw nad yw'n cyflawni un swyddogaeth, ond mae'n cyd-fynd â phrosesau cyflwyno parhaus ar bob cam: o'r cynulliad i'r defnydd.

Mae cyhoeddi delweddau i'r gofrestrfa* (yn syth ar ôl iddynt gael eu hadeiladu) yn swyddogaeth amlwg i gyfleustodau o'r fath. A chan fod y delweddau'n cael eu gosod yno i'w storio, yna - os nad yw'ch storfa yn ddiderfyn - mae angen i chi fod yn gyfrifol am eu glanhau wedyn. Bydd sut y llwyddwyd i gyflawni hyn, gan fodloni'r holl feini prawf penodedig, yn cael ei drafod ymhellach.

* Er y gall y cofrestrfeydd eu hunain fod yn wahanol (Cofrestrfa Docker, Cofrestrfa Cynhwysydd GitLab, Harbwr, ac ati), mae eu defnyddwyr yn wynebu'r un problemau. Nid yw'r ateb cyffredinol yn ein hachos ni yn dibynnu ar weithrediad y gofrestrfa, oherwydd yn rhedeg y tu allan i'r cofrestrfeydd eu hunain ac yn cynnig yr un ymddygiad i bawb.

Er ein bod yn defnyddio werff fel enghraifft o weithredu, rydym yn gobeithio y bydd y dulliau a ddefnyddir yn ddefnyddiol i dimau eraill sy'n wynebu anawsterau tebyg.

Felly aethon ni'n brysur allanol gweithredu mecanwaith ar gyfer glanhau delweddau - yn lle'r galluoedd hynny sydd eisoes wedi'u cynnwys mewn cofrestrfeydd ar gyfer cynwysyddion. Y cam cyntaf oedd defnyddio API Cofrestrfa Docker i greu'r un polisïau cyntefig ar gyfer nifer y tagiau ac amser eu creu (a grybwyllir uchod). Ychwanegwyd atynt caniatáu rhestr yn seiliedig ar ddelweddau a ddefnyddir mewn seilwaith a ddefnyddir, h.y. Kubernetes. Ar gyfer yr olaf, roedd yn ddigon i ddefnyddio'r Kubernetes API i ailadrodd trwy'r holl adnoddau a ddefnyddiwyd a chael rhestr o werthoedd image.

Datrysodd yr ateb dibwys hwn y broblem fwyaf hanfodol (maen prawf Rhif 1), ond dim ond dechrau ein taith i wella'r mecanwaith glanhau ydoedd. Y cam nesaf - a llawer mwy diddorol - oedd y penderfyniad cysylltu delweddau cyhoeddedig â hanes Git.

Cynlluniau tagio

I ddechrau, fe wnaethom ddewis dull lle dylai'r ddelwedd derfynol storio'r wybodaeth angenrheidiol ar gyfer glanhau, ac adeiladu'r broses ar gynlluniau tagio. Wrth gyhoeddi delwedd, dewisodd y defnyddiwr opsiwn tagio penodol (git-branch, git-commit neu git-tag) a defnyddiodd y gwerth cyfatebol. Mewn systemau CI, gosodwyd y gwerthoedd hyn yn awtomatig yn seiliedig ar newidynnau amgylchedd. Yn wir roedd y ddelwedd derfynol yn gysylltiedig â Git gyntefig penodol, storio'r data angenrheidiol ar gyfer glanhau mewn labeli.

Arweiniodd y dull hwn at set o bolisïau a oedd yn caniatáu i Git gael ei ddefnyddio fel un ffynhonnell gwirionedd:

  • Wrth ddileu cangen/tag yn Git, cafodd y delweddau cysylltiedig yn y gofrestrfa eu dileu'n awtomatig.
  • Gellid rheoli nifer y delweddau sy'n gysylltiedig â thagiau Git ac ymrwymiadau gan nifer y tagiau a ddefnyddiwyd yn y sgema a ddewiswyd a'r amser y crëwyd y ymrwymiad cysylltiedig.

Ar y cyfan, roedd y gweithredu dilynol yn bodloni ein hanghenion, ond roedd her newydd yn ein disgwyl yn fuan. Y ffaith yw, wrth ddefnyddio cynlluniau tagio ar sail cyntefig Git, daethom ar draws nifer o ddiffygion. (Gan fod eu disgrifiad y tu hwnt i gwmpas yr erthygl hon, gall pawb ymgyfarwyddo â'r manylion yma.) Felly, ar ôl penderfynu newid i ddull mwy effeithlon o dagio (tagio seiliedig ar gynnwys), bu'n rhaid i ni ailystyried gweithredu glanhau delweddau.

Algorithm newydd

Pam? Gyda thagio sy'n seiliedig ar gynnwys, gall pob tag fodloni sawl ymrwymiad yn Git. Wrth lanhau delweddau, ni allwch gymryd yn ganiataol mwyach yn unig o'r ymrwymiad lle ychwanegwyd y tag newydd at y gofrestr.

Ar gyfer yr algorithm glanhau newydd, penderfynwyd symud i ffwrdd o gynlluniau tagio ac adeiladu proses meta-ddelwedd, gyda phob un yn storio criw o:

  • y ymrwymiad y cyflawnwyd y cyhoeddiad arno (nid oes gwahaniaeth a ychwanegwyd, newidiwyd neu arhosodd y ddelwedd yr un fath yn y gofrestr cynhwysydd);
  • a'n dynodydd mewnol yn cyfateb i'r ddelwedd a gasglwyd.

Mewn geiriau eraill, fe'i darparwyd cysylltu tagiau cyhoeddedig ag ymrwymiadau yn Git.

Cyfluniad terfynol ac algorithm cyffredinol

Wrth ffurfweddu glanhau, mae gan ddefnyddwyr bellach fynediad at bolisïau sy'n dewis delweddau cyfredol. Mae pob polisi o’r fath wedi’i ddiffinio:

  • llawer o gyfeiriadau, h.y. Tagiau git neu ganghennau Git a ddefnyddir yn ystod sganio;
  • a chyfyngiad y delweddau a chwiliwyd ar gyfer pob cyfeiriad o'r set.

I ddangos, dyma sut y dechreuodd y cyfluniad polisi diofyn edrych:

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

Mae'r cyfluniad hwn yn cynnwys tri pholisi sy'n cydymffurfio â'r rheolau canlynol:

  1. Arbedwch y ddelwedd ar gyfer y 10 tag Git diwethaf (yn ôl dyddiad creu tag).
  2. Arbedwch ddim mwy na 2 ddelwedd a gyhoeddwyd yn ystod yr wythnos ddiwethaf am ddim mwy na 10 edefyn gyda gweithgaredd yn ystod yr wythnos ddiwethaf.
  3. Arbed 10 delwedd ar gyfer canghennau main, staging и production.

Mae'r algorithm terfynol yn canolbwyntio ar y camau canlynol:

  • Adalw maniffestau o gofrestrfa cynhwysyddion.
  • Ac eithrio delweddau a ddefnyddir yn Kubernetes, oherwydd Rydym eisoes wedi eu dewis ymlaen llaw trwy bleidleisio ar yr API K8s.
  • Sganio hanes Git ac eithrio delweddau yn seiliedig ar bolisïau penodedig.
  • Tynnu'r delweddau sy'n weddill.

Gan ddychwelyd at ein darlun, dyma beth sy'n digwydd gyda wern:

Y broblem o lanhau "smart" o ddelweddau cynhwysydd a'i ateb yn werff

Fodd bynnag, hyd yn oed os nad ydych yn defnyddio werff, gellir defnyddio dull tebyg o lanhau delweddau uwch - mewn un gweithrediad neu'r llall (yn ôl y dull a ffefrir o dagio delweddau) - i systemau/cyfleustodau eraill. I wneud hyn, mae'n ddigon cofio'r problemau sy'n codi a dod o hyd i'r cyfleoedd hynny yn eich pentwr sy'n eich galluogi i integreiddio eu datrysiad mor llyfn â phosibl. Gobeithiwn y bydd y llwybr yr ydym wedi ei deithio yn eich helpu i edrych ar eich achos penodol gyda manylion a meddyliau newydd.

Casgliad

  • Yn hwyr neu'n hwyrach, mae'r rhan fwyaf o dimau yn dod ar draws problem gorlif y gofrestrfa.
  • Wrth chwilio am atebion, yn gyntaf mae angen pennu'r meini prawf ar gyfer perthnasedd y ddelwedd.
  • Mae'r offer a gynigir gan wasanaethau cofrestru cynwysyddion poblogaidd yn caniatáu ichi drefnu glanhau syml iawn nad yw'n ystyried y “byd y tu allan”: y delweddau a ddefnyddir yn Kubernetes a hynodion llif gwaith y tîm.
  • Rhaid i algorithm hyblyg ac effeithlon feddu ar ddealltwriaeth o brosesau CI/CD a gweithredu nid yn unig gyda data delwedd Docker.

PS

Darllenwch hefyd ar ein blog:

Ffynhonnell: hab.com

Ychwanegu sylw