{"id":96065,"date":"2020-10-07T13:42:09","date_gmt":"2020-10-07T11:42:09","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf"},"modified":"2020-10-07T13:42:09","modified_gmt":"2020-10-07T11:42:09","slug":"problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf","status":"publish","type":"post","link":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf","title":{"rendered":"Problemet med \"intelligent\" oprydning af containerbilleder og l\u00f8sningen i werf","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Problemet med &quot;intelligent&quot; oprydning af containerbilleder og l\u00f8sningen i werf\" src=\"\/wp-content\/uploads\/2020\/10\/1410cea46bb8dcdc3ac06db11ed5a402.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nArtiklen diskuterer problematikken omkring rydning af billeder, der ophobes i containerregistere (Docker Registry og lignende) i realiteten af moderne CI\/CD-pipelines til cloud native-applikationer, der leveres til Kubernetes. Der gives en oversigt over de vigtigste kriterier for relevans af billeder og de f\u00f8lgende vanskeligheder ved automatisering af rydning, pladsering og opfyldelse af teamenes behov. Endelig vil vi p\u00e5 baggrund af et specifikt Open Source-projekt forklare, hvordan man kan overvinde disse vanskeligheder.<\/p>\n<h2>Introduktion<\/h2>\n<p>\nAntallet af billeder i containerregistret kan hurtigt vokse, hvilket optager mere plads i lageret og dermed \u00f8ger omkostningerne betydeligt. For at kontrollere, begr\u00e6nse eller opretholde en acceptabel v\u00e6kst af den plads, der bruges i registreret, er det almindeligt at:<\/p>\n<ol>\n<li>bruge et fast antal tags til billeder;<\/li>\n<li>rydde billeder p\u00e5 en eller anden m\u00e5de.<\/li>\n<\/ol>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nDen f\u00f8rste begr\u00e6nsning er nogle gange acceptabel for sm\u00e5 teams. Hvis udviklerne klarer sig med faste tags (<code>latest<\/code>, <code>main<\/code>, <code>test<\/code>, <code>boris<\/code> og s\u00e5 videre), vil registret ikke vokse i st\u00f8rrelse, og man kan i lang tid slet ikke bekymre sig om rydning. For alle irrelevante billeder overskrives, s\u00e5 der for rydning simpelthen ikke er noget arbejde (alt g\u00f8res af den indbyggede affaldscollector).<\/p>\n<p>Alligevel begr\u00e6nser denne tilgang udviklingen betydeligt og er sj\u00e6ldent anvendelig i moderne CI\/CD-oplevelser. En uundg\u00e5elig del af udviklingen er <strong>automatisering<\/strong>, som g\u00f8r det muligt at teste, implementere og levere ny funktionalitet til brugerne meget hurtigere. For eksempel oprettes der i alle vores projekter automatisk en CI-pipeline ved hvert commit. Her samles et billede, testes, deployeres til forskellige Kubernetes-milj\u00f8er for fejlfinding og resterende checks, og hvis alt g\u00e5r godt, n\u00e5r \u00e6ndringerne frem til den endelige bruger. Og det er ikke l\u00e6ngere raketvidenskab, men en hverdag for mange \u2013 sandsynligvis ogs\u00e5 for dig, siden du l\u00e6ser denne artikel.<\/p>\n<p>Da fejlrettelse og udvikling af ny funktionalitet foreg\u00e5r parallelt, og udgivelser kan finde sted flere gange om dagen, er det \u00e5benlyst, at udviklingsprocessen ledsages af et v\u00e6sentligt antal commits, og dermed \u2013 <strong>et stort antal billeder i registreret<\/strong>. Som resultat opst\u00e5r der et presserende sp\u00f8rgsm\u00e5l om, hvordan man effektivt organiserer rydning af registreret, dvs. sletning af irrelevante billeder.<\/p>\n<p>Men hvordan bestemmer man overhovedet, om et billede er aktuelt?<\/p>\n<h2>Relevanskriterier for billeder<\/h2>\n<p>\nI langt de fleste tilf\u00e6lde vil de prim\u00e6re kriterier v\u00e6re som f\u00f8lger:<\/p>\n<p>1. Det f\u00f8rste (det mest \u00e5benlyse og det mest kritiske af alle) \u2014 er billederne, der <strong>er i \u00f8jeblikket i brug i Kubernetes<\/strong>. Fjernelse af disse billeder kan f\u00f8re til alvorlige omkostninger p\u00e5 grund af nedetid i produktionen (for eksempel kan billederne v\u00e6re n\u00f8dvendige ved replikation) eller aflyse bestr\u00e6belserne fra teamet, der arbejder med fejlfinding p\u00e5 en af konturerne. <i>(Af denne grund har vi endda lavet en s\u00e6rlig <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/k8s-image-availability-exporter\"><i>Prometheus-export\u00f8r<\/i><\/a><\/noindex><i>, som overv\u00e5ger frav\u00e6ret af s\u00e5danne billeder i enhver Kubernetes-klynge.)<\/i><\/p>\n<p>2. Det andet (mindre \u00e5benlyse, men ogs\u00e5 meget vigtige og igen relaterer sig til driften) \u2014 er billederne, der <strong>er n\u00f8dvendige for at rulle tilbage i tilf\u00e6lde af alvorlige problemer<\/strong> i den nuv\u00e6rende version. For eksempel, i tilf\u00e6lde af Helm er det billederne, der anvendes i de gemte versioner af udgivelsen. (Desuden, som standard i Helm er der en gr\u00e6nse p\u00e5 256 revisioner, men sj\u00e6ldent vil nogen virkelig have brug for at bevare <i>s\u00e5dan<\/i> et stort antal versioner?..) For netop det form\u00e5l gemmer vi versioner, s\u00e5 de kan bruges senere, dvs. at \"rulle tilbage\" til dem ved behov.<\/p>\n<p>3. Det tredje \u2014 <strong>udviklernes behov<\/strong>: alle billeder, der relaterer sig til deres aktuelle arbejde. For eksempel, hvis vi betragter en PR, giver det mening at beholde det billede, der svarer til den seneste commit samt den forrige commit: s\u00e5ledes kan udvikleren hurtigt vende tilbage til enhver opgave og arbejde med de seneste \u00e6ndringer. <\/p>\n<p>4. Det fjerde \u2014 billederne, der <strong>svarer til versionerne af vores applikation<\/strong>, dvs. er det endelige produkt: v1.0.0, 20.04.01, sierra osv.<\/p>\n<p>NB: De kriterier, der er formuleret her, er baseret p\u00e5 erfaring fra samarbejdet med adskillige udviklingsteams fra forskellige virksomheder. Men selvf\u00f8lgelig kan disse kriterier variere afh\u00e6ngigt af s\u00e6regenhederne i udviklingsprocesserne og den anvendte infrastruktur (f.eks. hvis Kubernetes ikke bruges). <\/p>\n<h2>Overholdelse af kriterierne og eksisterende l\u00f8sninger<\/h2>\n<p>\nPopul\u00e6re tjenester med container registry tilbyder som regel deres politikker for oprydning af billeder: i dem kan du definere betingelserne, under hvilke en tag fjernes fra registreringen. Men mulighederne for disse betingelser begr\u00e6nses af parametre som navne, oprettelsestidspunkt og antal tags*.<\/p>\n<p><i>* Afh\u00e6nger af de specifikke implementeringer af containerregistrering. Vi har unders\u00f8gt mulighederne for f\u00f8lgende l\u00f8sninger: Azure CR, Docker Hub, ECR, GCR, GitHub Packages, GitLab Container Registry, Harbor Registry, JFrog Artifactory, Quay.io \u2014 pr. september 2020.<\/i><\/p>\n<p>Denne samling af parametre er helt tilstr\u00e6kkelig til at opfylde det fjerde kriterium \u2014 det vil sige at v\u00e6lge billeder, der svarer til versioner. Men for alle andre kriterier skal man finde en kompromisl\u00f8sning (mere streng eller derimod g\u00e6ngs politik) \u2014 afh\u00e6ngigt af forventninger og \u00f8konomiske muligheder.<\/p>\n<p>For eksempel kan det tredje kriterium \u2014 relateret til udviklernes behov \u2014 l\u00f8ses ved at organisere processer inden for teamerne: specifik navngivning af billeder, f\u00f8ring af specielle allow lists og interne aftaler. Men i sidste ende skal det stadig automatiseres. Hvis de eksisterende l\u00f8sninger ikke er tilstr\u00e6kkelige, er man n\u00f8dt til at lave noget eget.<\/p>\n<p>Det samme g\u00e6lder de to f\u00f8rste kriterier: de kan ikke opfyldes uden at modtage data fra et eksternt system \u2014 det system, hvor applikationer implementeres (i vores tilf\u00e6lde er det Kubernetes).<\/p>\n<h3>Illustration af workflow i Git<\/h3>\n<p>\nLad os antage, at du arbejder efter denne skema i Git:<\/p>\n<p><img decoding=\"async\" alt=\"Problemet med &quot;intelligent&quot; oprydning af containerbilleder og l\u00f8sningen i werf\" src=\"\/wp-content\/uploads\/2020\/10\/45c9bfb6755da1b4d6be05b51ab17429.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ikonet med hovedet p\u00e5 skemaet markerer de containerbilleder, der i \u00f8jeblikket er implementeret i Kubernetes for nogle brugere (slutbrugere, testere, ledere osv.) eller bruges af udviklere til fejls\u00f8gning og lignende form\u00e5l.<\/i><\/p>\n<p>Hvad sker der, hvis oprydningspolitikkerne tillader at efterlade (ikke slette) billeder kun <b>i henhold til bestemte tag-navne<\/b>?<\/p>\n<p><img decoding=\"async\" alt=\"Problemet med &quot;intelligent&quot; oprydning af containerbilleder og l\u00f8sningen i werf\" src=\"\/wp-content\/uploads\/2020\/10\/e57ff24cb818799d28e8eb006aea2eb5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c5benlyst, vil et s\u00e5dant scenarie ikke gl\u00e6de nogen.<\/p>\n<p>Hvad \u00e6ndrer sig, hvis politikkerne tillader ikke at slette billeder <b>i henhold til et bestemt tidsinterval \/ antal seneste commits<\/b>?<\/p>\n<p><img decoding=\"async\" alt=\"Problemet med &quot;intelligent&quot; oprydning af containerbilleder og l\u00f8sningen i werf\" src=\"\/wp-content\/uploads\/2020\/10\/7743581e6e64affb0a207ee156c00f6e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nResultatet er blevet markant bedre, men er stadig langt fra idealt. For vi har stadig udviklere, der har brug for billeder i registry (eller endda implementeret i K8s) til fejls\u00f8gning af fejl\u2026<\/p>\n<p>For at opsummere den nuv\u00e6rende situation p\u00e5 markedet: de tilg\u00e6ngelige funktioner i containerregistrene tilbyder ikke tilstr\u00e6kkelig fleksibilitet ved oprydning, og den hoved\u00e5rsag er \u2014 <strong>manglen p\u00e5 mulighed for at interagere med den eksterne verden.<\/strong>. Det viser sig, at teams, der har brug for s\u00e5dan fleksibilitet, er n\u00f8dt til selv at implementere eliminering af billeder \"udefra\" ved at bruge Docker Registry API (eller det tilsvarende native API).<\/p>\n<p>Men vi har ledt efter en universel l\u00f8sning, der ville automatisere oprydningen af billeder for forskellige teams, der bruger forskellige registre\u2026<\/p>\n<h2>Vores vej til universel oprydning af billeder<\/h2>\n<p>\nHvorfor er der s\u00e5dan et behov? Det skyldes, at vi ikke er en enkeltst\u00e5ende gruppe udviklere, men et team, der betjener adskillige s\u00e5danne grupper og hj\u00e6lper med at l\u00f8se CI\/CD-udfordringer. Og det vigtigste tekniske v\u00e6rkt\u00f8j til dette er en open source-utility. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.werf.io\/\">werf<\/a><\/noindex>. Dens s\u00e6rligt ved at den ikke udf\u00f8rer en enkelt funktion, men underst\u00f8tter processerne for kontinuerlig levering p\u00e5 alle trin: fra bygning til deployment.<\/p>\n<p>Publicering af billeder i registre* (umiddelbart efter deres bygning) er en \u00e5benlys funktion af en s\u00e5dan utility. Og eftersom billederne placeres der for opbevaring, skal man, hvis dit lager ikke er ubegribelig, ogs\u00e5 st\u00e5 til ansvar for deres efterf\u00f8lgende oprydning. Hvordan vi har haft succes med dette, mens vi har opfyldt alle givne kriterier, vil blive beskrevet videre.<\/p>\n<p><i>* Selvom selve registrene kan v\u00e6re forskellige (Docker Registry, GitLab Container Registry, Harbor osv.), st\u00e5r deres brugere over for de samme problemer. Den universelle l\u00f8sning i vores tilf\u00e6lde er uafh\u00e6ngig af registrets implementering, da den udf\u00f8res uden for selve registrene og tilbyder ensartet adf\u00e6rd for alle.<\/i><\/p>\n<p>Selvom vi bruger werf som et eksempel p\u00e5 implementering, h\u00e5ber vi, at de anvendte metoder vil v\u00e6re nyttige for andre teams, der st\u00e5r over for lignende udfordringer.<\/p>\n<p>S\u00e5 vi tog fat p\u00e5 <i>den eksterne<\/i> implementering af mekanismen til oprydning af billeder \u2014 i stedet for de muligheder, der allerede er indbygget i registrene for containere. Det f\u00f8rste skridt var at bruge Docker Registry API til at oprette de samme primitive politikker for antal tags og deres oprettelsestid (som n\u00e6vnt ovenfor). Til disse blev der tilf\u00f8jet <strong>en tilladelsesliste baseret p\u00e5 de billeder, der bruges i den udrullede infrastruktur<\/strong>, dvs. Kubernetes. For sidstn\u00e6vnte var det tilstr\u00e6kkeligt at iterere gennem alle udrullede ressourcer via Kubernetes API og f\u00e5 en liste over v\u00e6rdier. <code>billede<\/code>.<\/p>\n<p>Denne trivielle l\u00f8sning lukkede det mest kritiske problem (kriterium nr. 1), men var kun begyndelsen p\u00e5 vores vej til at forbedre reng\u00f8ringsmekanismen. N\u00e6ste - og en langt mere interessant - skridt var at finde en l\u00f8sning <strong>at tilknytte de offentliggjorte billeder til historien i Git<\/strong>.<\/p>\n<h3>Tagging-schemer<\/h3>\n<p>\nFor at starte valgte vi en tilgang, hvor det endelige billede skulle gemme den n\u00f8dvendige information til reng\u00f8ring, og vi opbyggede processen p\u00e5 tagging-schemer. Ved offentligg\u00f8relse af billedet valgte brugeren en bestemt tagging-option (<code>git-branch<\/code>, <code>git-commit<\/code> eller <code>git-tag<\/code>) og brugte den tilsvarende v\u00e6rdi. I CI-systemer blev indstillingen af disse v\u00e6rdier udf\u00f8rt automatisk baseret p\u00e5 milj\u00f8variabler. Grundl\u00e6ggende <strong>blev det endelige billede knyttet til en bestemt Git-primitiv<\/strong>, der gemte de n\u00f8dvendige data til reng\u00f8ring i labels.<\/p>\n<p>Inden for denne tilgang blev der skabt en r\u00e6kke politikker, der gjorde det muligt at bruge Git som den eneste sandhedskilde:<\/p>\n<ul>\n<li>N\u00e5r en gren\/tag blev slettet i Git, blev de tilknyttede billeder i registry automatisk slettet.<\/li>\n<li>Antallet af billeder knyttet til Git-tags og commits kunne reguleres efter antallet af tags, der blev brugt i den valgte skema, og tidspunktet for oprettelsen af den tilknyttede commit.<\/li>\n<\/ul>\n<p>\nGenerelt opfyldte den opn\u00e5ede implementering vores behov, men snart ventede der os en ny udfordring. Faktisk, i l\u00f8bet af brugen af tagging-schemer baseret p\u00e5 Git-primitiver, st\u00f8dte vi p\u00e5 en r\u00e6kke ulemper. <i>(Da beskrivelsen af dem ligger uden for rammerne af denne artikel, kan alle interesserede finde detaljerne <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/495112\/\"><i>her<\/i><\/a><\/noindex><i>.)<\/i> Derfor, efter at have besluttet at skifte til en mere effektiv tilgang til tagging (content-based tagging), m\u00e5tte vi genoverveje implementeringen af billedrensning.<\/p>\n<h3>Den nye algoritme<\/h3>\n<p>\nHvorfor? Ved tagging inden for content-based kan hvert tag d\u00e6kke adskillige commits i Git. Ved reng\u00f8ring af billeder kan man ikke l\u00e6ngere basere <i>kun<\/i> sig p\u00e5 den commit, hvor det nye tag blev tilf\u00f8jet til registry.<\/p>\n<p>For den nye algoritme til reng\u00f8ring blev det besluttet at forlade tagging-schemerne og opbygge <strong>processen p\u00e5 meta-billeder<\/strong>, som hver gemmer en kobling af:<\/p>\n<ul>\n<li>commit, hvor offentligg\u00f8relse blev udf\u00f8rt (herunder er det ligegyldigt, om billedet er blevet tilf\u00f8jet, \u00e6ndret eller forblevet det samme i containerregistryen);<\/li>\n<li>og vores interne identifikator, der svarer til det samlede billede.<\/li>\n<\/ul>\n<p>\nMed andre ord er forbindelsen mellem de publicerede tags og commits i Git blevet sikret. <strong>Den endelige konfiguration og den overordnede algoritme<\/strong>.<\/p>\n<h3>Brugerne fik adgang til politikker for konfiguration af oprydning, der bestemmer udvalget af aktuelle billeder. Hver s\u00e5dan politik defineres af:<\/h3>\n<p>\net s\u00e6t af references, dvs. Git-tags eller Git-grene, der anvendes under scanningen;<\/p>\n<ul>\n<li>og en gr\u00e6nse for antallet af s\u00f8gte billeder for hver reference fra s\u00e6ttet.<\/li>\n<li>For at illustrere, her er hvordan konfigurationen af standardpolitikken ser ud:<\/li>\n<\/ul>\n<p>\ncleanup:\n  keepPolicies:\n  - references:\n      tag: \/.*\/\/\n      limit:\n        last: 10\n  - references:\n      branch: \/.*\/\/\n      limit:\n        last: 10\n        in: 168h\n        operator: And\n    imagesPerReference:\n      last: 2\n      in: 168h\n      operator: And\n  - references:  \n      branch: \/^ (main|staging|production)$ \/\n    imagesPerReference:\n      last: 10<\/p>\n<pre><code class=\"plaintext\">Denne konfiguration indeholder tre politikker, som svarer til f\u00f8lgende regler:\n<\/code><\/pre>\n<p>\nBehold et billede for de 10 seneste Git-tags (baseret p\u00e5 tagens oprettelsesdato).<\/p>\n<ol>\n<li>Behold h\u00f8jst 2 billeder, der er publiceret i den sidste uge, for h\u00f8jst 10 grene med aktivitet i den sidste uge.<\/li>\n<li>Behold 10 billeder for grenene<\/li>\n<li>Den endelige algoritme reduceres til f\u00f8lgende trin: <code>main<\/code>, <code>staging<\/code> og <code>production<\/code>.<\/li>\n<\/ol>\n<p>\nIndhentning af manifester fra container registry.<\/p>\n<ul>\n<li>Udelukkelse af billeder, der bruges i Kubernetes, da disse allerede er blevet udvalgt ved at foresp\u00f8rge K8s API.<\/li>\n<li>Scanning af Git-historik og udelukkelse af billeder i henhold til de fastsatte politikker.<\/li>\n<li>Sletning af de resterende billeder.<\/li>\n<li>N\u00e5r vi vender tilbage til vores illustration, ser det s\u00e5dan ud med werf:<\/li>\n<\/ul>\n<p>\nMen selvom du ikke bruger werf, kan en lignende tilgang til avanceret oprydning af billeder anvendes \u2014 i en hvilken som helst implementering (i overensstemmelse med din foretrukne tilgang til tagging af billeder) \u2014 ogs\u00e5 i andre systemer\/v\u00e6rkt\u00f8jer. Det kr\u00e6ver blot at huske p\u00e5 de problemer, der opst\u00e5r, og finde de muligheder i din stak, som muligg\u00f8r en glat integration af deres l\u00f8sning. Vi h\u00e5ber, at den vej, vi har taget, kan hj\u00e6lpe dig med at se dit specifikke tilf\u00e6lde med nye detaljer og perspektiver.<\/p>\n<p><img decoding=\"async\" alt=\"Problemet med &quot;intelligent&quot; oprydning af containerbilleder og l\u00f8sningen i werf\" src=\"\/wp-content\/uploads\/2020\/10\/c453092dca23860a0dda604843845507.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTid eller senere st\u00f8der de fleste teams p\u00e5 problemer med overbel\u00e6gning i registreringen.<\/p>\n<h2>Konklusion<\/h2>\n<p><\/p>\n<ul>\n<li>N\u00e5r du s\u00f8ger efter l\u00f8sninger er det vigtigt f\u00f8rst at definere kriterierne for relevans af billedet. <\/li>\n<li>N\u00e5r man s\u00f8ger efter l\u00f8sninger, er det vigtigt f\u00f8rst at fastsl\u00e5 relevanskriterierne for billedet.<\/li>\n<li>V\u00e6rkt\u00f8jerne, der tilbydes af popul\u00e6re container registry-tjenester, muligg\u00f8r en meget enkel oprydning, som ikke tager h\u00f8jde for den \"ydre verden\": billeder, der bruges i Kubernetes, og teamets arbejdsgange.<\/li>\n<li>En fleksibel og effektiv algoritme skal have en forst\u00e5else for CI\/CD-processer og operere ikke kun med data fra Docker-billeder.<\/li>\n<\/ul>\n<p><\/p>\n<h2>P.S.<\/h2>\n<p>\nL\u00e6s ogs\u00e5 p\u00e5 vores blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/495112\/\">Content-based tagging i werf-builder: hvorfor og hvordan det fungerer?<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/476646\/\">3-vejs sammensmeltning i werf: deployment til Kubernetes med Helm \"p\u00e5 steroider\"<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465131\/\">Underst\u00f8ttelse af monorepo og multirepo i werf og hvad Docker Registry har at g\u00f8re med det<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/493170\/\">Werf 1.1 udgivelse: forbedringer i samlerens dag i dag og planer for fremtiden<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/522024\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0430\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 (Docker Registry \u0438 \u0435\u0433\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0430\u0445) \u0432 \u0440\u0435\u0430\u043b\u0438\u044f\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 CI\/CD-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432 \u0434\u043b\u044f cloud native-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0432 Kubernetes. \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0438 \u0432\u044b\u0442\u0435\u043a\u0430\u044e\u0449\u0438\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u0441\u0442\u0430 \u0438 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044f\u043c \u043a\u043e\u043c\u0430\u043d\u0434. \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e Open Source-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u044d\u0442\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":96066,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-96065","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u00ab\u0443\u043c\u043d\u043e\u0439\u00bb \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438 \u0435\u0451 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432 werf | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-07T11:42:09+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-07T11:42:09+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Problemet med \"smart\" oprydning af containerbilleder og dens l\u00f8sning i werf | ProHoster","description":"Artiklen er blevet gennemg\u00e5et.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u00ab\u0443\u043c\u043d\u043e\u0439\u00bb \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0438 \u0435\u0451 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432 werf | ProHoster","og:description":"\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430.","og:url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-07T11:42:09+00:00","article:modified_time":"2020-10-07T11:42:09+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"96065","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:52:24","updated":"2022-10-01 08:58:07","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/96065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=96065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/96065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/96066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=96065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=96065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=96065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}