{"id":70954,"date":"2020-02-23T00:58:17","date_gmt":"2020-02-22T21:58:17","guid":{"rendered":"https:\/\/prohoster.info\/blog\/ustrojstvo-helm-i-ego-podvodnye-kamni"},"modified":"2020-03-03T16:14:40","modified_gmt":"2020-03-03T13:14:40","slug":"ustrojstvo-helm-i-ego-podvodnye-kamni","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni","title":{"rendered":"Helm und seine Herausforderungen","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Helm und seine Herausforderungen\" src=\"\/wp-content\/uploads\/2020\/02\/b825bfb312b883f5f9c1535036f0c6e8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.artstation.com\/artwork\/YaabJq\">Konzept des Typhon-Frachttransporters, Anton Swanepoel<\/a><\/noindex><\/p>\n<p>Mein Name ist Dmitrij Sugrobov, ich bin Entwickler bei \u201eLeroy Merlin\u201c. In diesem Artikel erl\u00e4utere ich, warum Helm n\u00f6tig ist, wie er die Arbeit mit Kubernetes erleichtert, was sich in der dritten Version ge\u00e4ndert hat und wie man mit seiner Hilfe Anwendungen im Produktionsumfeld ohne Ausfallzeit aktualisieren kann.<\/p>\n<p>Dies ist eine Zusammenfassung basierend auf einem Vortrag auf einer Konferenz <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/at-kubernetes-conference\/\">@Kubernetes Konferenz<\/a><\/noindex> by <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\">Mail.ru Cloud L\u00f6sungen<\/a><\/noindex> \u2014 wenn Sie nicht lesen m\u00f6chten, schauen Sie sich das Video an.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<center><div class=\"youtube-placeholder\" data-id=\"w1PhTe9gnOI\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/w1PhTe9gnOI\/hqdefault.jpg\" alt=\"Video abspielen\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h2>Warum wir Kubernetes in der Produktion verwenden<\/h2>\n<p>\n\u201eLeroy Merlin\u201c ist ein f\u00fchrendes Unternehmen im DIY-Einzelhandel in Russland und Europa. In unserer Firma gibt es mehr als einhundert Entwickler, 33.000 interne Mitarbeiter und eine riesige Anzahl von Menschen, die unsere Baum\u00e4rkte und unsere Website besuchen. Um alle gl\u00fccklich zu machen, haben wir uns entschieden, uns an g\u00e4ngige Standards der Branche zu halten. Wir entwickeln neue Anwendungen unter Verwendung einer Microservices-Architektur; zur Isolierung von Umgebungen und f\u00fcr die korrekte Bereitstellung nutzen wir Container; und f\u00fcr die Orchestrierung verwenden wir Kubernetes. Die Kosten f\u00fcr den Einsatz von Orchestratoren sinken rasant: Die Anzahl der Ingenieure, die mit der Technologie vertraut sind, steigt, und es entstehen Anbieter, die Kubernetes als Service anbieten.<\/p>\n<p>Alles, was Kubernetes tut, kann nat\u00fcrlich auch auf andere Weise erledigt werden, zum Beispiel indem man mit Skripten einen Jenkins und docker-compose aufsetzt. Aber warum das Leben komplizierter machen, wenn es eine fertige und zuverl\u00e4ssige L\u00f6sung gibt? Daher haben wir uns f\u00fcr Kubernetes entschieden und nutzen es nun seit einem Jahr in der Produktion. Momentan betreiben wir vierundzwanzig Kubernetes-Cluster, der \u00e4lteste hat \u00fcber ein Jahr auf dem Buckel und umfasst etwa zweihundert Pods.<\/p>\n<h2>Das Fluch der vielen YAML-Dateien in Kubernetes<\/h2>\n<p>\nUm einen Mikroservice in Kubernetes zu starten, erstellen wir mindestens f\u00fcnf YAML-Dateien: f\u00fcr Deployment, Service, Ingress, ConfigMap, Secrets \u2013 und senden diese in den Cluster. F\u00fcr die n\u00e4chste Anwendung wiederholen wir diesen YAML-Satz, und mit der dritten \u2013 nochmals einen und so weiter. Multiplizieren wir die Anzahl der Dokumente mit der Anzahl der Umgebungen, haben wir bereits Hunderte von Dateien, ganz zu schweigen von dynamischen Umgebungen.<\/p>\n<p><img decoding=\"async\" alt=\"Helm und seine Herausforderungen\" src=\"\/wp-content\/uploads\/2020\/02\/c46c3f5ae49cbefa4851cbb388bfd051.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAdam Reese, Hauptverantwortlicher f\u00fcr Helm, hat den Begriff \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/cZ1S2Gp47ng?t=323\">Entwicklungszyklus in Kubernetes<\/a><\/noindex>\u201c, der so aussieht:<\/p>\n<ol>\n<li>Copy YAML \u2013 YAML-Datei kopieren.<\/li>\n<li>Paste YAML \u2013 einf\u00fcgen.<\/li>\n<li>Fix Indents \u2013 Einr\u00fcckungen reparieren.<\/li>\n<li>Repeat \u2013 erneut wiederholen.<\/li>\n<\/ol>\n<p>\nDas ist ein funktionierender Ansatz, aber man muss die YAML-Dateien oft mehrfach kopieren. Um diesen Zyklus zu \u00e4ndern, wurde Helm entwickelt.<\/p>\n<h3>Was ist Helm?<\/h3>\n<p>\nZun\u00e4chst einmal ist Helm \u2013<strong> von KISS ist in Shell geschrieben und umfasst etwa 500 Zeilen Code. Alle Pakete werden aus Quelltexten erstellt. Die Abh\u00e4ngigkeiten werden ber\u00fccksichtigt und zus\u00e4tzliche Patches k\u00f6nnen angewendet werden.<\/strong>, der bei der Suche und Installation der ben\u00f6tigten Programme hilft. Um zum Beispiel MongoDB zu installieren, muss man nicht auf die offizielle Website gehen und die Bin\u00e4rdateien herunterladen, es gen\u00fcgt, den Befehl auszuf\u00fchren. <code>helm install stable\/mongodb<\/code>.<\/p>\n<p>Zweitens ist Helm \u2014 <strong>ein Template-Manager<\/strong>, der hilft, Dateien zu parametrisieren. Zur\u00fcck zu den YAML-Dateien in Kubernetes. Es ist einfacher, dieselbe YAML-Datei zu schreiben und einige Platzhalter hinzuzuf\u00fcgen, die Helm mit Werten ausf\u00fcllt. Anstatt einer gro\u00dfen Anzahl von YAML-Dateien gibt es also eine Sammlung von Templates, in die zur passenden Zeit die ben\u00f6tigten Werte eingesetzt werden.<\/p>\n<p>Drittens ist Helm \u2014 <strong>der Meister des Deployments<\/strong>. Damit k\u00f6nnen Anwendungen installiert, zur\u00fcckgerollt und aktualisiert werden. Lass uns anschauen, wie das gemacht wird.<\/p>\n<p><img decoding=\"async\" alt=\"Helm und seine Herausforderungen\" src=\"\/wp-content\/uploads\/2020\/02\/8b517dbcf503ced229569fe3726418c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Wie man Helm zur Bereitstellung eigener Anwendungen nutzt<\/h3>\n<p>\nWir installieren den Helm-Client auf dem Computer, indem wir der offiziellen Anleitung folgen. <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/install\/\">Anleitung<\/a><\/noindex>. Anschlie\u00dfend erstellen wir eine Sammlung von YAML-Dateien. Anstatt spezifische Werte anzugeben, lassen wir Platzhalter, die Helm sp\u00e4ter mit Informationen f\u00fcllen wird. Diese Sammlung von Dateien wird als Helm Chart bezeichnet. Es gibt drei M\u00f6glichkeiten, sie an den Helm-Konsolen-Client zu \u00fcbermitteln:<\/p>\n<ul>\n<li>ein Verzeichnis mit Templates angeben;<\/li>\n<li>in einer .tar-Archive packen und darauf verweisen;<\/li>\n<li>Legen Sie die Vorlage in ein entferntes Repository und f\u00fcgen Sie den Link zum Repository im Helm-Client hinzu.<\/li>\n<\/ul>\n<p>\nAu\u00dferdem wird eine Datei mit Werten ben\u00f6tigt \u2013 values.yaml. Die Daten daraus werden in die Vorlage eingesetzt. Lassen Sie uns auch diese erstellen.<\/p>\n<p><img decoding=\"async\" alt=\"Helm und seine Herausforderungen\" src=\"\/wp-content\/uploads\/2020\/02\/c0fe24cc8186640147f95ce201794d96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIn der zweiten Version von Helm gibt es eine zus\u00e4tzliche Serveranwendung \u2013 Tiller. Diese l\u00e4uft au\u00dferhalb von Kubernetes und wartet auf Anfragen vom Helm-Client, um beim Aufruf die erforderlichen Werte in die Vorlage einzusetzen und an Kubernetes zu senden.<\/p>\n<p><img decoding=\"async\" alt=\"Helm und seine Herausforderungen\" src=\"\/wp-content\/uploads\/2020\/02\/6b821a0bb4680829d5ce9982d2bb4c55.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHelm 3 ist einfacher strukturiert: Anstatt die Vorlagen auf dem Server zu verarbeiten, wird die gesamte Information jetzt direkt auf der Seite des Helm-Clients verarbeitet und direkt an die Kubernetes-API gesendet. Diese Vereinfachung erh\u00f6ht die Sicherheit des Clusters und erleichtert den Rollout-Prozess.<\/p>\n<p><strong>So funktioniert das alles<\/strong><\/p>\n<p>Wir starten den Befehl <code>helm install<\/code>. Wir geben den Namen der Anwendungsbereitstellung an und den Pfad zur values.yaml. Am Ende geben wir das Repository an, das das Chart enth\u00e4lt, sowie den Namen des Charts. In diesem Beispiel sind das \u201elmru\u201c und \u201ebestchart\u201c.<\/p>\n<pre><code class=\"plaintext\">helm install --name bestapp --values values.yaml lmru\/bestchart\n<\/code><\/pre>\n<p>\nDie Ausf\u00fchrung des Befehls ist nur einmal m\u00f6glich; bei einer erneuten Ausf\u00fchrung muss <code>install<\/code> verwendet werden. <code>upgrade<\/code>Um es einfacher zu machen, kann der Befehl <code>upgrade<\/code> mit dem zus\u00e4tzlichen Schl\u00fcssel <code>--install<\/code>. Bei der ersten Ausf\u00fchrung sendet Helm den Befehl zur Installation des Releases und wird es fortan aktualisieren.<\/p>\n<pre><code class=\"plaintext\">helm upgrade --install bestapp --values values.yaml lmru\/bestchart\n<\/code><\/pre>\n<p><\/p>\n<h2>Herausforderungen beim Deployen neuer Versionen von Anwendungen mit Helm<\/h2>\n<p>\n<i>An dieser Stelle des Erz\u00e4hlens spiele ich mit dem Publikum in \u201eWer wird Million\u00e4r?\u201c und wir kl\u00e4ren, wie wir Helm dazu bringen, die Version der Anwendung zu aktualisieren. <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/w1PhTe9gnOI?list=PLQzTaxmOHjnv0tP_HDxsIvcuac2kkIJTQ&amp;t=778\"><i>Video ansehen<\/i><\/a><\/noindex>.<\/p>\n<p>Als ich die Funktionsweise von Helm studierte, war ich \u00fcber das seltsame Verhalten erstaunt, als ich versuchte, die Versionen laufender Anwendungen zu aktualisieren. Ich hatte den Anwendungscode aktualisiert, ein neues Image im Docker-Registry hochgeladen, den Befehl zum Deployen gesendet \u2013 und es passierte nichts. Nachfolgend einige weniger erfolgreiche Methoden zur Aktualisierung von Anwendungen. Wenn man jede von ihnen genauer betrachtet, versteht man die inneren Funktionsweisen des Tools und die Gr\u00fcnde f\u00fcr dieses nicht offensichtliche Verhalten.<\/p>\n<p><strong>Methode 1. Keine Informationen seit dem letzten Start \u00e4ndern<\/strong><\/p>\n<p>Wie es hei\u00dft <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/using_helm\/#helm-upgrade-and-helm-rollback-upgrading-a-release-and-recovering-on-failure\">eine offizielle Website<\/a><\/noindex> Helm: 'Kubernetes-Charts k\u00f6nnen gro\u00df und komplex sein, deshalb bem\u00fcht sich Helm darum, nichts unn\u00f6tig zu \u00e4ndern.' Daher, wenn man die neueste Version des Anwendung-Images im Docker-Registry aktualisiert und den Befehl ausf\u00fchrt <code>helm upgrade<\/code>, dann passiert nichts. Helm wird denken, dass sich nichts ge\u00e4ndert hat, und es ist nicht notwendig, Kubernetes den Befehl zur Aktualisierung der Anwendung zu senden.<\/p>\n<blockquote><p>Der Tag latest wird hier und in der Folge nur als Beispiel angezeigt. Wenn dieser Tag angegeben ist, wird Kubernetes jedes Mal das Image aus dem Docker-Registry herunterladen, unabh\u00e4ngig von der imagePullPolicy. Die Verwendung von latest in der Produktion ist unerw\u00fcnscht und kann Nebenwirkungen verursachen.<\/p><\/blockquote>\n<p>\n<strong>Methode 2. LABEL im Image aktualisieren<\/strong><\/p>\n<p>Wie im selben <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/using_helm\/#helm-upgrade-and-helm-rollback-upgrading-a-release-and-recovering-on-failure\">Dokumentation.<\/a><\/noindex>, \"Helm wird die Anwendung nur aktualisieren, wenn sie sich seit dem letzten Release ge\u00e4ndert hat.\" Eine logische Option daf\u00fcr w\u00e4re es, das LABEL im Docker-Image zu aktualisieren. Allerdings sieht Helm nicht in die Anwendungs-Images und hat keine Kenntnis \u00fcber \u00c4nderungen daran. Daher wird Helm bei der Aktualisierung der Labels im Image nichts davon erfahren, und der Befehl zur Aktualisierung der Anwendung wird nicht an Kubernetes gesendet.<\/p>\n<p><strong>Methode 3. Den Schl\u00fcssel <code>--force<\/code><\/strong><\/p>\n<p><img decoding=\"async\" alt=\"Helm und seine Herausforderungen\" src=\"\/wp-content\/uploads\/2020\/02\/4888cddfb7698b7044ab31b6f6070063.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSchauen wir in die Handb\u00fccher und suchen nach dem passenden Schl\u00fcssel. Am sinnvollsten scheint der Schl\u00fcssel <code>--force<\/code>. Trotz des vielsagenden Namens verh\u00e4lt sich das Ganze anders als erwartet. Anstelle eines erzwungenen Anwendungsupdates ist es tats\u00e4chlich daf\u00fcr gedacht, eine fehlgeschlagene Ver\u00f6ffentlichung wiederherzustellen. Wenn dieser Schl\u00fcssel nicht verwendet wird, m\u00fcssen die Kommandos nacheinander ausgef\u00fchrt werden. <code>helm delete &amp;&amp; helm install --replace<\/code>. Stattdessen wird empfohlen, den Schl\u00fcssel <code>--force<\/code>, der das sequentielle Ausf\u00fchren dieser Kommandos automatisiert, zu verwenden. Weitere Informationen finden Sie in diesem <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\/pull\/3597\">Pull-Request.<\/a><\/noindex>. Um Helm tats\u00e4chlich zu sagen, dass die Version der Anwendung aktualisiert werden soll, geeignet sich dieser Schl\u00fcssel leider nicht.<\/p>\n<p><strong>Methode 4. Labels direkt in Kubernetes \u00e4ndern.<\/strong><\/p>\n<p><img decoding=\"async\" alt=\"Helm und seine Herausforderungen\" src=\"\/wp-content\/uploads\/2020\/02\/0a35e7aaa7479685f07dd5b935c95eb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDie Aktualisierung von Labels direkt im Cluster mit dem Befehl <code>kubectl edit<\/code> ist eine schlechte Idee. Diese Aktion f\u00fchrt zu Inkonsistenzen zwischen der laufenden Anwendung und dem, was urspr\u00fcnglich deployt wurde. Das Verhalten von Helm beim Deployment ist in diesem Fall anders als in der vorherigen Version: Helm 2 wird nichts tun, w\u00e4hrend Helm 3 eine neue Version der Anwendung deployt. Um den Grund zu verstehen, muss man wissen, wie Helm funktioniert.<\/p>\n<h3>Wie Helm funktioniert<\/h3>\n<p>\nUm festzustellen, ob sich die Anwendung seit der letzten Ver\u00f6ffentlichung ge\u00e4ndert hat, kann Helm Folgendes verwenden:<\/p>\n<ul>\n<li>laufenden Anwendung in Kubernetes;<\/li>\n<li>neuen values.yaml und dem aktuellen Chart;<\/li>\n<li>internen Helm-Informationen zu den Releases.<\/li>\n<\/ul>\n<p><b class=\"spoiler_title\">F\u00fcr die Neugierigen: Wo speichert Helm die internen Informationen zu den Releases?<\/b>F\u00fchren Sie den Befehl aus <code>helm history<\/code>, um alle Informationen zu den Versionen, die mit Helm installiert wurden, zu erhalten.<\/p>\n<p><img decoding=\"async\" alt=\"Helm und seine Herausforderungen\" src=\"\/wp-content\/uploads\/2020\/02\/0bf3afeb9c4947220474af648a1fa1ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEs gibt auch detaillierte Informationen zu den \u00fcbermittelten Templates und Werten. Wir k\u00f6nnen sie anfordern:<\/p>\n<p><img decoding=\"async\" alt=\"Helm und seine Herausforderungen\" src=\"\/wp-content\/uploads\/2020\/02\/858560c0f4adf7375060cec339df7574.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIn der zweiten Version von Helm befinden sich diese Informationen im selben Namespace, in dem Tiller l\u00e4uft (standardm\u00e4\u00dfig kube-system), im ConfigMap, das mit dem Tag \u201eOWNER=TILLER\u201c versehen ist:<\/p>\n<p><img decoding=\"async\" alt=\"Helm und seine Herausforderungen\" src=\"\/wp-content\/uploads\/2020\/02\/ba665a079ccddeb4ca7049822c42a498.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMit dem Erscheinen der dritten Helm-Version sind die Informationen in Secrets umgezogen, und zwar in denselben Namespace, in dem die Anwendung l\u00e4uft. Dadurch wurde es m\u00f6glich, mehrere Anwendungen gleichzeitig in verschiedenen Namespaces mit demselben Release-Namen zu starten. In der zweiten Version war dies ein gro\u00dfes Kopfzerbrechen, da Namespaces isoliert sind, aber dennoch Einfluss aufeinander nehmen k\u00f6nnen.<\/p>\n<p><img decoding=\"async\" alt=\"Helm und seine Herausforderungen\" src=\"\/wp-content\/uploads\/2020\/02\/b9b82b7c86320a0e3642e4265a1f0241.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nDie zweite Helm-Version, wenn sie versucht zu verstehen, ob ein Update erforderlich ist, verwendet nur zwei Informationsquellen: das, was ihr gerade bereitgestellt wurde, und die internen Informationen zu den Releases, die im ConfigMap liegen.<\/p>\n<p><img decoding=\"async\" alt=\"Helm und seine Herausforderungen\" src=\"\/wp-content\/uploads\/2020\/02\/0550ba5f6ce7be1e7f666dfc65e639ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDie dritte Version von Helm verwendet eine Strategie des Three-Way-Merge: Zus\u00e4tzlich zu den vorhandenen Informationen wird auch die Anwendung ber\u00fccksichtigt, die aktuell in Kubernetes l\u00e4uft.<\/p>\n<p><img decoding=\"async\" alt=\"Helm und seine Herausforderungen\" src=\"\/wp-content\/uploads\/2020\/02\/252085adb83e097e01b4a0655706ede5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAus diesem Grund wird die alte Version von Helm nichts unternehmen, da sie die Informationen \u00fcber die Anwendung im Cluster nicht ber\u00fccksichtigt. Helm 3 hingegen wird die \u00c4nderungen erfassen und die neue Anwendung bereitstellen.<\/p>\n<p><strong>Methode 5. Verwenden Sie den Schl\u00fcssel &#8212;recreate-pods<\/strong><\/p>\n<p>Mit dem Schl\u00fcssel <code>--recreate-pods<\/code> kann das erreicht werden, was urspr\u00fcnglich mit dem Schl\u00fcssel <code>--force<\/code>geplant war. Die Container werden neu gestartet und, gem\u00e4\u00df der Richtlinie imagePullPolicy: Always f\u00fcr das Tag latest (siehe Anmerkung oben), wird Kubernetes die neue Version des Images herunterladen und starten. Dies geschieht jedoch nicht optimal: Unabh\u00e4ngig vom StrategyType des Deployments werden abrupt alle alten Instanzen der Anwendung abgeschaltet und neue gestartet. W\u00e4hrend des Neustarts wird das System nicht funktionieren, und die Benutzer werden betroffen sein.<\/p>\n<p>Ein \u00e4hnliches Problem bestand auch in Kubernetes \u00fcber einen l\u00e4ngeren Zeitraum. Und nun, vier Jahre nach der Entdeckung <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/kubernetes\/issues\/13488\">Problem<\/a><\/noindex>, wurde das Problem behoben, und seit Version 1.15 von Kubernetes gibt es die M\u00f6glichkeit, Pods rolling-neu zu starten.<\/p>\n<p>Helm schaltet einfach alle Anwendungen aus und startet daneben neue Container. Das sollte in der Produktion nicht gemacht werden, um keine Ausfallzeiten der Anwendung zu verursachen. Das ist nur f\u00fcr Entwicklungszwecke notwendig und sollte ausschlie\u00dflich in Staging-Umgebungen durchgef\u00fchrt werden.<\/p>\n<h2>Wie aktualisiere ich die Version einer Anwendung mit Helm?<\/h2>\n<p>\nWir werden die Werte \u00e4ndern, die an Helm \u00fcbergeben werden. In der Regel sind das die Werte, die anstelle des Image-Tags eingesetzt werden. Bei 'latest', das h\u00e4ufig in nicht-produktiven Umgebungen verwendet wird, ist die zu \u00e4ndernde Information die Annotation, die f\u00fcr Kubernetes selbst nutzlos ist, aber f\u00fcr Helm als Signal zur Notwendigkeit der Aktualisierung der Anwendung dient. Optionen zur Ausf\u00fcllung des Wertes der Annotation:<\/p>\n<ol>\n<li><strong>Zuf\u00e4lliger Wert<\/strong> mit der Standardfunktion \u2014 <code>{{ randAlphaNum 6 }}<\/code>. <br \/>\nEs gibt einen Haken: Nach jedem Deployment mit einem Chart, das eine solche Variable enth\u00e4lt, wird der Wert der Annotation einzigartig sein, und Helm wird annehmen, dass \u00c4nderungen vorliegen. Das hei\u00dft, wir werden die Anwendung immer neu starten, auch wenn wir ihre Version nicht ge\u00e4ndert haben. Das ist nicht kritisch, da es keine Ausfallzeiten geben wird, aber dennoch unangenehm.<\/li>\n<li>Aktuelles <strong>Datum und Uhrzeit<\/strong> \u2014 <code>{{ .Release.Date }}<\/code>. <br \/>\nDie Option \u00e4hnelt einem zuf\u00e4lligen Wert mit einer st\u00e4ndig einzigartigen Variable.<\/li>\n<li>Der richtigere Weg ist, <strong>Pr\u00fcfziffern<\/strong>. Dies ist der SHA des Images oder der SHA des letzten Commits im Git \u2013 <code>{{ .Values.sha }}<\/code>. <br \/>\nSie m\u00fcssen berechnet und an den Helm-Client auf der aufrufenden Seite gesendet werden, beispielsweise in Jenkins. Wenn sich die Anwendung \u00e4ndert, \u00e4ndert sich auch die Pr\u00fcfziffer. Daher wird Helm die Anwendung nur dann aktualisieren, wenn es notwendig ist.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Fassen wir unsere Versuche zusammen.<\/h2>\n<p><\/p>\n<ul>\n<li>Helm f\u00fchrt \u00c4nderungen auf die am wenigsten invasive Weise durch, weshalb jede \u00c4nderung auf der Ebene des Anwendungs-Images im Docker-Registry nicht zu einem Update f\u00fchrt: Nach der Ausf\u00fchrung des Befehls passiert nichts.<\/li>\n<li>Der Schl\u00fcssel <code>--force<\/code> wird verwendet, um problematische Releases wiederherzustellen und steht nicht im Zusammenhang mit einem erzwungenen Update.<\/li>\n<li>Der Schl\u00fcssel <code>--recreate-pods<\/code> wird die Anwendungen gezwungen aktualisieren, aber auf vandalistische Weise: Alle Container werden abrupt abgeschaltet. Dies wird den Benutzern schaden; so sollte man das in der Produktion nicht machen.<\/li>\n<li>\u00c4nderungen direkt am Kubernetes-Cluster durchzuf\u00fchren mit dem Befehl <code>kubectl edit<\/code> sollte man nicht: wir w\u00fcrden die Konsistenz verletzen, und das Verhalten w\u00fcrde je nach Helm-Version variieren.<\/li>\n<li>Mit der neuen Version von Helm sind viele Nuancen aufgetreten. Die Probleme im Helm-Repository sind klar beschrieben und helfen, die Details zu verstehen.<\/li>\n<li>Das Hinzuf\u00fcgen einer ver\u00e4nderbaren Annotation zum Chart macht es flexibler. Dadurch kann die Anwendung korrekt ausgerollt werden, ohne Ausfallzeiten.<\/li>\n<\/ul>\n<p>\nEin Gedanke, der in allen Lebensbereichen gilt: Lesen Sie die Anleitung vor der Anwendung, nicht danach. Nur mit vollst\u00e4ndigen Informationen k\u00f6nnen zuverl\u00e4ssige Systeme aufgebaut und die Nutzer gl\u00fccklich gemacht werden.<\/p>\n<p><strong>Weitere Links zum Thema:<\/strong><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/453734\/\">Einf\u00fchrung in <i>Helm<\/i> 3<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/\">Die offizielle Helm-Website<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\">Das Helm-Repository auf GitHub<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/425343\/\">25 n\u00fctzliche Kubernetes-Tools: Bereitstellung und Verwaltung<\/a><\/noindex><\/li>\n<\/ol>\n<p>\nDieser Vortrag wurde erstmals gehalten auf <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/at-kubernetes-conference\/\">@Kubernetes Konferenz<\/a><\/noindex> von Mail.ru Cloud Solutions. Sehen Sie sich an <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/playlist?list=PLQzTaxmOHjnv0tP_HDxsIvcuac2kkIJTQ\">Video<\/a><\/noindex> anderer Vortr\u00e4ge an und abonnieren Sie die Veranstaltungshinweise auf Telegram. <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/k8s_mail\">Rund um Kubernetes in der Mail.ru Group<\/a><\/noindex>.<br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/488192\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Typhon freight hauler concept, Anton Swanepoel \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0421\u0443\u0433\u0440\u043e\u0431\u043e\u0432, \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u00ab\u041b\u0435\u0440\u0443\u0430 \u041c\u0435\u0440\u043b\u0435\u043d\u00bb. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d Helm, \u043a\u0430\u043a \u043e\u043d \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 Kubernetes, \u0447\u0442\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u043a\u0430\u043a \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0431\u0435\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u044f. \u042d\u0442\u043e \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 @Kubernetes Conference by Mail.ru Cloud [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":70955,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-70954","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"Typhon freight hauler concept, Anton Swanepoel \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0421\u0443\u0433\u0440\u043e\u0431\u043e\u0432, \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u00ab\u041b\u0435\u0440\u0443\u0430 \u041c\u0435\u0440\u043b\u0435\u043d\u00bb. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d Helm, \u043a\u0430\u043a \u043e\u043d \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 Kubernetes, \u0447\u0442\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u043a\u0430\u043a \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0431\u0435\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u044f. \u042d\u0442\u043e \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 @Kubernetes Conference by Mail.ru Cloud\" \/>\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\/ustrojstvo-helm-i-ego-podvodnye-kamni\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\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\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Helm \u0438 \u0435\u0433\u043e \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"Typhon freight hauler concept, Anton Swanepoel \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0421\u0443\u0433\u0440\u043e\u0431\u043e\u0432, \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u00ab\u041b\u0435\u0440\u0443\u0430 \u041c\u0435\u0440\u043b\u0435\u043d\u00bb. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d Helm, \u043a\u0430\u043a \u043e\u043d \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 Kubernetes, \u0447\u0442\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u043a\u0430\u043a \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0431\u0435\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u044f. \u042d\u0442\u043e \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 @Kubernetes Conference by Mail.ru Cloud\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni\" \/>\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-02-22T21:58:17+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:40+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\udd47 Die Funktionsweise von Helm und seine Fallstricke | ProHoster","description":"Typhon Frachttransportkonzept, Anton Swanepoel. Mein Name ist Dmitrij Sugrobov, ich bin Entwickler bei 'Leroy Merlin'. In diesem Artikel werde ich erl\u00e4utern, warum Helm notwendig ist, wie er die Arbeit mit Kubernetes erleichtert, was sich in der dritten Version ge\u00e4ndert hat und wie man mit seiner Hilfe Anwendungen in der Produktion ohne Ausfallzeiten aktualisiert. Dies ist eine Zusammenfassung eines Vortrags auf der @Kubernetes Conference von Mail.ru Cloud.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni","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\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Helm \u0438 \u0435\u0433\u043e \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438 | ProHoster","og:description":"Typhon freight hauler concept, Anton Swanepoel \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0421\u0443\u0433\u0440\u043e\u0431\u043e\u0432, \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u00ab\u041b\u0435\u0440\u0443\u0430 \u041c\u0435\u0440\u043b\u0435\u043d\u00bb. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d Helm, \u043a\u0430\u043a \u043e\u043d \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 Kubernetes, \u0447\u0442\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u043a\u0430\u043a \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0431\u0435\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u044f. \u042d\u0442\u043e \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 @Kubernetes Conference by Mail.ru Cloud","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni","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-02-22T21:58:17+00:00","article:modified_time":"2020-03-03T13:14:40+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"70954","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 19:11:23","updated":"2022-09-30 13:54:53"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/70954","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=70954"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/70954\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/70955"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=70954"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=70954"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=70954"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}