{"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\/fr\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf","title":{"rendered":"Le probl\u00e8me de l'\u00ab intelligent \u00bb nettoyage des images de conteneurs et sa solution dans werf","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Le probl\u00e8me de l&#039;\u00ab intelligent \u00bb nettoyage des images de conteneurs et sa solution dans werf\" src=\"\/wp-content\/uploads\/2020\/10\/1410cea46bb8dcdc3ac06db11ed5a402.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCet article aborde la probl\u00e9matique du nettoyage des images qui s'accumulent dans les registres de conteneurs (Docker Registry et ses alternatives) dans le contexte des pipelines CI\/CD modernes pour les applications cloud native d\u00e9ploy\u00e9es sur Kubernetes. Les principaux crit\u00e8res de pertinence des images sont pr\u00e9sent\u00e9s, ainsi que les difficult\u00e9s qui en d\u00e9coulent pour automatiser le nettoyage, \u00e9conomiser de l'espace et r\u00e9pondre aux besoins des \u00e9quipes. Enfin, \u00e0 travers un exemple d'un projet Open Source concret, nous expliquerons comment surmonter ces difficult\u00e9s.<\/p>\n<h2>Introduction<\/h2>\n<p>\nLe nombre d'images dans le registre des conteneurs peut cro\u00eetre rapidement, occupant plus d'espace de stockage et, par cons\u00e9quent, augmentant consid\u00e9rablement son co\u00fbt. Pour contr\u00f4ler, limiter ou maintenir une croissance acceptable de l'espace occup\u00e9 dans le registre, il est courant de :<\/p>\n<ol>\n<li>utiliser un nombre fixe de tags pour les images ;<\/li>\n<li>nettoyer les images d'une mani\u00e8re ou d'une autre.<\/li>\n<\/ol>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nLa premi\u00e8re restriction est parfois acceptable pour de petites \u00e9quipes. Si les d\u00e9veloppeurs se contentent de tags fixes (<code>latest<\/code>, <code>main<\/code>, <code>test<\/code>, <code>boris<\/code> etc.), le registre ne gonflera pas en taille et pendant longtemps, il n'est pas n\u00e9cessaire de penser \u00e0 un nettoyage. En effet, toutes les images obsol\u00e8tes sont remplac\u00e9es, et il n'y a tout simplement pas de travail de nettoyage (tout est g\u00e9r\u00e9 par le ramasse-miettes standard).<\/p>\n<p>Cependant, cette approche limite fortement le d\u00e9veloppement et est rarement applicable aux projets CI\/CD modernes. L'automatisation est devenue une partie int\u00e9grante du d\u00e9veloppement, <strong>qui permet de tester, d\u00e9ployer et livrer de nouvelles fonctionnalit\u00e9s aux utilisateurs beaucoup plus rapidement. Par exemple, dans tous nos projets, un pipeline CI est automatiquement cr\u00e9\u00e9 \u00e0 chaque commit. Celui-ci construit l'image, la teste, la d\u00e9ploie dans divers environnements Kubernetes pour le d\u00e9bogage et les v\u00e9rifications restantes, et si tout va bien, les modifications atteignent l'utilisateur final. Ce n'est plus une science-fus\u00e9e, mais une banalit\u00e9 pour beaucoup \u2014 probablement pour vous \u00e9galement, puisque vous lisez cet article.<\/strong>\u00c9tant donn\u00e9 que la correction des bogues et le d\u00e9veloppement de nouvelles fonctionnalit\u00e9s se d\u00e9roulent en parall\u00e8le, et que des versions peuvent \u00eatre effectu\u00e9es plusieurs fois par jour, il est \u00e9vident que le processus de d\u00e9veloppement est accompagn\u00e9 d'un nombre consid\u00e9rable de commits, ce qui signifie \u2014<\/p>\n<p>un grand nombre d'images dans le registre. <strong>En cons\u00e9quence, la question de l'organisation d'un nettoyage efficace du registre se pose avec acuit\u00e9, c'est-\u00e0-dire la suppression d'images obsol\u00e8tes.<\/strong>.<\/p>\n<p>Mais comment d\u00e9terminer si l'image est pertinente ?<\/p>\n<h2>Crit\u00e8res de pertinence de l'image<\/h2>\n<p>\nDans la grande majorit\u00e9 des cas, les crit\u00e8res principaux seront les suivants :<\/p>\n<p>1. Le premier (le plus \u00e9vident et le plus critique de tous) \u2014 ce sont les images qui <strong>sont actuellement utilis\u00e9es dans Kubernetes<\/strong>. La suppression de ces images peut entra\u00eener des co\u00fbts importants li\u00e9s \u00e0 l'arr\u00eat de la production (par exemple, les images peuvent \u00eatre n\u00e9cessaires lors de la r\u00e9plication) ou compromettre les efforts de l'\u00e9quipe qui se consacre au d\u00e9bogage sur l'un des environnements. <i>(C'est pourquoi nous avons m\u00eame cr\u00e9\u00e9 un <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/k8s-image-availability-exporter\"><i>exportateur Prometheus<\/i><\/a><\/noindex><i>, qui surveille l'absence de telles images dans tout cluster Kubernetes.)<\/i><\/p>\n<p>2. Le deuxi\u00e8me (moins \u00e9vident, mais toujours tr\u00e8s important et \u00e0 nouveau li\u00e9 \u00e0 l'exploitation) \u2014 les images qui <strong>sont n\u00e9cessaires pour revenir en arri\u00e8re en cas de probl\u00e8mes majeurs<\/strong> dans la version actuelle. Par exemple, dans le cas de Helm, ce sont les images utilis\u00e9es dans les versions enregistr\u00e9es du d\u00e9ploiement. (\u00c0 propos, par d\u00e9faut, Helm a une limite de 256 r\u00e9visions, mais est-ce que quelqu'un a vraiment besoin de conserver <i>autant<\/i> de versions ?..) En effet, nous stockons des versions dans le but de pouvoir les utiliser ult\u00e9rieurement, c'est-\u00e0-dire 'revenir en arri\u00e8re' si n\u00e9cessaire.<\/p>\n<p>3. Le troisi\u00e8me \u2014 <strong>les besoins des d\u00e9veloppeurs<\/strong>: toutes les images li\u00e9es \u00e0 leurs travaux en cours. Par exemple, si nous examinons un PR, il est logique de conserver l'image correspondant au dernier commit et, disons, au commit pr\u00e9c\u00e9dent : ainsi, le d\u00e9veloppeur pourra revenir rapidement \u00e0 n'importe quelle t\u00e2che et travailler avec les derni\u00e8res modifications. <\/p>\n<p>4. Le quatri\u00e8me \u2014 les images qui <strong>correspondent aux versions de notre application<\/strong>, c'est-\u00e0-dire qui sont le produit final : v1.0.0, 20.04.01, sierra, etc.<\/p>\n<p>NB : Les crit\u00e8res \u00e9tablis ici ont \u00e9t\u00e9 formul\u00e9s sur la base de l'exp\u00e9rience avec des dizaines d'\u00e9quipes de d\u00e9veloppement de diverses entreprises. Cependant, bien s\u00fbr, selon les particularit\u00e9s des processus de d\u00e9veloppement et de l'infrastructure utilis\u00e9e (par exemple, Kubernetes n'est pas utilis\u00e9), ces crit\u00e8res peuvent diff\u00e9rer. <\/p>\n<h2>Conformit\u00e9 aux crit\u00e8res et solutions existantes<\/h2>\n<p>\nLes services populaires de registre de conteneurs proposent g\u00e9n\u00e9ralement leurs politiques de nettoyage des images : vous pouvez d\u00e9finir les conditions dans lesquelles un tag est supprim\u00e9 du registre. Cependant, les options de ces conditions sont limit\u00e9es par des param\u00e8tres tels que les noms, les dates de cr\u00e9ation et le nombre de tags*.<\/p>\n<p><i>* D\u00e9pend des impl\u00e9mentations sp\u00e9cifiques de container registry. Nous avons examin\u00e9 les possibilit\u00e9s des solutions suivantes : Azure CR, Docker Hub, ECR, GCR, GitHub Packages, GitLab Container Registry, Harbor Registry, JFrog Artifactory, Quay.io \u2014 \u00e0 partir de septembre 2020.<\/i><\/p>\n<p>Cet ensemble de param\u00e8tres est tout \u00e0 fait suffisant pour r\u00e9pondre au quatri\u00e8me crit\u00e8re \u2014 c'est-\u00e0-dire s\u00e9lectionner des images correspondant aux versions. Cependant, pour tous les autres crit\u00e8res, il faut opter pour une solution de compromis (une politique plus stricte ou, au contraire, plus indulgente) \u2014 selon les attentes et les possibilit\u00e9s financi\u00e8res.<\/p>\n<p>Par exemple, le troisi\u00e8me crit\u00e8re \u2014 concernant les besoins des d\u00e9veloppeurs \u2014 peut \u00eatre r\u00e9solu en organisant des processus au sein des \u00e9quipes : nomination sp\u00e9cifique des images, tenue de listes d'autorisation sp\u00e9ciales et accords internes. Mais en fin de compte, il faut cependant automatiser cela. Et si les options des solutions pr\u00eates \u00e0 l'emploi ne suffisent pas, il faut cr\u00e9er sa propre solution.<\/p>\n<p>La situation est similaire pour les deux premiers crit\u00e8res : ils ne peuvent pas \u00eatre satisfaits sans obtenir des donn\u00e9es d'un syst\u00e8me externe \u2014 celui o\u00f9 le d\u00e9ploiement des applications a lieu (dans notre cas, il s'agit de Kubernetes).<\/p>\n<h3>Illustration du workflow dans Git<\/h3>\n<p>\nSupposons que vous travaillez selon un sch\u00e9ma similaire dans Git :<\/p>\n<p><img decoding=\"async\" alt=\"Le probl\u00e8me de l&#039;\u00ab intelligent \u00bb nettoyage des images de conteneurs et sa solution dans werf\" src=\"\/wp-content\/uploads\/2020\/10\/45c9bfb6755da1b4d6be05b51ab17429.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Les images des conteneurs, marqu\u00e9es par une ic\u00f4ne avec une t\u00eate dans le sch\u00e9ma, sont actuellement d\u00e9ploy\u00e9es dans Kubernetes pour certains utilisateurs (utilisateurs finaux, testeurs, gestionnaires, etc.) ou sont utilis\u00e9es par les d\u00e9veloppeurs pour le d\u00e9bogage et des objectifs similaires.<\/i><\/p>\n<p>Que se passera-t-il si les politiques de nettoyage permettent de conserver (ne pas supprimer) les images uniquement <b>selon des noms de tags d\u00e9finis<\/b>?<\/p>\n<p><img decoding=\"async\" alt=\"Le probl\u00e8me de l&#039;\u00ab intelligent \u00bb nettoyage des images de conteneurs et sa solution dans werf\" src=\"\/wp-content\/uploads\/2020\/10\/e57ff24cb818799d28e8eb006aea2eb5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl est \u00e9vident qu'un tel sc\u00e9nario ne ravira personne.<\/p>\n<p>Que changera si les politiques permettent de ne pas supprimer les images <b>selon un intervalle de temps donn\u00e9 \/ le nombre de derniers commits<\/b>?<\/p>\n<p><img decoding=\"async\" alt=\"Le probl\u00e8me de l&#039;\u00ab intelligent \u00bb nettoyage des images de conteneurs et sa solution dans werf\" src=\"\/wp-content\/uploads\/2020\/10\/7743581e6e64affb0a207ee156c00f6e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe r\u00e9sultat est devenu significativement meilleur, mais reste encore \u00e9loign\u00e9 de l'id\u00e9al. En effet, nous avons toujours des d\u00e9veloppeurs qui ont besoin d'images dans le registre (ou m\u00eame d\u00e9ploy\u00e9es dans K8s) pour d\u00e9boguer des bugs\u2026<\/p>\n<p>En r\u00e9sumant la situation actuelle sur le march\u00e9 : les fonctionnalit\u00e9s disponibles dans les registres de conteneurs n'offrent pas la flexibilit\u00e9 n\u00e9cessaire pour le nettoyage, et la principale raison en est <strong>l'absence d'interaction avec le monde ext\u00e9rieur<\/strong>. Par cons\u00e9quent, les \u00e9quipes qui n\u00e9cessitent une telle flexibilit\u00e9 doivent impl\u00e9menter elles-m\u00eames la suppression des images \u00ab de l'ext\u00e9rieur \u00bb en utilisant l'API de Docker Registry (ou l'API native de l'impl\u00e9mentation correspondante).<\/p>\n<p>Cependant, nous recherchions une solution universelle qui automatiserait le nettoyage des images pour diff\u00e9rentes \u00e9quipes utilisant diff\u00e9rents registres...<\/p>\n<h2>Notre chemin vers un nettoyage universel des images<\/h2>\n<p>\nD'o\u00f9 vient ce besoin ? Il se trouve que nous ne sommes pas un groupe de d\u00e9veloppeurs isol\u00e9, mais une \u00e9quipe qui soutient plusieurs d'entre eux, en les aidant \u00e0 r\u00e9soudre de mani\u00e8re globale les questions de CI\/CD. Et l'outil technique principal pour cela est l'utilitaire Open Source <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.werf.io\/\">werf<\/a><\/noindex>. Sa particularit\u00e9 est qu'il n'ex\u00e9cute pas une seule fonction, mais accompagne les processus de livraison continue \u00e0 toutes les \u00e9tapes : de la construction au d\u00e9ploiement.<\/p>\n<p>La publication dans le registre* des images (imm\u00e9diatement apr\u00e8s leur construction) est une fonctionnalit\u00e9 \u00e9vidente d'un tel utilitaire. Et puisque les images y sont stock\u00e9es, si votre stockage n'est pas illimit\u00e9, il faut \u00e9galement s'assurer de leur nettoyage ult\u00e9rieur. Nous expliquerons comment nous avons r\u00e9ussi cela, en satisfaisant tous les crit\u00e8res pos\u00e9s.<\/p>\n<p><i>* Bien que les registres eux-m\u00eames puissent \u00eatre diff\u00e9rents (Docker Registry, GitLab Container Registry, Harbor, etc.), leurs utilisateurs rencontrent les m\u00eames probl\u00e8mes. La solution universelle dans notre cas ne d\u00e9pend pas de l'impl\u00e9mentation du registre, car elle s'ex\u00e9cute en dehors des registres eux-m\u00eames et propose un comportement identique pour tous.<\/i><\/p>\n<p>Bien que nous utilisions werf comme exemple d'impl\u00e9mentation, nous esp\u00e9rons que les approches utilis\u00e9es seront utiles \u00e0 d'autres \u00e9quipes confront\u00e9es \u00e0 des difficult\u00e9s similaires.<\/p>\n<p>Ainsi, nous nous sommes attaqu\u00e9s \u00e0 <i>l'impl\u00e9mentation<\/i> d'un m\u00e9canisme de nettoyage des images \u2014 plut\u00f4t que d'utiliser les possibilit\u00e9s d\u00e9j\u00e0 int\u00e9gr\u00e9es dans les registres de conteneurs. La premi\u00e8re \u00e9tape a \u00e9t\u00e9 l'utilisation de l'API de Docker Registry pour cr\u00e9er ces politiques primitives sur le nombre de balises et leur date de cr\u00e9ation (mentionn\u00e9es ci-dessus). \u00c0 celles-ci a \u00e9t\u00e9 ajout\u00e9e <strong>une liste d'autorisation bas\u00e9e sur les images utilis\u00e9es dans l'infrastructure d\u00e9ploy\u00e9e<\/strong>, c'est-\u00e0-dire Kubernetes. Pour cela, il suffisait de passer par l'API Kubernetes pour parcourir toutes les ressources d\u00e9ploy\u00e9es et obtenir une liste de valeurs. <code>image<\/code>.<\/p>\n<p>Cette solution triviale a r\u00e9solu le probl\u00e8me le plus critique (crit\u00e8re n\u00b01), mais n'\u00e9tait que le d\u00e9but de notre parcours pour am\u00e9liorer le m\u00e9canisme de nettoyage. Le prochain \u2014 et beaucoup plus int\u00e9ressant \u2014 pas a \u00e9t\u00e9 de r\u00e9soudre <strong>le lien entre les images publi\u00e9es et l'historique Git.<\/strong>.<\/p>\n<h3>Sch\u00e9mas de balisage<\/h3>\n<p>\nPour commencer, nous avons choisi une approche o\u00f9 l'image finale devait conserver les informations n\u00e9cessaires pour le nettoyage, et nous avons construit le processus sur des sch\u00e9mas de balisage. Lors de la publication de l'image, l'utilisateur choisissait une option de balisage (<code>branche-git<\/code>, <code>commit-git<\/code> ou <code>tag-git<\/code>) et utilisait la valeur correspondante. Dans les syst\u00e8mes CI, ces valeurs \u00e9taient d\u00e9finies automatiquement sur la base des variables d'environnement. En essence, <strong>l'image finale \u00e9tait li\u00e9e \u00e0 un certain \u00e9l\u00e9ment Git<\/strong>, conservant les donn\u00e9es n\u00e9cessaires pour le nettoyage dans les labels.<\/p>\n<p>Dans le cadre de cette approche, un ensemble de politiques a \u00e9t\u00e9 mis en place, permettant d'utiliser Git comme la seule source de v\u00e9rit\u00e9 :<\/p>\n<ul>\n<li>Lors de la suppression d'une branche\/tag dans Git, les images associ\u00e9es \u00e9taient automatiquement supprim\u00e9es du registre.<\/li>\n<li>Le nombre d'images li\u00e9es aux tags et commits Git pouvait \u00eatre r\u00e9gul\u00e9 par le nombre de tags utilis\u00e9s dans le sch\u00e9ma choisi et par le moment de cr\u00e9ation du commit li\u00e9.<\/li>\n<\/ul>\n<p>\nDans l'ensemble, l'impl\u00e9mentation obtenue satisfaisait nos besoins, mais un nouveau d\u00e9fi nous attendait bient\u00f4t. En effet, pendant l'utilisation des sch\u00e9mas de balisage bas\u00e9s sur les \u00e9l\u00e9ments Git, nous avons rencontr\u00e9 plusieurs inconv\u00e9nients. <i>(Comme leur description d\u00e9passe le cadre de cet article, tous ceux qui le souhaitent peuvent consulter les d\u00e9tails <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/495112\/\"><i>ici<\/i><\/a><\/noindex><i>.)<\/i> Ainsi, ayant d\u00e9cid\u00e9 de passer \u00e0 une approche de balisage plus efficace (balisage bas\u00e9 sur le contenu), nous avons d\u00fb revoir l'impl\u00e9mentation du nettoyage des images.<\/p>\n<h3>Nouvel algorithme<\/h3>\n<p>\nPourquoi ? Lors du balisage dans le cadre du balisage bas\u00e9 sur le contenu, chaque tag peut correspondre \u00e0 de nombreux commits dans Git. Lors du nettoyage des images, il n'est plus possible de se baser <i>uniquement<\/i> sur le commit o\u00f9 le nouveau tag a \u00e9t\u00e9 ajout\u00e9 au registre.<\/p>\n<p>Pour le nouvel algorithme de nettoyage, il a \u00e9t\u00e9 d\u00e9cid\u00e9 de s'\u00e9loigner des sch\u00e9mas de balisage et de construire <strong>le processus sur des m\u00e9ta-images,<\/strong>chacune d'entre elles conservant une association de :<\/p>\n<ul>\n<li>le commit lors duquel l'image a \u00e9t\u00e9 publi\u00e9e (peu importe si l'image a \u00e9t\u00e9 ajout\u00e9e, modifi\u00e9e ou est rest\u00e9e la m\u00eame dans le registre des conteneurs);<\/li>\n<li>et notre identifiant interne correspondant \u00e0 l'image assembl\u00e9e.<\/li>\n<\/ul>\n<p>\nEn d'autres termes, un lien a \u00e9t\u00e9 \u00e9tabli <strong>entre les tags publi\u00e9s et les commits dans Git.<\/strong>.<\/p>\n<h3>La configuration finale et l'algorithme g\u00e9n\u00e9ral<\/h3>\n<p>\nLes utilisateurs ont d\u00e9sormais acc\u00e8s \u00e0 des politiques pour la configuration du nettoyage, qui d\u00e9terminent la s\u00e9lection des images pertinentes. Chaque politique est d\u00e9finie par :<\/p>\n<ul>\n<li>un ensemble de r\u00e9f\u00e9rences, c'est-\u00e0-dire des tags ou des branches Git, qui sont utilis\u00e9s lors du scan;<\/li>\n<li>et une limite du nombre d'images recherch\u00e9es pour chaque r\u00e9f\u00e9rence de cet ensemble.<\/li>\n<\/ul>\n<p>\nPour illustrer, voici \u00e0 quoi ressemble la configuration par d\u00e9faut des politiques :<\/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>\nCette configuration contient trois politiques qui correspondent aux r\u00e8gles suivantes :<\/p>\n<ol>\n<li>Conserver l'image pour les 10 derniers tags Git (en fonction de la date de cr\u00e9ation du tag).<\/li>\n<li>Conserver au maximum 2 images publi\u00e9es au cours de la derni\u00e8re semaine pour au maximum 10 branches ayant \u00e9t\u00e9 actives au cours de la derni\u00e8re semaine.<\/li>\n<li>Conserver 10 images pour les branches <code>main<\/code>, <code>staging<\/code> et <code>production<\/code>.<\/li>\n<\/ol>\n<p>\nL'algorithme final se r\u00e9sume aux \u00e9tapes suivantes :<\/p>\n<ul>\n<li>R\u00e9cup\u00e9rer les manifestes du registre des conteneurs.<\/li>\n<li>Exclure les images utilis\u00e9es dans Kubernetes, car celles-ci ont d\u00e9j\u00e0 \u00e9t\u00e9 s\u00e9lectionn\u00e9es en interrogeant l'API K8s.<\/li>\n<li>Scanner l'historique Git et exclure les images selon les politiques d\u00e9finies.<\/li>\n<li>Supprimer les images restantes.<\/li>\n<\/ul>\n<p>\nRevenons \u00e0 notre illustration, voici ce que cela donne avec werf :<\/p>\n<p><img decoding=\"async\" alt=\"Le probl\u00e8me de l&#039;\u00ab intelligent \u00bb nettoyage des images de conteneurs et sa solution dans werf\" src=\"\/wp-content\/uploads\/2020\/10\/c453092dca23860a0dda604843845507.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCependant, m\u00eame si vous n'utilisez pas werf, une approche similaire pour le nettoyage avanc\u00e9 des images \u2014 dans une forme ou une autre (selon l'approche pr\u00e9f\u00e9r\u00e9e pour le balisage des images) \u2014 peut \u00eatre appliqu\u00e9e dans d'autres syst\u00e8mes\/utilitaires. Il suffit de garder \u00e0 l'esprit les probl\u00e8mes qui se pr\u00e9sentent et de trouver les opportunit\u00e9s dans votre pile qui permettent d'int\u00e9grer leur solution de mani\u00e8re fluide. Nous esp\u00e9rons que le chemin que nous avons parcouru aidera \u00e0 examiner votre cas sp\u00e9cifique avec de nouveaux d\u00e9tails et r\u00e9flexions.<\/p>\n<h2>Conclusion<\/h2>\n<p><\/p>\n<ul>\n<li>T\u00f4t ou tard, la plupart des \u00e9quipes se heurtent au probl\u00e8me de la saturation du registre. <\/li>\n<li>Lors de la recherche de solutions, il est essentiel de d\u00e9finir en premier lieu les crit\u00e8res de pertinence de l'image.<\/li>\n<li>Les outils propos\u00e9s par les services populaires de container registry permettent d'organiser un nettoyage tr\u00e8s simple qui ne prend pas en compte le \u00ab monde ext\u00e9rieur \u00bb : les images utilis\u00e9es dans Kubernetes et les sp\u00e9cificit\u00e9s des flux de travail au sein de l'\u00e9quipe.<\/li>\n<li>Un algorithme flexible et efficace doit avoir une compr\u00e9hension des processus CI\/CD et ne doit pas se limiter uniquement aux donn\u00e9es des images Docker.<\/li>\n<\/ul>\n<p><\/p>\n<h2>P.S.<\/h2>\n<p>\nLisez aussi dans notre blog :<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/495112\/\">Tagging bas\u00e9 sur le contenu dans l'assembleur werf : pourquoi et comment cela fonctionne-t-il ?<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/476646\/\">Fusion \u00e0 trois voies dans werf : d\u00e9ploiement dans Kubernetes avec Helm \u00ab sur st\u00e9ro\u00efdes \u00bb<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465131\/\">Support monorepo et multirepo dans werf et quel rapport avec Docker Registry<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/493170\/\">Version 1.1 de werf : am\u00e9liorations dans l'assembleur aujourd'hui et plans futurs<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Source : <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.2 - 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\/fr\/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.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Le probl\u00e8me du nettoyage \u00ab intelligent \u00bb des images de conteneurs et sa solution dans werf | ProHoster","description":"L'article a \u00e9t\u00e9 examin\u00e9.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/96065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=96065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/96065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/96066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=96065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=96065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=96065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}