{"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\/de\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf","title":{"rendered":"Das Problem der \"intelligenten\" Bereinigung von Container-Images und dessen L\u00f6sung in werf","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Das Problem der &quot;intelligenten&quot; Bereinigung von Container-Images und dessen L\u00f6sung in werf\" src=\"\/wp-content\/uploads\/2020\/10\/1410cea46bb8dcdc3ac06db11ed5a402.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn dem Artikel wird die Problematik der Bereinigung von Images behandelt, die in den Registries von Containern (Docker Registry und \u00e4hnlichen) im Kontext moderner CI\/CD-Pipelines f\u00fcr Cloud-native Anwendungen gespeichert werden, die in Kubernetes bereitgestellt werden. Es werden die Hauptkriterien f\u00fcr die Relevanz von Images und die daraus resultierenden Schwierigkeiten bei der Automatisierung der Bereinigung, der Platzersparnis und der Erf\u00fcllung der Anforderungen der Teams beschrieben. Schlie\u00dflich zeigen wir am Beispiel eines konkreten Open Source-Projekts, wie man diese Schwierigkeiten \u00fcberwinden kann.<\/p>\n<h2>Einf\u00fchrung<\/h2>\n<p>\nDie Anzahl der Images in der Container-Registry kann rasant ansteigen, wodurch mehr Speicherplatz beansprucht wird, was wiederum die Kosten erheblich erh\u00f6ht. Um das Wachstum des in der Registry belegten Speicherplatzes zu kontrollieren, zu begrenzen oder auf einem akzeptablen Niveau zu halten, wird Folgendes empfohlen:<\/p>\n<ol>\n<li>eine feste Anzahl von Tags f\u00fcr Images zu verwenden;<\/li>\n<li>auf irgendeine Weise Images zu bereinigen.<\/li>\n<\/ol>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nDiese erste Einschr\u00e4nkung ist manchmal f\u00fcr kleine Teams akzeptabel. Wenn den Entwicklern die konstanten Tags (<code>latest<\/code>, <code>main<\/code>, <code>test<\/code>, <code>boris<\/code> usw.) ausreichen, wird die Registry nicht wachsen und man muss lange Zeit nicht an die Bereinigung denken. Alle nicht mehr relevanten Images werden \u00fcberschrieben, und es bleibt einfach keine Arbeit f\u00fcr die Bereinigung (das geschieht alles durch den integrierten Garbage Collector).<\/p>\n<p>Dennoch schr\u00e4nkt dieser Ansatz die Entwicklung stark ein und ist nur selten auf CI\/CD in modernen Projekten anwendbar. Ein wesentlicher Teil der Entwicklung ist geworden <strong>Automatisierung<\/strong>, was es erm\u00f6glicht, neuen Funktionen viel schneller zu testen, bereitzustellen und an die Benutzer zu liefern. Zum Beispiel wird in all unseren Projekten bei jedem Commit automatisch eine CI-Pipeline erstellt. Dort wird ein Image erstellt, getestet, in verschiedenen Kubernetes-Umgebungen f\u00fcr Debugging und weitere Pr\u00fcfungen bereitgestellt, und wenn alles gut ist \u2013 gelangen die \u00c4nderungen zum Endbenutzer. Und das ist l\u00e4ngst keine Raketenwissenschaft mehr, sondern Alltag f\u00fcr viele \u2013 wahrscheinlich auch f\u00fcr Sie, da Sie diesen Artikel lesen.<\/p>\n<p>Da die Behebung von Fehlern und die Entwicklung neuer Funktionen parallel vor sich gehen und Releases mehrere Male am Tag durchgef\u00fchrt werden k\u00f6nnen, ist es offensichtlich, dass der Entwicklungsprozess mit einer erheblichen Anzahl von Commits begleitet wird, was bedeutet \u2013 <strong>eine gro\u00dfe Anzahl von Images in der Registry<\/strong>. Infolgedessen stellt sich die dringende Frage der Organisation einer effektiven Bereinigung der Registry, d.h. der Entfernung nicht mehr relevanter Images.<\/p>\n<p>Aber wie kann man \u00fcberhaupt feststellen, ob ein Image relevant ist?<\/p>\n<h2>Kriterien der Relevanz von Images<\/h2>\n<p>\nIn der \u00fcberwiegenden Mehrzahl der F\u00e4lle werden die Hauptkriterien wie folgt aussehen:<\/p>\n<p>1. Das erste (das offensichtlichste und kritischste von allen) sind die Images, die <strong>momentan in Kubernetes verwendet werden<\/strong>. Das Entfernen dieser Images kann zu erheblichen Kosten durch Ausfallzeiten in der Produktion f\u00fchren (zum Beispiel k\u00f6nnen Images bei der Replikation ben\u00f6tigt werden) oder die Bem\u00fchungen des Teams, das an der Fehlerbehebung in einer der Umgebungen arbeitet, zunichte machen. <i>(Aus diesem Grund haben wir sogar einen speziellen <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/k8s-image-availability-exporter\"><i>Prometheus-Exporter<\/i><\/a><\/noindex><i>, der das Fehlen solcher Images in jedem Kubernetes-Cluster \u00fcberwacht.)<\/i><\/p>\n<p>2. Das zweite (weniger offensichtlich, aber ebenfalls sehr wichtig und wieder relevant f\u00fcr den Betrieb) sind die Images, die <strong>f\u00fcr Rollbacks im Falle schwerwiegender Probleme<\/strong> in der aktuellen Version erforderlich sind. Beispielsweise sind dies im Falle von Helm die Images, die in den gespeicherten Versionen des Releases verwendet werden. (\u00dcbrigens hat Helm standardm\u00e4\u00dfig ein Limit von 256 Revisionen, aber es bezweifelt jemand ernsthaft, dass es einen Bedarf gibt, so viele <i>Versionen zu speichern?..) Schlie\u00dflich speichern wir Versionen, damit wir sie sp\u00e4ter verwenden k\u00f6nnen, das hei\u00dft, um \"zur\u00fcckzuspringen\", falls notwendig.<\/i> 3. Das dritte sind die<\/p>\n<p>Bed\u00fcrfnisse der Entwickler: <strong>alle Images, die mit ihren aktuellen Arbeiten zusammenh\u00e4ngen. Wenn wir beispielsweise einen PR betrachten, macht es Sinn, das Image zu behalten, das dem letzten Commit und, sagen wir, dem vorherigen Commit entspricht: So kann der Entwickler schnell zu jeder Aufgabe zur\u00fcckkehren und mit den letzten \u00c4nderungen arbeiten.<\/strong>4. Das vierte sind die Images, die <\/p>\n<p>den Versionen unserer Anwendung entsprechen <strong>, d.h. das Endprodukt sind: v1.0.0, 20.04.01, sierra usw.<\/strong>NB: Die hier definierten Kriterien wurden auf der Grundlage der Erfahrungen mit Dutzenden von Entwicklungsteams aus verschiedenen Unternehmen formuliert. Allerdings k\u00f6nnen diese Kriterien je nach den Besonderheiten in den Entwicklungsprozessen und der verwendeten Infrastruktur (zum Beispiel wenn Kubernetes nicht verwendet wird) variieren.<\/p>\n<p>Erf\u00fcllung der Kriterien und bestehende L\u00f6sungen <\/p>\n<h2>Beliebte Services mit Container-Registrys bieten in der Regel ihre eigenen Richtlinien zur Bereinigung von Images an: Dort k\u00f6nnen Sie Bedingungen definieren, unter denen ein Tag aus dem Registry entfernt wird. Allerdings sind die M\u00f6glichkeiten f\u00fcr diese Bedingungen auf Parameter wie Namen, Erstellungszeit und Anzahl der Tags* beschr\u00e4nkt.<\/h2>\n<p>\nBeliebte Dienste mit Container-Registries bieten in der Regel ihre eigenen Richtlinien zur Bereinigung von Images an: Sie k\u00f6nnen darin die Bedingungen festlegen, unter denen ein Tag aus der Registry gel\u00f6scht wird. Die M\u00f6glichkeiten dieser Bedingungen sind jedoch auf Parameter wie Namen, Erstellungszeit und Anzahl der Tags* beschr\u00e4nkt.<\/p>\n<p><i>* \u0417\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 container registry. \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439: Azure CR, Docker Hub, ECR, GCR, GitHub Packages, GitLab Container Registry, Harbor Registry, JFrog Artifactory, Quay.io \u2014 \u043f\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u043d\u0430 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c&#8217;2020.<\/i><\/p>\n<p>Ein solches Set an Parametern reicht aus, um das vierte Kriterium zu erf\u00fcllen \u2013 das hei\u00dft, um Images auszuw\u00e4hlen, die den Versionen entsprechen. F\u00fcr alle anderen Kriterien muss jedoch eine Kompromissl\u00f6sung gew\u00e4hlt werden (eine strengere oder im Gegenteil eine nachsichtige Politik) \u2013 abh\u00e4ngig von den Erwartungen und finanziellen M\u00f6glichkeiten.<\/p>\n<p>Das dritte Kriterium \u2013 das mit den Bed\u00fcrfnissen der Entwickler verkn\u00fcpft ist \u2013 kann beispielsweise durch die Organisation von Prozessen innerhalb der Teams gel\u00f6st werden: spezifische Namensgebung von Images, F\u00fchrung spezieller Allow-Listen und interne Vereinbarungen. Letztendlich muss es jedoch dennoch automatisiert werden. Wenn die M\u00f6glichkeiten vorhandener L\u00f6sungen nicht ausreichen, muss man etwas Eigenes entwickeln.<\/p>\n<p>\u00c4hnlich verh\u00e4lt es sich mit den zwei ersten Kriterien: Diese k\u00f6nnen nicht ohne die Erfassung von Daten aus einem externen System erf\u00fcllt werden \u2013 n\u00e4mlich dem System, in dem die Anwendungen bereitgestellt werden (in unserem Fall Kubernetes).<\/p>\n<h3>Illustration des Workflows in Git<\/h3>\n<p>\nAngenommen, Sie arbeiten ungef\u00e4hr nach folgendem Schema in Git:<\/p>\n<p><img decoding=\"async\" alt=\"Das Problem der &quot;intelligenten&quot; Bereinigung von Container-Images und dessen L\u00f6sung in werf\" src=\"\/wp-content\/uploads\/2020\/10\/45c9bfb6755da1b4d6be05b51ab17429.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Auf dem Diagramm sind die Container-Images mit K\u00f6pfen markiert, die derzeit in Kubernetes f\u00fcr beliebige Benutzer (Endanwender, Tester, Manager usw.) bereitgestellt oder von Entwicklern zur Fehlersuche und \u00e4hnlichen Zwecken verwendet werden.<\/i><\/p>\n<p>Was passiert, wenn die Aufr\u00e4umpolitiken zulassen, dass Images nur <b>nach bestimmten Tag-Namen<\/b>?<\/p>\n<p><img decoding=\"async\" alt=\"Das Problem der &quot;intelligenten&quot; Bereinigung von Container-Images und dessen L\u00f6sung in werf\" src=\"\/wp-content\/uploads\/2020\/10\/e57ff24cb818799d28e8eb006aea2eb5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\noffengelassen (nicht gel\u00f6scht) werden?<\/p>\n<p>Offensichtlich wird ein solches Szenario niemanden erfreuen. <b>Was w\u00fcrde sich \u00e4ndern, wenn die Politiken erlauben, Images nicht zu l\u00f6schen<\/b>?<\/p>\n<p><img decoding=\"async\" alt=\"Das Problem der &quot;intelligenten&quot; Bereinigung von Container-Images und dessen L\u00f6sung in werf\" src=\"\/wp-content\/uploads\/2020\/10\/7743581e6e64affb0a207ee156c00f6e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nnach einem bestimmten Zeitintervall \/ der Anzahl der letzten Commits?<\/p>\n<p>Das Ergebnis wurde deutlich besser, ist jedoch immer noch weit von ideal entfernt. Immerhin haben wir immer noch Entwickler, die Images im Repository (oder sogar in K8s bereitgestellt) zur Fehlersuche ben\u00f6tigen ... <strong>Zusammenfassend l\u00e4sst sich sagen, dass die im Container-Repository verf\u00fcgbaren Funktionen nicht gen\u00fcgend Flexibilit\u00e4t bei der Bereinigung bieten, und der Hauptgrund daf\u00fcr ist, dass es nicht m\u00f6glich ist, mit der Au\u00dfenwelt zu interagieren.<\/strong>Das bedeutet, dass Teams, die eine solche Flexibilit\u00e4t ben\u00f6tigen, gezwungen sind, das L\u00f6schen von Images \"von au\u00dfen\" selbst zu implementieren, indem sie die Docker Registry API (oder die native API der entsprechenden Implementierung) verwenden.<\/p>\n<p>Wir haben jedoch nach einer universellen L\u00f6sung gesucht, die die Bereinigung von Images f\u00fcr verschiedene Teams automatisiert, die unterschiedliche Registries verwenden ...<\/p>\n<h2>Unser Weg zur universellen Bereinigung von Images<\/h2>\n<p>\nWoher kommt diese Notwendigkeit? Wir sind keine isolierte Gruppe von Entwicklern, sondern ein Team, das mehreren solchen Gruppen dient und ihnen hilft, Fragen zu CI\/CD umfassend zu l\u00f6sen. Das wichtigste technische Werkzeug daf\u00fcr ist das Open Source-Tool <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.werf.io\/\">werf<\/a><\/noindex>. Sein Merkmal ist, dass es nicht nur eine einzelne Funktion ausf\u00fchrt, sondern die kontinuierlichen Lieferprozesse in allen Phasen begleitet: von der Erstellung bis zur Bereitstellung.<\/p>\n<p>Die Ver\u00f6ffentlichung in der Registry* von Images (unmittelbar nach ihrer Erstellung) ist eine offensichtliche Funktion eines solchen Tools. Da die Images dort zur Speicherung abgelegt werden, muss man\u2014 falls der Speicher nicht unbegrenzt ist\u2014 auch f\u00fcr deren anschlie\u00dfende Bereinigung sorgen. Im Folgenden wird erl\u00e4utert, wie wir darin erfolgreich waren und alle vorgegebenen Kriterien erf\u00fcllt haben.<\/p>\n<p><i>* Obwohl die Registries unterschiedlich sein k\u00f6nnen (Docker Registry, GitLab Container Registry, Harbor usw.), sehen sich ihre Benutzer denselben Problemen gegen\u00fcber. Die universelle L\u00f6sung h\u00e4ngt in unserem Fall nicht von der Implementierung der Registry ab, da sie au\u00dferhalb der Registries selbst ausgef\u00fchrt wird und f\u00fcr alle das gleiche Verhalten bietet.<\/i><\/p>\n<p>Obwohl wir werf als Beispiel f\u00fcr die Implementierung verwenden, hoffen wir, dass die verwendeten Ans\u00e4tze auch anderen Teams, die \u00e4hnlichen Herausforderungen gegen\u00fcberstehen, von Nutzen sein werden.<\/p>\n<p>Also haben wir uns mit der <i>externen<\/i> Implementierung eines Mechanismus zur Bereinigung von Images besch\u00e4ftigt \u2014 anstelle der bereits in die Registries f\u00fcr Container integrierten M\u00f6glichkeiten. Der erste Schritt war die Verwendung der Docker Registry API zur Erstellung der oben erw\u00e4hnten grundlegenden Richtlinien hinsichtlich der Anzahl von Tags und deren Erstellungszeit. Dies wurde durch eine <strong>Allow-Liste basierend auf den in der bereitgestellten Infrastruktur verwendeten Images erg\u00e4nzt<\/strong>, d.h. Kubernetes. Daf\u00fcr gen\u00fcgte es, \u00fcber die Kubernetes-API alle bereitgestellten Ressourcen zu durchlaufen und eine Liste von Werten zu erhalten. <code>Image<\/code>.<\/p>\n<p>Diese triviale L\u00f6sung hat das kritischste Problem (Kriterium Nr. 1) behoben, war jedoch nur der Anfang unseres Weges zur Verbesserung des Reinigungsmechanismus. Der n\u00e4chste \u2013 und weitaus interessantere \u2013 Schritt war die Entscheidung, <strong>die ver\u00f6ffentlichten Images mit der Geschichte von Git zu verkn\u00fcpfen.<\/strong>.<\/p>\n<h3>Tagging-Schemata<\/h3>\n<p>\nZu Beginn w\u00e4hlten wir einen Ansatz, bei dem das endg\u00fcltige Image die erforderlichen Informationen f\u00fcr die Reinigung speichern sollte, und wir bauten den Prozess auf Tagging-Schemata auf. Bei der Ver\u00f6ffentlichung des Images w\u00e4hlte der Benutzer eine bestimmte Tagging-Option (<code>git-branch<\/code>, <code>git-commit<\/code> oder <code>git-tag<\/code>), und verwendete den entsprechenden Wert. In CI-Systemen wurden diese Werte automatisch basierend auf Umgebungsvariablen gesetzt. Im Wesentlichen <strong>wurde das endg\u00fcltige Image mit einem bestimmten Git-Primitiv verkn\u00fcpft<\/strong>, das die notwendigen Daten f\u00fcr die Bereinigung in Labels speichert.<\/p>\n<p>Im Rahmen eines solchen Ansatzes entstand ein Satz von Richtlinien, der es erm\u00f6glichte, Git als einzige Informationsquelle zu verwenden:<\/p>\n<ul>\n<li>Beim L\u00f6schen von Branches\/Tags wurden automatisch auch die zugeh\u00f6rigen Images im Registry gel\u00f6scht.<\/li>\n<li>Die Anzahl der Images, die mit Git-Tags und -Commits verkn\u00fcpft sind, konnte durch die Anzahl der in dem gew\u00e4hlten Schema verwendeten Tags und den Zeitpunkt der Erstellung des zugeh\u00f6rigen Commits geregelt werden.<\/li>\n<\/ul>\n<p>\nInsgesamt erf\u00fcllte die entstandene Implementierung unsere Bed\u00fcrfnisse, aber bald wartete eine neue Herausforderung auf uns. W\u00e4hrend unserer Nutzung der Tagging-Schemata anhand von Git-Primitiven stie\u00dfen wir auf eine Reihe von Nachteilen. <i>(Da ihre Beschreibung den Rahmen dieses Artikels sprengt, k\u00f6nnen sich Interessierte \u00fcber die Details informieren. <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/495112\/\"><i>hier<\/i><\/a><\/noindex><i>.)<\/i> Daher mussten wir, nachdem wir uns f\u00fcr einen effektiveren Ansatz zum Tagging (content-based tagging) entschieden hatten, auch die Implementierung der Image-Reinigung \u00fcberdenken.<\/p>\n<h3>Ein neuer Algorithmus<\/h3>\n<p>\nWarum? Bei der Tagging im Rahmen von content-based kann jeder Tag mehreren Commits in Git entsprechen. Bei der Bereinigung von Images kann man nicht mehr aus <i>nur<\/i> dem Commit ausgehen, in dem der neue Tag zum Registry hinzugef\u00fcgt wurde.<\/p>\n<p>F\u00fcr den neuen Algorithmus zur Image-Reinigung wurde entschieden, von Tagging-Schemata abzugehen und einen <strong>Prozess auf Meta-Images aufzubauen<\/strong>, die jeweils eine Verbindung aus speichern:<\/p>\n<ul>\n<li>dem Commit, zu dem die Ver\u00f6ffentlichung erfolgte (unabh\u00e4ngig davon, ob das Image im Container-Registry hinzugef\u00fcgt, ge\u00e4ndert oder beibehalten wurde);<\/li>\n<li>und unserem internen Identifikator, der dem erstellten Image entspricht.<\/li>\n<\/ul>\n<p>\nMit anderen Worten, wurde sichergestellt, <strong>dass die ver\u00f6ffentlichten Tags mit Commits in Git verkn\u00fcpft sind,<\/strong>.<\/p>\n<h3>Die endg\u00fcltige Konfiguration und der allgemeine Algorithmus<\/h3>\n<p>\nBenutzern standen bei der Konfiguration der Bereinigung Richtlinien zur Verf\u00fcgung, die f\u00fcr die Auswahl relevanter Images verwendet werden. Jede solcher Richtlinie wird definiert durch:<\/p>\n<ul>\n<li>eine Menge von References, d.h. Git-Tags oder Git-Branches, die beim Scannen verwendet werden;<\/li>\n<li>und dem Limit der gesuchten Images f\u00fcr jede Reference aus der Menge.<\/li>\n<\/ul>\n<p>\nZur Veranschaulichung \u2014 so sieht die Konfiguration der Standardrichtlinien aus:<\/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>\nDiese Konfiguration enth\u00e4lt drei Richtlinien, die den folgenden Regeln entsprechen:<\/p>\n<ol>\n<li>Das Bild f\u00fcr die letzten 10 Git-Tags (nach Erstellungsdatum des Tags) zu speichern.<\/li>\n<li>Nicht mehr als 2 Images, die in der letzten Woche ver\u00f6ffentlicht wurden, f\u00fcr nicht mehr als 10 Branches mit Aktivit\u00e4t in der letzten Woche zu speichern.<\/li>\n<li>Speichern von 10 Images f\u00fcr die Branches <code>main<\/code>, <code>staging<\/code> und <code>Produktion<\/code>.<\/li>\n<\/ol>\n<p>\nDer endg\u00fcltige Algorithmus l\u00e4sst sich in folgende Schritte zusammenfassen:<\/p>\n<ul>\n<li>Abrufen der Manifeste aus dem Container-Registry.<\/li>\n<li>Ausschluss von Images, die in Kubernetes verwendet werden, da diese bereits vorselektiert wurden, indem wir die K8s API befragt haben.<\/li>\n<li>Scannen der Git-Historie und Ausschluss der Images gem\u00e4\u00df den festgelegten Richtlinien.<\/li>\n<li>L\u00f6schen der verbleibenden Images.<\/li>\n<\/ul>\n<p>\nUm zu unserer Veranschaulichung zur\u00fcckzukehren, so sieht das Ergebnis mit werf aus:<\/p>\n<p><img decoding=\"async\" alt=\"Das Problem der &quot;intelligenten&quot; Bereinigung von Container-Images und dessen L\u00f6sung in werf\" src=\"\/wp-content\/uploads\/2020\/10\/c453092dca23860a0dda604843845507.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSelbst wenn Sie werf nicht verwenden, kann ein \u00e4hnlicher Ansatz zur fortgeschrittenen Bereinigung von Images \u2014 in einer oder anderen Umsetzung (in \u00dcbereinstimmung mit der bevorzugten Vorgehensweise bei der Tag-Verwaltung) \u2014 auch in anderen Systemen\/Utlilit\u00e4ten angewendet werden. Es gen\u00fcgt, die Probleme, die auftreten k\u00f6nnen, zu beachten und die M\u00f6glichkeiten in Ihrem Stack zu finden, die es erm\u00f6glichen, L\u00f6sungen nahtlos zu integrieren. Wir hoffen, dass der Weg, den wir gegangen sind, Ihnen hilft, auch Ihren spezifischen Fall mit neuen Details und Gedanken zu betrachten.<\/p>\n<h2>Fazit<\/h2>\n<p><\/p>\n<ul>\n<li>Fr\u00fcher oder sp\u00e4ter sieht sich die Mehrheit der Teams mit dem Problem der \u00dcberf\u00fcllung des Registrys konfrontiert. <\/li>\n<li>Bei der Suche nach L\u00f6sungen m\u00fcssen zun\u00e4chst die Kriterien f\u00fcr die Relevanz des Images bestimmt werden.<\/li>\n<li>Die von beliebten Container-Registry-Diensten angebotenen Tools erm\u00f6glichen eine sehr einfache Bereinigung, die die \"\u00e4u\u00dfere Welt\" nicht ber\u00fccksichtigt: Bilder, die in Kubernetes verwendet werden, und die Besonderheiten der Arbeitsabl\u00e4ufe im Team.<\/li>\n<li>Ein flexibler und effizienter Algorithmus sollte ein Verst\u00e4ndnis f\u00fcr CI\/CD-Prozesse haben und nicht nur mit den Daten von Docker-Images umgehen.<\/li>\n<\/ul>\n<p><\/p>\n<h2>P.S.<\/h2>\n<p>\nLesen Sie auch in unserem Blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/495112\/\">Content-basiertes Tagging im werf-Assembler: Warum und wie funktioniert das?<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/476646\/\">3-Wege-Merge in werf: Deployment in Kubernetes mit Helm \u201eauf Steroiden\u201c<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465131\/\">Unterst\u00fctzung von Monorepo und Multirepo in werf und was hat das mit Docker Registry zu tun<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/493170\/\">Release von werf 1.1: Verbesserungen im Assembler heute und Pl\u00e4ne f\u00fcr die Zukunft<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/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\udd47Das Problem der \"intelligenten\" Bereinigung von Container-Images und dessen L\u00f6sung in werf | ProHoster","description":"Im Artikel wird behandelt.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/problema-umnoj-ochistki-obrazov-kontejnerov-i-eyo-reshenie-v-werf","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/96065","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=96065"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/96065\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/96066"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=96065"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=96065"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=96065"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}