{"id":81173,"date":"2020-05-11T13:42:51","date_gmt":"2020-05-11T11:42:51","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/production-ready-images-for-k8s"},"modified":"2020-05-11T13:42:51","modified_gmt":"2020-05-11T11:42:51","slug":"production-ready-images-for-k8s","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/production-ready-images-for-k8s","title":{"rendered":"Produktionsfertige Images f\u00fcr k8s","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Diese Geschichte handelt davon, wie wir Container in der Produktivumgebung nutzen, insbesondere unter Kubernetes. Der Artikel widmet sich der Sammlung von Metriken und Logs aus Containern sowie dem Erstellen von Images.<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsfertige Images f\u00fcr k8s\" src=\"\/wp-content\/uploads\/2020\/05\/c7e8df02d845138e489c09c55cd616e6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nWir sind ein Fintech-Unternehmen namens Exness, das Dienstleistungen f\u00fcr den Online-Handel und Fintech-Produkte f\u00fcr B2B und B2C entwickelt. In unserer F&amp;E gibt es viele verschiedene Teams, in der Entwicklungsabteilung arbeiten \u00fcber 100 Mitarbeiter.<\/p>\n<p>Wir repr\u00e4sentieren ein Team, das f\u00fcr die Plattform zust\u00e4ndig ist, \u00fcber die unsere Entwickler Code bereitstellen und ausf\u00fchren. Insbesondere sind wir verantwortlich f\u00fcr die Sammlung, Speicherung und Bereitstellung von Metriken, Logs und Ereignissen aus Anwendungen. Derzeit betreiben wir etwa dreitausend Docker-Container in der Produktivumgebung, unterst\u00fctzen unser Big Data-Speicher mit 50 TB und bieten architektonische L\u00f6sungen an, die auf unserer Infrastruktur basieren: Kubernetes, Rancher und verschiedene \u00f6ffentliche Cloud-Anbieter.\u00a0<\/p>\n<h1>Unsere Motivation<\/h1>\n<p>\nWas brennt? Niemand kann das sagen. Wo ist der Brandherd? Schwer zu verstehen. Wann gab es das Feuer? Man kann es herausfinden, aber nicht sofort.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsfertige Images f\u00fcr k8s\" src=\"\/wp-content\/uploads\/2020\/05\/3ca2271caf1d02ba14937680cd89d65d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWarum stehen einige Container still, w\u00e4hrend andere abst\u00fcrzen? Welcher Container war der Grund daf\u00fcr? Denn \u00e4u\u00dferlich sind die Container identisch, doch jeder hat seinen eigenen Neo im Inneren.<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsfertige Images f\u00fcr k8s\" src=\"\/wp-content\/uploads\/2020\/05\/f971583f21e363244f9ea754da2a1f4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUnsere Entwickler sind versierte Leute. Sie erstellen gute Dienste, die dem Unternehmen Gewinn bringen. Doch manchmal gibt es Pannen, wenn die Container mit den Anwendungen durcheinander geraten. Ein Container verbraucht zu viel CPU, ein anderer das Netzwerk, ein dritter f\u00fchrt Ein- und Ausgaben aus, und der vierte \u2014 man versteht \u00fcberhaupt nicht, was er mit den Sockets macht. All das f\u00e4llt aus, und das Schiff sinkt.\u00a0<\/p>\n<h1>Agenten<\/h1>\n<p>\nUm zu verstehen, was drinnen passiert, haben wir beschlossen, Agenten direkt in die Container zu setzen.<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsfertige Images f\u00fcr k8s\" src=\"\/wp-content\/uploads\/2020\/05\/cc9eb47d1250bb866ec9452181479df4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDiese Agenten sind Schutzprogramme, die sicherstellen, dass die Container in einem Zustand bleiben, in dem sie sich nicht gegenseitig besch\u00e4digen. Die Agenten sind standardisiert, was es erm\u00f6glicht, den Ansatz zur Wartung der Container zu standardisieren.\u00a0<\/p>\n<p>In unserem Fall m\u00fcssen die Agenten Logs im Standardformat bereitstellen, getaggt und mit Throttling. Au\u00dferdem m\u00fcssen sie uns standardisierte Metriken zur Verf\u00fcgung stellen, die in Bezug auf Gesch\u00e4ftsanwendungen erweiterbar sind.<\/p>\n<p>Unter Agenten versteht man auch Tools f\u00fcr Betrieb und Wartung, die in verschiedenen Orchestrierungssystemen arbeiten k\u00f6nnen und unterschiedliche Images unterst\u00fctzen (Debian, Alpine, Centos usw.).<\/p>\n<p>Letztendlich m\u00fcssen die Agenten einen einfachen CI\/CD-Pipeline unterst\u00fctzen, die Docker-Dateien beinhaltet. Andernfalls wird das Schiff auseinanderbrechen, da die Container \u00fcber \"schiefe\" Schienen geliefert werden.<\/p>\n<h1>Der Build-Prozess und die Erstellung des Ziel-Images<\/h1>\n<p>\nUm alles zu standardisieren und verwaltbar zu machen, ist es notwendig, einen standardisierten Build-Prozess einzuhalten. Daher haben wir uns entschieden, Container mit Containern zu bauen \u2013 eine Art Rekursion.<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsfertige Images f\u00fcr k8s\" src=\"\/wp-content\/uploads\/2020\/05\/708715af05bf79ce1eb9c2a8ce2aeca6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHier werden die Container durch durchgehende Konturen dargestellt. Wir haben auch entschieden, Distributive darin zu platzieren, damit das \u201eLeben nicht wie ein Himbeerbaum erscheint\u201c. Warum dies gemacht wurde, werden wir weiter unten erl\u00e4utern.<br \/>\n\u00a0<br \/>\nDas Ergebnis ist ein Werkzeug f\u00fcr den Build \u2013 ein Container einer bestimmten Version, der auf bestimmte Versionen von Distributiven und Skripten verweist.<\/p>\n<p>Wie verwenden wir es? Wir haben ein Docker Hub, das den Container enth\u00e4lt. Wir spiegeln ihn in unser System, um externe Abh\u00e4ngigkeiten loszuwerden. So entstand ein Container, der gelb markiert ist. Wir erstellen eine Vorlage, um alle ben\u00f6tigten Distributive und Skripte in den Container zu installieren. Danach erstellen wir ein betriebsbereites Image: Die Entwickler legen ihren Code und einige spezielle Abh\u00e4ngigkeiten hinein.\u00a0<\/p>\n<p>Was ist gut an diesem Ansatz?\u00a0<\/p>\n<ul>\n<li>Erstens erm\u00f6glicht die vollst\u00e4ndige Versionskontrolle der Build-Tools \u2013 der Build-Container, die Versionen der Skripte und der Distributiven.\u00a0<\/li>\n<li>Zweitens haben wir Standardisierung erreicht: Wir erstellen Vorlagen, Zwischen- und betriebsbereite Images auf die gleiche Weise.\u00a0<\/li>\n<li>Drittens bieten die Container Portabilit\u00e4t. Heute nutzen wir Gitlab, und morgen wechseln wir zu TeamCity oder Jenkins und k\u00f6nnen unsere Container genau so ausf\u00fchren.\u00a0<\/li>\n<li>Viertens gibt es eine Minimierung der Abh\u00e4ngigkeiten. Wir haben nicht zuf\u00e4llig Distributive in den Container gelegt, denn dies erm\u00f6glicht es, sie nicht jedes Mal aus dem Internet herunterzuladen.\u00a0<\/li>\n<li>F\u00fcnftens hat sich die Geschwindigkeit des Builds erh\u00f6ht \u2013 das Vorhandensein lokaler Kopien der Images erlaubt es, keine Zeit f\u00fcr das Herunterladen zu verschwenden, da es ein lokales Image gibt.\u00a0<\/li>\n<\/ul>\n<p>\nMit anderen Worten, wir haben einen kontrollierten und flexiblen Build-Prozess erreicht. Wir verwenden die gleichen Mittel, um beliebige Container mit vollst\u00e4ndiger Versionierung zu bauen.\u00a0<\/p>\n<h1>Wie funktioniert unser Build-Verfahren?<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Produktionsfertige Images f\u00fcr k8s\" src=\"\/wp-content\/uploads\/2020\/05\/22b9a8546005e289f79962188dbb0659.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDer Build wird mit einem einzigen Befehl gestartet, der Prozess wird im Image ausgef\u00fchrt (rot markiert). Der Entwickler hat eine Docker-Datei (gelb markiert), die wir rendern, indem wir Platzhalter durch Werte ersetzen. Gleichzeitig f\u00fcgen wir Header und Footer hinzu \u2013 das sind unsere Agenten.\u00a0<\/p>\n<p>Der Header f\u00fcgt Distributionen aus den entsprechenden Images hinzu. Der Footer installiert unsere Dienste, konfiguriert den Start der Arbeitslast, das Logging und andere Agenten, ersetzt den entrypoint usw.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsfertige Images f\u00fcr k8s\" src=\"\/wp-content\/uploads\/2020\/05\/4004e57dc45771479e535921a839716d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWir haben lange dar\u00fcber nachgedacht, ob wir einen Supervisor einsetzen sollen. Letztendlich haben wir beschlossen, dass wir ihn brauchen. Wir haben uns f\u00fcr S6 entschieden. Der Supervisor erm\u00f6glicht die Verwaltung des Containers: Er erlaubt den Zugriff im Falle eines Absturzes des Hauptprozesses und bietet eine manuelle Steuerung des Containers, ohne ihn neu erstellen zu m\u00fcssen. Logs und Metriken sind Prozesse, die innerhalb des Containers ausgef\u00fchrt werden. Auch sie m\u00fcssen \u00fcberwacht werden, und das machen wir mit dem Supervisor. Schlie\u00dflich k\u00fcmmert sich S6 um das housekeeping, die Signalverarbeitung und andere Aufgaben.<\/p>\n<p>Da wir unterschiedliche Orchestrierungssysteme verwenden, muss der Container nach dem Build und Start verstehen, in welcher Umgebung er sich befindet, und entsprechend handeln. Zum Beispiel:<br \/>\nDas erm\u00f6glicht es uns, ein einzelnes Image zu erstellen und es in verschiedenen Orchestrierungssystemen zu starten, wobei der Start die Besonderheiten dieses Orchestrierungssystems ber\u00fccksichtigt.<\/p>\n<p>\u00a0<img decoding=\"async\" alt=\"Produktionsfertige Images f\u00fcr k8s\" src=\"\/wp-content\/uploads\/2020\/05\/6e76396afedbbf0e71d44a7fbb8521da.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nF\u00fcr denselben Container erhalten wir unterschiedliche Prozessb\u00e4ume in Docker und Kubernetes:<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsfertige Images f\u00fcr k8s\" src=\"\/wp-content\/uploads\/2020\/05\/83f9d23876192930ffebafcdd549915e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDie Nutzlast wird unter dem Supervisor S6 ausgef\u00fchrt. Beachten Sie den Collector und die Events \u2013 das sind unsere Agenten, die f\u00fcr Logs und Metriken verantwortlich sind. In Kubernetes gibt es diese nicht, in Docker schon. Warum?\u00a0<\/p>\n<p>Wenn wir die Spezifikation eines Pods (hier und im Folgenden \u2013 Kubernetes Pod) betrachten, sehen wir, dass der Container Events in einem Pod ausgef\u00fchrt wird, in dem sich ein separater Container Collector befindet, der die Funktion des Sammelns von Metriken und Logs \u00fcbernimmt. Wir k\u00f6nnen die M\u00f6glichkeiten von Kubernetes nutzen: Container in einem Pod zu starten, im selben Prozess- und\/oder Netzwerkraum. Tats\u00e4chlich k\u00f6nnen wir eigene Agenten implementieren und bestimmte Funktionen ausf\u00fchren. Und wenn dieser Container in Docker gestartet wird, erh\u00e4lt er genau die gleichen M\u00f6glichkeiten, das hei\u00dft, er kann Logs und Metriken liefern, da die Agenten innerhalb des Containers ausgef\u00fchrt werden.\u00a0<\/p>\n<h1>Metriken und Logs<\/h1>\n<p>\nDie Lieferung von Metriken und Logs ist eine komplexe Aufgabe. Mit ihrer L\u00f6sung sind mehrere Aspekte verbunden.<br \/>\nDie Infrastruktur wird zum Ausf\u00fchren von Workloads und nicht zur massenhaften Verteilung von Protokollen geschaffen. Das bedeutet, dass dieser Prozess mit minimalen Anforderungen an die Ressourcen der Container durchgef\u00fchrt werden sollte. Wir streben danach, unseren Entwicklern zu helfen: \u201eNehmt den Docker Hub-Container, startet ihn, und wir k\u00f6nnen die Protokolle bereitstellen.\u201c\u00a0<\/p>\n<p>Der zweite Aspekt ist die Begrenzung des Protokollvolumens. Wenn in mehreren Containern eine Situation mit einem Anstieg des Protokollvolumens auftritt (eine Anwendung gibt im Loop einen Stack-Trace aus), steigt die Belastung der CPU, der Kommunikationskan\u00e4le und des Protokollverarbeitungssystems, was sich negativ auf den Gesamteinsatz des Hosts und auf andere Container auf dem Host auswirken kann, und manchmal f\u00fchrt dies zu einem \"Absturz\" des Hosts.\u00a0<\/p>\n<p>Der dritte Aspekt ist, dass aus der Box heraus m\u00f6glichst viele Methoden zur Metrik-Sammlung unterst\u00fctzt werden m\u00fcssen. Vom Lesen von Dateien und dem Abfragen von Prometheus-Endpunkten bis hin zur Verwendung spezifischer Anwendungsprotokolle.<\/p>\n<p>Und der letzte Aspekt ist, dass der Ressourcenverbrauch minimiert werden muss.<\/p>\n<p>Wir haben eine Open-Source-L\u00f6sung in Go namens Telegraf ausgew\u00e4hlt. Dies ist ein universeller Connector, der mehr als 140 Arten von Eingangsquellen (Input-Plugins) und 30 Arten von Ausg\u00e4ngen (Output-Plugins) unterst\u00fctzt. Wir haben sie weiterentwickelt und erz\u00e4hlen jetzt, wie sie bei uns am Beispiel von Kubernetes verwendet wird.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsfertige Images f\u00fcr k8s\" src=\"\/wp-content\/uploads\/2020\/05\/9635d571c852e5f9358458874c58d7b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNehmen wir an, ein Entwickler deployt eine Last, und Kubernetes erh\u00e4lt die Anfrage zur Erstellung eines Pods. Zu diesem Zeitpunkt wird f\u00fcr jeden Pod automatisch ein Container mit dem Namen Collector erstellt (wir verwenden einen Mutation Webhook). Collector ist unser Agent. Bei der Initialisierung konfiguriert sich dieser Container, um mit Prometheus und dem Protokollsammlungssystem zu arbeiten.<\/p>\n<ul>\n<li>Dazu verwendet er die Pod-Anmerkungen, und je nach deren Inhalt wird beispielsweise ein Endpunkt (Prometheus-Endpunkt) erstellt;\u00a0\n<\/li>\n<li>Basierend auf der Pod-Spezifikation und spezifischen Containereinstellungen wird entschieden, wie die Protokolle bereitgestellt werden.\n<\/li>\n<\/ul>\n<p>\nProtokolle sammeln wir \u00fcber die Docker API: Entwicklern gen\u00fcgt es, diese in stdout oder stderr zu schreiben, der Collector k\u00fcmmert sich darum. Die Protokolle werden in Chunks mit einer gewissen Verz\u00f6gerung gesammelt, um m\u00f6gliche \u00dcberlastungen des Hosts zu verhindern.\u00a0<\/p>\n<p>Metriken werden pro Instanz der Arbeitslast (Prozesse) in Containern gesammelt. Alles wird mit Tags versehen: Namespace, Pod und so weiter, und wird dann in das Prometheus-Format konvertiert \u2013 und steht zur Sammlung bereit (au\u00dfer den Protokollen). Au\u00dferdem senden wir Protokolle, Metriken und Ereignisse an Kafka und weiter:<\/p>\n<ul>\n<li>Protokolle sind in Graylog verf\u00fcgbar (f\u00fcr die visuelle Analyse);\n<\/li>\n<li>Logs, Metriken und Ereignisse werden in Clickhouse f\u00fcr eine langfristige Speicherung gesendet.\n<\/li>\n<\/ul>\n<p>\nGenau so funktioniert es in AWS, wir ersetzen einfach Graylog mit Kafka durch Cloudwatch. Wir senden die Logs dorthin, und es ist sehr praktisch: sofort ersichtlich, zu welchem Cluster und Container sie geh\u00f6ren. Das gleiche gilt f\u00fcr Google Stackdriver. Das hei\u00dft, unser Schema funktioniert sowohl lokal mit Kafka als auch in der Cloud.\u00a0<\/p>\n<p>Wenn wir jedoch kein Kubernetes mit Pods haben, wird das Schema etwas komplizierter, funktioniert aber nach denselben Prinzipien.<\/p>\n<p><img decoding=\"async\" alt=\"Produktionsfertige Images f\u00fcr k8s\" src=\"\/wp-content\/uploads\/2020\/05\/dd8efb33c5c74433a2767cb00caeec2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nInnerhalb des Containers laufen die gleichen Prozesse, die mit Hilfe von S6 orchestriert werden. Alle diese Prozesse sind in einem einzigen Container gestartet.<\/p>\n<h1>Insgesamt<\/h1>\n<p>\nWir haben eine umfassende L\u00f6sung zur Erstellung und Bereitstellung von Images entwickelt, mit Optionen f\u00fcr das Sammeln und Zustellen von Logs und Metriken:<\/p>\n<ul>\n<li>Wir haben einen standardisierten Ansatz zur Erstellung von Images entwickelt und darauf basierende CI-Vorlagen erstellt;\n<\/li>\n<li>Die Agenten f\u00fcr die Datensammlung sind unsere Erweiterungen von Telegraf. Wir haben sie gut in der Produktion getestet;\n<\/li>\n<li>Wir verwenden Webhooks zur Mutation f\u00fcr die Implementierung von Containern mit Agenten in Pods;\u00a0\n<\/li>\n<li>Wir haben uns in das \u00d6kosystem Kubernetes\/Rancher integriert;\n<\/li>\n<li>Wir k\u00f6nnen identische Container in verschiedenen Orchestrierungssystemen ausf\u00fchren und das gew\u00fcnschte Ergebnis erzielen;\n<\/li>\n<li>Wir haben eine vollst\u00e4ndig dynamische Konfiguration zur Verwaltung von Containern erstellt.\u00a0\n<\/li>\n<\/ul>\n<p>\nMitsautor: <b>Ilja Prudnikov<\/b><br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/exness\/blog\/488392\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 Kubernetes. \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0441\u0431\u043e\u0440\u0443 \u043c\u0435\u0442\u0440\u0438\u043a \u0438 \u043b\u043e\u0433\u043e\u0432 \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u0438\u043b\u0434\u0443 \u043e\u0431\u0440\u0430\u0437\u043e\u0432. \u041c\u044b \u0438\u0437 \u0444\u0438\u043d\u0442\u0435\u0445-\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Exness, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0434\u043b\u044f \u043e\u043d\u043b\u0430\u0439\u043d-\u0442\u0440\u0435\u0439\u0434\u0438\u043d\u0433\u0430 \u0438 \u0444\u0438\u043d\u0442\u0435\u0445-\u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0434\u043b\u044f B2B \u0438 \u04122\u0421. \u0412 \u043d\u0430\u0448\u0435\u043c R&amp;D \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434, \u0432 \u043e\u0442\u0434\u0435\u043b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 100 + \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":81174,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-81173","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=\"\u042d\u0442\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 Kubernetes.\" \/>\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\/production-ready-images-for-k8s\" \/>\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\udd47Production-ready images for k8s | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042d\u0442\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 Kubernetes.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/production-ready-images-for-k8s\" \/>\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-05-11T11:42:51+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-11T11:42:51+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\udd47Produktionsbereite Images f\u00fcr k8s | ProHoster","description":"Diese Geschichte handelt davon, wie wir Container in einer Produktivumgebung, insbesondere unter Kubernetes, nutzen.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/production-ready-images-for-k8s","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\udd47Production-ready images for k8s | ProHoster","og:description":"\u042d\u0442\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 Kubernetes.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/production-ready-images-for-k8s","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-05-11T11:42:51+00:00","article:modified_time":"2020-05-11T11:42:51+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"81173","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 16:03:22","updated":"2022-09-28 06:12:17","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\/81173","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=81173"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/81173\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/81174"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=81173"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=81173"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=81173"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}