{"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\/it\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf","title":{"rendered":"Il problema della \u2018pulizia intelligente\u2019 delle immagini dei container e la sua soluzione in werf","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Il problema della \u2018pulizia intelligente\u2019 delle immagini dei container e la sua soluzione in werf\" src=\"\/wp-content\/uploads\/2020\/10\/1410cea46bb8dcdc3ac06db11ed5a402.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nL'articolo esamina la problematica della pulizia delle immagini che si accumulano nei registri dei contenitori (Docker Registry e suoi analoghi) nel contesto degli attuali pipeline CI\/CD per le applicazioni cloud native distribuite su Kubernetes. Vengono forniti i principali criteri di attualit\u00e0 delle immagini e le difficolt\u00e0 derivanti nell'automazione della pulizia, nel risparmio di spazio e nella soddisfazione delle esigenze dei team. Infine, attraverso un esempio concreto di un progetto Open Source, spiegheremo come queste difficolt\u00e0 possano essere superate.<\/p>\n<h2>Introduzione<\/h2>\n<p>\nIl numero di immagini nel registro dei contenitori pu\u00f2 crescere rapidamente, occupando pi\u00f9 spazio di archiviazione e, di conseguenza, aumentando significativamente il suo costo. Per controllare, limitare o mantenere una crescita accettabile dello spazio occupato nel registry, \u00e8 consuetudine:<\/p>\n<ol>\n<li>utilizzare un numero fisso di tag per le immagini;<\/li>\n<li>in qualche modo pulire le immagini.<\/li>\n<\/ol>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nLa prima limitazione \u00e8 talvolta accettabile per piccoli team. Se agli sviluppatori bastano tag fissi (<code>latest<\/code>, <code>main<\/code>, <code>test<\/code>, <code>boris<\/code> e simili), il registro non si ingrandir\u00e0 e per un lungo periodo non sar\u00e0 necessario nemmeno pensare alla pulizia. Infatti, tutte le immagini obsolete vengono sovrascritte e non rimane lavoro da fare per la pulizia (tutto viene gestito dal garbage collector standard).<\/p>\n<p>Tuttavia, questo approccio limita notevolmente lo sviluppo e raramente si adatta ai progetti CI\/CD moderni. Un elemento imprescindibile dello sviluppo \u00e8 diventato <strong>automazione<\/strong>, che consente di testare, distribuire e fornire nuove funzionalit\u00e0 agli utenti in modo molto pi\u00f9 rapido. Ad esempio, in tutti i nostri progetti, ad ogni commit viene automaticamente creato un pipeline CI. In esso viene assemblata un'immagine, testata, distribuita in diversi ambienti Kubernetes per debugging e ulteriori verifiche, e se tutto va bene, le modifiche arrivano all'utente finale. E non \u00e8 pi\u00f9 una questione di rocket science, ma una routine per molti \u2014 probabilmente anche per te, dato che leggi questo articolo.<\/p>\n<p>Poich\u00e9 la risoluzione dei bug e lo sviluppo di nuove funzionalit\u00e0 avvengono in parallelo, e i rilasci possono avvenire pi\u00f9 volte al giorno, \u00e8 ovvio che il processo di sviluppo \u00e8 accompagnato da un considerevole numero di commit, e quindi \u2014 <strong>un gran numero di immagini nel registry<\/strong>. Di conseguenza, sorge l'importante questione di come organizzare una pulizia efficace del registry, ossia la rimozione delle immagini obsolete.<\/p>\n<p>Ma come si pu\u00f2 definire se un'immagine \u00e8 attuale?<\/p>\n<h2>Criteri di rilevanza dell'immagine<\/h2>\n<p>\nNella stragrande maggioranza dei casi, i criteri principali saranno i seguenti:<\/p>\n<p>1. Il primo (il pi\u00f9 ovvio e critico di tutti) \u00e8 rappresentato dalle immagini che <strong>attualmente vengono utilizzate in Kubernetes<\/strong>. La rimozione di queste immagini potrebbe comportare costi significativi dovuti ai tempi di inattivit\u00e0 della produzione (ad esempio, le immagini potrebbero essere necessarie durante la replica) o vanificare gli sforzi del team che si occupa del debug su uno dei contorni. <i>(Per questo motivo abbiamo persino creato un <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/k8s-image-availability-exporter\"><i>exporter Prometheus<\/i><\/a><\/noindex><i>, per monitorare l'assenza di tali immagini in qualsiasi cluster Kubernetes.)<\/i><\/p>\n<p>2. Il secondo (meno ovvio, ma comunque molto importante e ancora relativo all'operativit\u00e0) sono le immagini che <strong>sono necessarie per il downgrade in caso di gravi problemi<\/strong> nella versione attuale. Ad esempio, nel caso di Helm, si tratta delle immagini utilizzate nelle versioni salvate del rilascio. (A proposito, di default in Helm c'\u00e8 un limite di 256 revisioni, ma \u00e8 improbabile che qualcuno abbia realmente bisogno di mantenere <i>tanto<\/i> grande numero di versioni?..) Infatti, noi, per esempio, conserviamo versioni in modo da poterle utilizzare successivamente, cio\u00e8 \"tornare\" su di esse in caso di necessit\u00e0.<\/p>\n<p>3. Il terzo \u00e8 <strong>il bisogno degli sviluppatori<\/strong>: tutte le immagini correlate ai loro lavori attuali. Ad esempio, se stiamo considerando un PR, ha senso mantenere l'immagine corrispondente all'ultimo commit e, diciamo, al commit precedente: in questo modo lo sviluppatore pu\u00f2 tornare rapidamente a qualsiasi attivit\u00e0 e lavorare con le ultime modifiche. <\/p>\n<p>4. Il quarto sono le immagini che <strong>corrispondono alle versioni della nostra applicazione<\/strong>, cio\u00e8 sono il prodotto finale: v1.0.0, 20.04.01, sierra, ecc.<\/p>\n<p>NB: I criteri indicati qui sono stati formulati sulla base dell'esperienza di interazione con decine di team di sviluppo di diverse aziende. Tuttavia, naturalmente, a seconda delle peculiarit\u00e0 nei processi di sviluppo e dell'infrastruttura utilizzata (ad esempio, se non viene utilizzato Kubernetes), questi criteri possono variare. <\/p>\n<h2>Corrispondenza dei criteri e soluzioni esistenti<\/h2>\n<p>\nI servizi popolari con container registry offrono generalmente le proprie politiche di pulizia delle immagini: in esse \u00e8 possibile definire le condizioni in base alle quali un tag viene rimosso dal registry. Tuttavia, le possibilit\u00e0 di queste condizioni sono limitate a parametri come nomi, data di creazione e numero di tag*.<\/p>\n<p><i>* Dipende dalle implementazioni specifiche del container registry. Abbiamo esaminato le possibilit\u00e0 delle seguenti soluzioni: Azure CR, Docker Hub, ECR, GCR, GitHub Packages, GitLab Container Registry, Harbor Registry, JFrog Artifactory, Quay.io \u2014 alla data di settembre 2020.<\/i><\/p>\n<p>Un tale insieme di parametri \u00e8 pi\u00f9 che sufficiente per soddisfare il quarto criterio \u2014 cio\u00e8 selezionare le immagini corrispondenti alle versioni. Tuttavia, per tutti gli altri criteri \u00e8 necessario scegliere una qualche soluzione di compromesso (una politica pi\u00f9 rigida o, al contrario, pi\u00f9 permissiva) \u2014 a seconda delle aspettative e delle possibilit\u00e0 finanziarie.<\/p>\n<p>Ad esempio, il terzo criterio \u2014 legato alle esigenze degli sviluppatori \u2014 pu\u00f2 essere affrontato organizzando i processi all'interno dei team: denominazione specifica delle immagini, gestione di speciali allow lists e accordi interni. Ma alla fine deve comunque essere automatizzato. E se le funzionalit\u00e0 delle soluzioni pronte non sono sufficienti, \u00e8 necessario fare qualcosa di proprio.<\/p>\n<p>La situazione \u00e8 analoga per i primi due criteri: non possono essere soddisfatti senza ottenere dati da un sistema esterno \u2014 quello in cui avviene il deployment delle applicazioni (nel nostro caso, Kubernetes).<\/p>\n<h3>Illustrazione del workflow in Git<\/h3>\n<p>\nSupponiamo che tu stia lavorando pi\u00f9 o meno con questo schema in Git:<\/p>\n<p><img decoding=\"async\" alt=\"Il problema della \u2018pulizia intelligente\u2019 delle immagini dei container e la sua soluzione in werf\" src=\"\/wp-content\/uploads\/2020\/10\/45c9bfb6755da1b4d6be05b51ab17429.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Nella diagramma, le icone con la testa indicano le immagini dei contenitori attualmente distribuite in Kubernetes per alcuni utenti (utenti finali, tester, manager, ecc.) o utilizzate dagli sviluppatori per il debug e scopi simili.<\/i><\/p>\n<p>Cosa succeder\u00e0 se le politiche di pulizia consentono di mantenere (non eliminare) le immagini solo <b>in base ai nomi dei tag specificati<\/b>?<\/p>\n<p><img decoding=\"async\" alt=\"Il problema della \u2018pulizia intelligente\u2019 delle immagini dei container e la sua soluzione in werf\" src=\"\/wp-content\/uploads\/2020\/10\/e57ff24cb818799d28e8eb006aea2eb5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c8 ovvio che tale scenario non far\u00e0 piacere a nessuno.<\/p>\n<p>Cosa cambier\u00e0 se le politiche permettono di non eliminare le immagini <b>in base a un intervallo temporale specificato \/ numero di ultimi commit<\/b>?<\/p>\n<p><img decoding=\"async\" alt=\"Il problema della \u2018pulizia intelligente\u2019 delle immagini dei container e la sua soluzione in werf\" src=\"\/wp-content\/uploads\/2020\/10\/7743581e6e64affb0a207ee156c00f6e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl risultato \u00e8 notevolmente migliorato, ma \u00e8 ancora lontano dall'ideale. Infatti, abbiamo ancora sviluppatori che necessitano di immagini nel registro (o addirittura distribuite in K8s) per il debugging dei bug...<\/p>\n<p>Ricapitolando la situazione attuale sul mercato: le funzionalit\u00e0 disponibili nei registri dei contenitori non offrono la flessibilit\u00e0 necessaria durante la pulizia, e la principale ragione \u00e8 che <strong>non c'\u00e8 possibilit\u00e0 di interagire con il mondo esterno<\/strong>. Si tratta quindi di team che richiedono tale flessibilit\u00e0, costretti a gestire autonomamente la rimozione delle immagini \"esternamente\", utilizzando l'API di Docker Registry (o l'API nativa della relativa implementazione).<\/p>\n<p>Tuttavia, stavamo cercando una soluzione universale che automatizzasse la pulizia delle immagini per diversi team, che utilizzano registri diversi\u2026<\/p>\n<h2>Il nostro percorso verso una pulizia universale delle immagini<\/h2>\n<p>\nPerch\u00e9 c'\u00e8 questa necessit\u00e0? Il fatto \u00e8 che non siamo un gruppo di sviluppatori isolato, ma un team che supporta molteplici gruppi di questo tipo, aiutando a risolvere complessivamente le questioni CI\/CD. E il principale strumento tecnico per questo \u00e8 un'utilit\u00e0 Open Source <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.werf.io\/\">werf<\/a><\/noindex>. La sua particolarit\u00e0 \u00e8 che non esegue una sola funzione, ma accompagna i processi di consegna continua in tutte le fasi: dalla compilazione al deployment.<\/p>\n<p>La pubblicazione nel registro* delle immagini (subito dopo la loro costruzione) \u00e8 una funzione ovvia di tale utilit\u00e0. E poich\u00e9 le immagini vengono memorizzate l\u00ec, se il tuo archivio non \u00e8 illimitato, \u00e8 necessario occuparsi anche della loro successiva pulizia. Di come abbiamo raggiunto il successo in questo, soddisfacendo tutti i criteri richiesti, si parler\u00e0 pi\u00f9 avanti.<\/p>\n<p><i>* Anche se i registri stessi possono essere diversi (Docker Registry, GitLab Container Registry, Harbor, ecc.), i loro utenti si trovano di fronte agli stessi problemi. La soluzione universale nel nostro caso non dipende dall'implementazione del registro, poich\u00e9 viene eseguita al di fuori dei registri stessi e offre un comportamento uniforme per tutti.<\/i><\/p>\n<p>Anche se utilizziamo werf come esempio di implementazione, speriamo che gli approcci utilizzati possano essere utili anche ad altri team che si trovano ad affrontare difficolt\u00e0 simili.<\/p>\n<p>Quindi, ci siamo occupati <i>esternamente<\/i> dell'implementazione di un meccanismo per la pulizia delle immagini \u2014 invece delle funzionalit\u00e0 gi\u00e0 integrate nei registri per i contenitori. Il primo passo \u00e8 stato l'uso dell'API di Docker Registry per creare le stesse politiche primitive riguardo al numero di tag e al loro tempo di creazione (menzionati sopra). A esse \u00e8 stata aggiunta <strong>una lista di autorizzazione basata sulle immagini utilizzate nell'infrastruttura distribuita<\/strong>, cio\u00e8 Kubernetes. Per quest'ultimo \u00e8 stato sufficiente scorrere tutte le risorse distribuite tramite l'API di Kubernetes e ottenere un elenco di valori. <code>image<\/code>.<\/p>\n<p>Una soluzione cos\u00ec triviale ha risolto il problema pi\u00f9 critico (criterio n. 1), ma \u00e8 stata solo l'inizio del nostro viaggio per migliorare il meccanismo di pulizia. Il passo successivo \u2014 decisamente pi\u00f9 interessante \u2014 \u00e8 stato trovare una soluzione <strong>per collegare le immagini pubblicate con la storia di Git<\/strong>.<\/p>\n<h3>Schemi di tagging<\/h3>\n<p>\nPer iniziare, abbiamo scelto un approccio in cui l'immagine finale deve conservare le informazioni necessarie per la pulizia e abbiamo costruito il processo sugli schemi di tagging. Quando si pubblica un'immagine, l'utente seleziona una specifica opzione di tagging (<code>git-branch<\/code>, <code>git-commit<\/code> o <code>git-tag<\/code>) e utilizza il valore corrispondente. Nei sistemi CI, l'impostazione di questi valori avveniva automaticamente sulla base delle variabili d'ambiente. In sostanza <strong>l'immagine finale era collegata a un particolare primitivo Git<\/strong>, conservando i dati necessari per la pulizia nelle etichette.<\/p>\n<p>Con questo approccio, \u00e8 stata realizzata una serie di politiche che consentivano di utilizzare Git come unica fonte di verit\u00e0:<\/p>\n<ul>\n<li>Quando un ramo\/tag veniva eliminato in Git, le immagini correlate venivano automaticamente rimosse dal registry.<\/li>\n<li>Il numero di immagini associate ai tag e ai commit di Git poteva essere regolato dal numero di tag utilizzati nello schema selezionato e dal tempo di creazione del commit correlato.<\/li>\n<\/ul>\n<p>\nIn generale, l'implementazione risultante soddisfaceva le nostre esigenze, ma ben presto ci aspettavano nuove sfide. Il problema \u00e8 che, mentre utilizzavamo schemi di tagging sui primitivi Git, ci siamo imbattuti in vari svantaggi. <i>(Poich\u00e9 la loro descrizione va al di l\u00e0 dell'argomento di questo articolo, chiunque fosse interessato pu\u00f2 consultare i dettagli <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/495112\/\"><i>qui<\/i><\/a><\/noindex><i>.)<\/i> Pertanto, decidendo di passare a un approccio di tagging pi\u00f9 efficace (tagging basato sul contenuto), abbiamo dovuto rivedere anche l'implementazione della pulizia delle immagini.<\/p>\n<h3>Nuovo algoritmo<\/h3>\n<p>\nPerch\u00e9? Con il tagging basato sul contenuto, ogni tag pu\u00f2 soddisfare molteplici commit in Git. Nella pulizia delle immagini non \u00e8 pi\u00f9 possibile partire <i>solo<\/i> dal commit su cui \u00e8 stato aggiunto il nuovo tag al registro.<\/p>\n<p>Per il nuovo algoritmo di pulizia, \u00e8 stato deciso di abbandonare gli schemi di tagging e costruire <strong>un processo su meta-immagini<\/strong>, ognuna delle quali conserva un collegamento tra:<\/p>\n<ul>\n<li>il commit in cui \u00e8 stata effettuata la pubblicazione (senza che abbia importanza se l'immagine nel registro sia stata aggiunta, modificata o rimasta invariata);<\/li>\n<li>e il nostro identificatore interno corrispondente all'immagine assemblata.<\/li>\n<\/ul>\n<p>\nIn altre parole, \u00e8 stata garantita <strong>la connessione tra i tag pubblicati e i commit in Git<\/strong>.<\/p>\n<h3>La configurazione finale e l'algoritmo generale<\/h3>\n<p>\nAgli utenti, durante la configurazione della pulizia, sono state rese disponibili politiche tramite le quali viene effettuato il campionamento delle immagini attuali. Ogni politica \u00e8 definita da:<\/p>\n<ul>\n<li>un insieme di references, ovvero tag Git o branch Git, utilizzati durante la scansione;<\/li>\n<li>e un limite di immagini ricercabili per ogni reference dell'insieme.<\/li>\n<\/ul>\n<p>\nA titolo esemplificativo, ecco come \u00e8 diventata la configurazione delle politiche predefinite:<\/p>\n<pre><code class=\"plaintext\">cleanup:\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\n<\/code><\/pre>\n<p>\nQuesta configurazione contiene tre politiche che seguono le seguenti regole:<\/p>\n<ol>\n<li>Conservare l'immagine per gli 10 ultimi tag Git (in base alla data di creazione del tag).<\/li>\n<li>Conservare al massimo 2 immagini pubblicate nell'ultima settimana per al massimo 10 branch con attivit\u00e0 nell'ultima settimana.<\/li>\n<li>Conservare 10 immagini per i branch <code>main<\/code>, <code>staging<\/code> e <code>production<\/code>.<\/li>\n<\/ol>\n<p>\nL'algoritmo finale si riassume nei seguenti passi:<\/p>\n<ul>\n<li>Ottenere i manifesti dal container registry.<\/li>\n<li>Escludere le immagini utilizzate in Kubernetes, poich\u00e9 gi\u00e0 le abbiamo selezionate preventivamente interpellando l'API di K8s.<\/li>\n<li>Scansionare la storia di Git e escludere le immagini secondo le politiche designate.<\/li>\n<li>Eliminare le immagini rimanenti.<\/li>\n<\/ul>\n<p>\nTornando alla nostra illustrazione, ecco cosa accade con werf:<\/p>\n<p><img decoding=\"async\" alt=\"Il problema della \u2018pulizia intelligente\u2019 delle immagini dei container e la sua soluzione in werf\" src=\"\/wp-content\/uploads\/2020\/10\/c453092dca23860a0dda604843845507.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTuttavia, anche se non utilizzate werf, un approccio simile alla pulizia avanzata delle immagini \u2014 in una qualsiasi delle sue implementazioni (in conformit\u00e0 all'approccio preferito per la taggatura delle immagini) \u2014 pu\u00f2 essere applicato anche in altri sistemi\/utilit\u00e0. \u00c8 sufficiente tenere a mente i problemi che sorgono e individuare quelle opportunit\u00e0 nel vostro stack che consentono di integrare la loro soluzione nel modo pi\u00f9 snodato possibile. Speriamo che il percorso che abbiamo seguito aiuti anche a considerare il vostro caso specifico con nuovi dettagli e riflessioni.<\/p>\n<h2>Conclusione<\/h2>\n<p><\/p>\n<ul>\n<li>Prima o poi, la maggior parte dei team si trova ad affrontare il problema del sovraccarico del registry. <\/li>\n<li>Nella ricerca di soluzioni, \u00e8 fondamentale innanzitutto definire i criteri di rilevanza dell'immagine.<\/li>\n<li>Gli strumenti offerti dai popolari servizi di container registry consentono di organizzare una pulizia molto semplice, che non considera il \u00abmondo esterno\u00bb: le immagini utilizzate in Kubernetes e le peculiarit\u00e0 dei flussi di lavoro del team.<\/li>\n<li>Un algoritmo flessibile ed efficace deve avere una comprensione dei processi CI\/CD, operando non solo con i dati delle immagini Docker.<\/li>\n<\/ul>\n<p><\/p>\n<h2>P.S.<\/h2>\n<p>\nLeggi anche nel nostro blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/495112\/\">Tagging basato sui contenuti nel costruttore werf: perch\u00e9 e come funziona?<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/476646\/\">Merge a 3 vie in werf: deployment in Kubernetes con Helm \u00absotto steroidi\u00bb<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465131\/\">Supporto monorepo e multirepo in werf e cosa c'entra Docker Registry<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/493170\/\">Rilascio di werf 1.1: miglioramenti nel costruttore oggi e piani per il futuro<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Fonte: <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.1.1 - 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\/it\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Il problema della pulizia \u00abintelligente\u00bb delle immagini dei container e la sua soluzione in werf | ProHoster","description":"L'articolo \u00e8 stato esaminato.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/96065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=96065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/96065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/96066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=96065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=96065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=96065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}