{"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 'pulizia intelligente' 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 &#039;pulizia intelligente&#039; 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 affronta il problema della pulizia delle immagini accumulate nei registri dei container (Docker Registry e suoi analoghi) nel contesto degli attuali pipeline CI\/CD per applicazioni cloud native distribuite su Kubernetes. Vengono presentati i principali criteri di rilevanza delle immagini e le conseguenti difficolt\u00e0 nell'automatizzazione della pulizia, del risparmio di spazio e della soddisfazione delle esigenze dei team. Infine, attraverso un esempio di un progetto Open Source specifico, spiegheremo come superare queste difficolt\u00e0.<\/p>\n<h2>Introduzione<\/h2>\n<p>\nIl numero di immagini nel registro dei container pu\u00f2 crescere rapidamente, occupando pi\u00f9 spazio di archiviazione e, di conseguenza, aumentando significativamente i costi. 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>pulire le immagini in qualche modo.<\/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 cos\u00ec via), il registro non si gonfier\u00e0 e per lungo tempo non sar\u00e0 necessario pensare alla pulizia. Infatti, tutte le immagini non pi\u00f9 attuali vengono sovrascritte e non resta lavoro da fare per la pulizia (tutto viene gestito dal garbage collector standard).<\/p>\n<p>Tuttavia, questo approccio limita fortemente lo sviluppo ed \u00e8 raramente applicabile ai progetti CI\/CD moderni. Una parte essenziale dello sviluppo \u00e8 diventata <strong>automazione<\/strong>, che consente di testare, distribuire e fornire nuove funzionalit\u00e0 agli utenti in modo molto pi\u00f9 veloce. Ad esempio, in tutti i nostri progetti viene automaticamente creato un pipeline CI ad ogni commit. In essa viene creato un'immagine, testata, distribuita in vari ambienti Kubernetes per debugging e controlli rimanenti, e se va tutto bene \u2014 le modifiche raggiungono l'utente finale. E non \u00e8 pi\u00f9 una rocket science, ma una consuetudine per molti \u2014 probabilmente anche per voi, dato che state leggendo questo articolo.<\/p>\n<p>Poich\u00e9 la correzione dei bug e lo sviluppo di nuove funzionalit\u00e0 avviene in parallelo, e i rilasci possono essere effettuati pi\u00f9 volte al giorno, \u00e8 evidente che il processo di sviluppo \u00e8 accompagnato da un numero significativo di commit, il che significa \u2014 <strong>con un gran numero di immagini nel registry<\/strong>. Di conseguenza, emerge la questione di come organizzare una pulizia efficace del registry, cio\u00e8 la rimozione delle immagini obsolete.<\/p>\n<p>Ma come possiamo davvero determinare se un'immagine \u00e8 ancora attuale?<\/p>\n<h2>Criteri di attualit\u00e0 dell'immagine<\/h2>\n<p>\nNella stragrande maggioranza dei casi, i principali criteri saranno i seguenti:<\/p>\n<p>1. Il primo (il pi\u00f9 ovvio e critico di tutti) sono le immagini che <strong>sono attualmente utilizzate in Kubernetes<\/strong>. La rimozione di queste immagini potrebbe portare a costi significativi a causa dei 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 questa ragione abbiamo persino creato un <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/k8s-image-availability-exporter\"><i>Prometheus exporter<\/i><\/a><\/noindex><i>, che monitora l'assenza di tali immagini in qualsiasi cluster Kubernetes.)<\/i><\/p>\n<p>2. Il secondo (meno ovvio, ma ancora molto importante e nuovamente relativo all'operativit\u00e0) sono le immagini che <strong>sono necessarie per il rollback 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 difficilmente qualcuno ha davvero bisogno di salvarle molteplici versioni? ..) <i>questo<\/i> Dopotutto, noi, in particolare, memorizziamo le versioni affinch\u00e9 possano essere utilizzate in seguito, cio\u00e8 per \u00abtornare\u00bb a esse in caso di necessit\u00e0.<\/p>\n<p>3. Il terzo \u2014 <strong>le esigenze degli sviluppatori<\/strong>: tutte le immagini che sono correlate ai loro lavori attuali. Ad esempio, se consideriamo una PR, ha senso mantenere l'immagine corrispondente all'ultimo commit e, diciamo, al commit precedente: in questo modo lo sviluppatore potr\u00e0 tornare rapidamente a qualsiasi attivit\u00e0 e lavorare con le ultime modifiche. <\/p>\n<p>4. Il quarto \u2014 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 qui definiti sono stati elaborati sulla base dell'esperienza acquisita interagendo con decine di team di sviluppo provenienti da diverse aziende. Tuttavia, a seconda delle peculiarit\u00e0 nei processi di sviluppo e delle infrastrutture utilizzate (ad esempio, se Kubernetes non \u00e8 in uso), questi criteri possono differire. <\/p>\n<h2>Criteri di conformit\u00e0 e soluzioni esistenti<\/h2>\n<p>\nI servizi popolari con container registry di solito offrono le proprie politiche di pulizia delle immagini: in esse puoi 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 specifiche implementazioni 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 aggiornato a settembre 2020.<\/i><\/p>\n<p>Un insieme di parametri del genere \u00e8 pi\u00f9 che sufficiente per soddisfare il quarto criterio, cio\u00e8 quello di selezionare le immagini corrispondenti alle versioni. Tuttavia, per tutti gli altri criteri \u00e8 necessario optare per una soluzione compromissoria (una politica pi\u00f9 rigorosa o, al contrario, pi\u00f9 indulgente), a seconda delle aspettative e delle risorse finanziarie.<\/p>\n<p>Ad esempio, il terzo criterio, relativo alle esigenze degli sviluppatori, pu\u00f2 essere affrontato attraverso l'organizzazione dei processi all'interno dei team: una denominazione specifica delle immagini, la gestione di liste di autorizzazione speciali e accordi interni. Ma alla fine \u00e8 comunque necessario automatizzarlo. E se le soluzioni pronte non sono sufficienti, bisogna crearne di proprie.<\/p>\n<p>La situazione \u00e8 simile per i primi due criteri: non possono essere soddisfatti senza ricevere dati da un sistema esterno, 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 lavoriate pi\u00f9 o meno secondo questo schema in Git:<\/p>\n<p><img decoding=\"async\" alt=\"Il problema della &#039;pulizia intelligente&#039; 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>L'icona con la testa nello schema indica le immagini dei container che attualmente sono 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 &#039;pulizia intelligente&#039; 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 \/>\nOvviamente, uno scenario del genere non far\u00e0 felice nessuno.<\/p>\n<p>Cosa cambier\u00e0 se le politiche consentono di non eliminare le immagini <b>in base a un intervallo di tempo specifico \/ al numero degli ultimi commit<\/b>?<\/p>\n<p><img decoding=\"async\" alt=\"Il problema della &#039;pulizia intelligente&#039; 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 migliorato notevolmente, ma \u00e8 comunque lontano dall'ideale. Infatti, abbiamo ancora sviluppatori che necessitano di immagini nel registro (o addirittura distribuite in K8s) per il debug dei bug...<\/p>\n<p>Riassumendo la situazione attuale del mercato: le funzioni disponibili nei registri dei container non offrono la flessibilit\u00e0 necessaria nella pulizia, e la ragione principale \u00e8 che <strong>non c'\u00e8 possibilit\u00e0 di interagire con il mondo esterno<\/strong>. Dunque, i team che necessitano di tale flessibilit\u00e0 sono costretti a implementare autonomamente la rimozione delle immagini \"dall'esterno\", utilizzando l'API 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>\nDa dove proviene questa esigenza? Il fatto \u00e8 che non siamo solo un gruppo di sviluppatori, ma un team che supporta molti di questi, aiutando a risolvere integralmente le questioni del CI\/CD. E il principale strumento tecnico per fare ci\u00f2 \u00e8 un'utilit\u00e0 Open Source <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.werf.io\/\">werf<\/a><\/noindex>. La sua caratteristica principale \u00e8 che non svolge una sola funzione, ma accompagna i processi di consegna continua in tutte le fasi: dalla costruzione 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 archiviate, se il vostro deposito non \u00e8 illimitato, \u00e8 necessario occuparsi anche della loro successiva pulizia. Di come abbiamo avuto successo in questo, soddisfacendo tutti i criteri stabiliti, sar\u00e0 parlato successivamente.<\/p>\n<p><i>* Anche se i registry possono variare (Docker Registry, GitLab Container Registry, Harbor, ecc.), gli utenti affrontano gli stessi problemi. La soluzione universale nel nostro caso non dipende dall'implementazione del registry, poich\u00e9 viene eseguita al di fuori dei registry stessi e offre un comportamento uniforme per tutti.<\/i><\/p>\n<p>Sebbene utilizziamo werf come esempio di implementazione, speriamo che gli approcci usati possano essere utili anche ad altre squadre che si trovano ad affrontare difficolt\u00e0 simili.<\/p>\n<p>Quindi, ci siamo occupati di <i>un'implementazione<\/i> esterna del meccanismo per la pulizia delle immagini \u2014 invece delle funzionalit\u00e0 gi\u00e0 integrate nei registry per i container. Il primo passo \u00e8 stato utilizzare l'API di Docker Registry per creare le stesse politiche primitive riguardo al numero di tag e al loro tempo di creazione (menzionate sopra). A queste \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>Questa soluzione banale ha risolto il problema pi\u00f9 critico (criterio n. 1), ma \u00e8 stata solo l'inizio del nostro percorso di miglioramento del meccanismo di pulizia. Il passo successivo \u2014 e molto pi\u00f9 interessante \u2014 \u00e8 stato la soluzione <strong>per collegare le immagini pubblicate alla 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 strutturato il processo sugli schemi di tagging. Durante la pubblicazione dell'immagine, l'utente sceglieva un'opzione di tagging specifica (<code>git-branch<\/code>, <code>git-commit<\/code> o <code>git-tag<\/code>) e utilizzava il valore corrispondente. Nelle CI systems, l'impostazione di questi valori veniva eseguita automaticamente sulla base delle variabili d'ambiente. In sostanza <strong>l'immagine finale veniva collegata a un determinato primitivo Git<\/strong>, conservando i dati necessari per la pulizia nelle etichette.<\/p>\n<p>Con questo approccio \u00e8 stato creato un insieme di politiche che permetteva di utilizzare Git come unica fonte di verit\u00e0:<\/p>\n<ul>\n<li>Quando un ramo\/tag veniva eliminato in Git, anche le immagini associate venivano automaticamente rimosse dal registry.<\/li>\n<li>Il numero di immagini associate ai tag Git e ai commit poteva essere regolato dal numero di tag utilizzati nello schema selezionato e dal momento della creazione del commit associato.<\/li>\n<\/ul>\n<p>\nIn generale, la realizzazione risultante soddisfava le nostre esigenze, ma presto ci aspettava una nuova sfida. Infatti, durante l'uso degli schemi di tagging basati sui primitivi di Git, abbiamo riscontrato alcuni svantaggi. <i>(Poich\u00e9 la loro descrizione esula dall'argomento di questo articolo, tutti coloro che sono interessati possono trovare 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 (content-based tagging), abbiamo dovuto rivedere anche l'implementazione della pulizia delle immagini.<\/p>\n<h3>Il nuovo algoritmo<\/h3>\n<p>\nPerch\u00e9? Con il tagging basato sul contenuto, ogni tag pu\u00f2 soddisfare molti commit in Git. Nella pulizia delle immagini non si pu\u00f2 pi\u00f9 partire <i>solo<\/i> dall'commit in cui \u00e8 stato aggiunto un 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>il processo sui meta-immagini<\/strong>, ciascuna delle quali conserva un'associazione di:<\/p>\n<ul>\n<li>il commit in cui \u00e8 stata eseguita la pubblicazione (indipendentemente dal fatto che l'immagine sia stata aggiunta, modificata o rimasta la stessa nel registro dei container);<\/li>\n<li>e il nostro identificatore interno corrispondente all'immagine costruita.<\/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, nella configurazione della pulizia, sono state rese disponibili le politiche mediante le quali vengono selezionate le immagini attuali. Ogni politica \u00e8 definita da:<\/p>\n<ul>\n<li>un insieme di references, ossia i tag Git o i rami Git utilizzati durante la scansione;<\/li>\n<li>e da un limite di immagini cercate per ogni reference dell'insieme.<\/li>\n<\/ul>\n<p>\nPer illustrare, ecco come appare 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 corrispondono alle seguenti regole:<\/p>\n<ol>\n<li>Mantenere l'immagine per i 10 ultimi tag Git (in base alla data di creazione del tag).<\/li>\n<li>Conservare non pi\u00f9 di 2 immagini pubblicate nell'ultima settimana, per non pi\u00f9 di 10 branch con attivit\u00e0 nell'ultima settimana.<\/li>\n<li>Conservare 10 immagini per branch <code>main<\/code>, <code>staging<\/code> e <code>produzione<\/code>.<\/li>\n<\/ol>\n<p>\nL'algoritmo finale si riduce ai seguenti passaggi:<\/p>\n<ul>\n<li>Ottenere i manifesti dal container registry.<\/li>\n<li>Escludere le immagini utilizzate in Kubernetes, poich\u00e9 sono gi\u00e0 state selezionate, interrogando l'API di K8s.<\/li>\n<li>Scansione della cronologia di Git ed esclusione delle immagini secondo le politiche stabilite.<\/li>\n<li>Rimozione delle immagini rimanenti.<\/li>\n<\/ul>\n<p>\nRitornando alla nostra illustrazione, ecco cosa succede con werf:<\/p>\n<p><img decoding=\"async\" alt=\"Il problema della &#039;pulizia intelligente&#039; 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 si utilizza werf, un approccio simile alla pulizia avanzata delle immagini \u2014 in una forma o nell'altra (secondo l'approccio di tagging preferito delle immagini) \u2014 pu\u00f2 essere applicato anche in altri sistemi\/utilit\u00e0. \u00c8 sufficiente ricordare i problemi che sorgono e trovare quelle opportunit\u00e0 nel tuo stack che permettono di integrare la loro soluzione in modo pi\u00f9 fluido. Ci auguriamo che il percorso che abbiamo intrapreso possa aiutarti a guardare il tuo caso specifico con nuove dettagli e pensieri.<\/p>\n<h2>Conclusione<\/h2>\n<p><\/p>\n<ul>\n<li>Prima o poi, la maggior parte dei team si scontra con il problema del sovraccarico del registry. <\/li>\n<li>Nella ricerca di soluzioni, \u00e8 fondamentale stabilire i criteri di attualit\u00e0 delle immagini.<\/li>\n<li>Gli strumenti offerti dai servizi di container registry popolari consentono di organizzare una pulizia molto semplice, che non tiene conto del \"mondo esterno\": immagini utilizzate in Kubernetes e le peculiarit\u00e0 dei flussi di lavoro del team.<\/li>\n<li>Un algoritmo flessibile ed efficace deve comprendere i processi CI\/CD e operare non solo con i dati delle immagini Docker.<\/li>\n<\/ul>\n<p><\/p>\n<h2>P.S.<\/h2>\n<p>\nLeggete 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 su contenuto in 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: deploy in Kubernetes con Helm \"potenziato\"<\/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 qual \u00e8 il legame con 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 builder 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.0.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.0.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 intelligente\" 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}]}}