{"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":"Die Helm-Architektur und ihre Fallstricke","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Die Helm-Architektur und ihre Fallstricke\" 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 f\u00fcr einen Typhon-Frachttr\u00e4ger, Anton Swanepoel<\/a><\/noindex><\/p>\n<p>Mein Name ist Dmitrij Sugrobov, ich bin Entwickler bei \u201aLeroy Merlin\u2018. In diesem Artikel werde ich erl\u00e4utern, warum Helm notwendig ist, wie es die Arbeit mit Kubernetes vereinfacht, was sich in der dritten Version ge\u00e4ndert hat und wie man damit Anwendungen in der Produktion ohne Ausfallzeiten aktualisieren kann.<\/p>\n<p>Dies ist eine Zusammenfassung basierend auf einem Vortrag auf der Konferenz <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/at-kubernetes-conference\/\">@Kubernetes Conference<\/a><\/noindex> indem <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\">Mail.ru Cloud Solutions<\/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\u201aLeroy Merlin\u2018 ist f\u00fchrend im DIY-Einzelhandel in Russland und Europa. In unserem Unternehmen sind \u00fcber einhundert Entwickler t\u00e4tig, 33.000 interne Mitarbeiter und eine riesige Anzahl von Menschen, die unsere Baum\u00e4rkte und unsere Website besuchen. Um sie alle gl\u00fccklich zu machen, haben wir beschlossen, uns an standardisierte Ans\u00e4tze in der Branche zu halten. Neue Anwendungen entwickeln wir unter Verwendung einer Mikroservices-Architektur; zur Isolierung von Umgebungen und zur korrekten Bereitstellung verwenden wir Container; und zur Orchestrierung setzen wir Kubernetes ein. Die Kosten f\u00fcr die Nutzung von Orchestratoren sinken schnell: Die Anzahl der Ingenieure, die mit der Technologie vertraut sind, w\u00e4chst auf dem Markt, und es kommen Anbieter hinzu, die Kubernetes als Service anbieten.<\/p>\n<p>Alles, was Kubernetes tut, kann selbstverst\u00e4ndlich auch auf andere Weise erreicht werden, zum Beispiel indem man ein Skript f\u00fcr Jenkins und docker-compose verwendet, aber warum das Leben komplizierter machen, wenn es eine fertige und zuverl\u00e4ssige L\u00f6sung gibt? Deshalb sind wir zu Kubernetes gekommen und verwenden es seit einem Jahr in der Produktion. Aktuell haben wir vierundzwanzig Kubernetes-Cluster, der \u00e4lteste davon ist \u00fcber ein Jahr alt und enth\u00e4lt etwa zweihundert Pods.<\/p>\n<h2>Der Fluch einer Vielzahl von 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 \u2014 und senden sie an den Cluster. F\u00fcr die n\u00e4chste Anwendung schreiben wir dasselbe Paket von YAMLs, f\u00fcr die dritte noch eins und so weiter. Wenn wir die Anzahl der Dokumente mit der Anzahl der Umgebungen multiplizieren, kommen wir bereits auf Hunderte von Dateien, und das ohne die dynamischen Umgebungen zu ber\u00fccksichtigen.<\/p>\n<p><img decoding=\"async\" alt=\"Die Helm-Architektur und ihre Fallstricke\" src=\"\/wp-content\/uploads\/2020\/02\/c46c3f5ae49cbefa4851cbb388bfd051.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAdam Reese, Hauptverantwortlicher f\u00fcr Helm, f\u00fchrte den Begriff \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/cZ1S2Gp47ng?t=323\">Entwicklungszyklus in Kubernetes<\/a><\/noindex>\u201c ein, der so aussieht:<\/p>\n<ol>\n<li>Copy YAML \u2014 YAML-Datei kopieren.<\/li>\n<li>Paste YAML \u2014 sie einf\u00fcgen.<\/li>\n<li>Fix Indents \u2014 Einr\u00fcckungen korrigieren.<\/li>\n<li>Repeat \u2014 wiederholen.<\/li>\n<\/ol>\n<p>\nDiese Methode ist zwar praktikabel, erfordert jedoch viele Kopiervorg\u00e4nge mit YAML-Dateien. Um diesen Zyklus zu \u00e4ndern, wurde Helm erfunden.<\/p>\n<h3>Was ist Helm<\/h3>\n<p>\nErstens, Helm \u2014<strong> Paketmanager<\/strong>, der hilft, die ben\u00f6tigten Programme zu finden und zu installieren. 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, Helm \u2014 <strong>Template-Engine<\/strong>, hilft, Dateien zu parametrisieren. Kommen wir zur Situation mit YAML-Dateien in Kubernetes zur\u00fcck. Es ist einfacher, die gleiche YAML-Datei zu schreiben, einige Platzhalter hinzuzuf\u00fcgen, die Helm mit Werten f\u00fcllt. Das hei\u00dft, anstelle eines gro\u00dfen Satzes von YAML-Dateien gibt es eine Sammlung von Vorlagen, in die die ben\u00f6tigten Werte zu gegebener Zeit eingesetzt werden.<\/p>\n<p>Drittens, Helm \u2014 <strong>Master f\u00fcr die Bereitstellung<\/strong>. Mit ihm kann man Anwendungen installieren, zur\u00fccksetzen und aktualisieren. Lassen Sie uns anschauen, wie das funktioniert.<\/p>\n<p><img decoding=\"async\" alt=\"Die Helm-Architektur und ihre Fallstricke\" src=\"\/wp-content\/uploads\/2020\/02\/8b517dbcf503ced229569fe3726418c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>So verwenden Sie Helm f\u00fcr die Bereitstellung eigener Anwendungen<\/h3>\n<p>\nWir installieren den Helm-Client auf dem Computer, indem wir der offiziellen <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/install\/\">Anleitung<\/a><\/noindex>. Dann erstellen wir eine Sammlung von YAML-Dateien. Anstatt konkrete Werte anzugeben, lassen wir Platzhalter, die sp\u00e4ter von Helm mit Informationen gef\u00fcllt werden. Diese Sammlung von Dateien nennt man Helm Chart. Man kann sie auf drei Arten an den Konsolen-Client von Helm senden:<\/p>\n<ul>\n<li>einen Ordner mit Vorlagen angeben;<\/li>\n<li>in ein .tar-Archiv packen und darauf verweisen;<\/li>\n<li>die Vorlage in ein entferntes Repository legen und einen Link zum Repository im Helm-Client hinzuf\u00fcgen.<\/li>\n<\/ul>\n<p>\nAu\u00dferdem wird eine Datei mit Werten ben\u00f6tigt \u2014 values.yaml. Die Daten daraus werden im Template eingesetzt. Lassen Sie uns auch diese erstellen.<\/p>\n<p><img decoding=\"async\" alt=\"Die Helm-Architektur und ihre Fallstricke\" 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 \u2014 Tiller. Sie h\u00e4ngt au\u00dferhalb von Kubernetes und wartet auf Anfragen vom Helm-Client, und bei einem Aufruf setzt sie die ben\u00f6tigten Werte in das Template ein und sendet es an Kubernetes.<\/p>\n<p><img decoding=\"async\" alt=\"Die Helm-Architektur und ihre Fallstricke\" src=\"\/wp-content\/uploads\/2020\/02\/6b821a0bb4680829d5ce9982d2bb4c55.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHelm 3 ist einfacher aufgebaut: Anstatt die Templates auf dem Server zu verarbeiten, wird die Information jetzt vollst\u00e4ndig auf der Seite des Helm-Clients verarbeitet und direkt an die Kubernetes API gesendet. Diese Vereinfachung erh\u00f6ht die Sicherheit des Clusters und erleichtert das Rollout.<\/p>\n<p><strong>Wie das alles funktioniert<\/strong><\/p>\n<p>Wir f\u00fchren den Befehl aus <code>helm install<\/code>. Wir geben den Namen der Anwendungs-Release an, geben den Pfad zu values.yaml an. Am Ende geben wir das Repository an, in dem das Chart liegt, und den Namen des Charts. Im 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 Wiederholung wird stattdessen <code>install<\/code> sollte benutzt werden <code>upgrade<\/code>. Zur Vereinfachung kann man anstelle von zwei Befehlen den Befehl <code>upgrade<\/code> mit dem zus\u00e4tzlichen Schl\u00fcssel <code>--install<\/code>. Bei der ersten Ausf\u00fchrung wird Helm den Befehl zum Installieren des Releases senden und wird ihn in der Folge aktualisieren.<\/p>\n<pre><code class=\"plaintext\">helm upgrade --install bestapp --values values.yaml lmru\/bestchart\n<\/code><\/pre>\n<p><\/p>\n<h2>Fallstricke beim Deployen neuer Versionen der Anwendung mit Helm<\/h2>\n<p>\n<i>An dieser Stelle der Erz\u00e4hlung spiele ich mit dem Saal in 'Wer wird Million\u00e4r?', und wir kl\u00e4ren, wie man Helm dazu bringt, 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 merkw\u00fcrdige Verhalten \u00fcberrascht, das auftrat, wenn ich versuchte, die Versionen von laufenden Anwendungen zu aktualisieren. Den Anwendungscode aktualisiert, ein neues Bild im Docker-Registry hochgeladen, den Befehl zum Deployen geschickt \u2013 und es passierte nichts. Unten sind einige nicht ganz erfolgreiche Methoden zum Aktualisieren von Anwendungen. Wenn man jede davon n\u00e4her betrachtet, beginnt man, das innere Funktionieren des Werkzeugs und die Gr\u00fcnde f\u00fcr solch unerwartetes Verhalten zu verstehen.<\/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\">Offizielle Website<\/a><\/noindex> Helm, 'Kubernetes-Charts k\u00f6nnen gro\u00df und komplex sein, daher versucht Helm, nicht unn\u00f6tig einzugreifen'. Daher wird beim Aktualisieren der neuesten Version des Anwendungsbildes im Docker-Registry und ausf\u00fchren des Befehls <code>helm upgrade<\/code>, nichts passieren. Helm wird denken, dass sich nichts ge\u00e4ndert hat, und es ist nicht n\u00f6tig, Kubernetes den Befehl zur Aktualisierung der Anwendung zu senden.<\/p>\n<blockquote><p>Hier und weiter wird das Tag 'latest' nur als Beispiel gezeigt. Beim Angabe dieses Tags wird Kubernetes das Bild jedes Mal aus dem Docker-Registry herunterladen, unabh\u00e4ngig von der Einstellung 'imagePullPolicy'. Die Verwendung von 'latest' in der Produktion ist unerw\u00fcnscht und kann Nebenwirkungen haben.<\/p><\/blockquote>\n<p>\n<strong>Methode 2. LABEL im Image aktualisieren<\/strong><\/p>\n<p>Wie im gleichen <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 die Aktualisierung des LABELs im Docker-Image selbst. Allerdings sieht Helm nicht in die Anwendungsbilder hinein und hat keine Ahnung von irgendwelchen \u00c4nderungen darin. Dementsprechend, wenn LABELs im Bild aktualisiert werden, wird Helm nichts davon erfahren, und der Befehl zur Aktualisierung der Anwendung in Kubernetes wird nicht gesendet.<\/p>\n<p><strong>Methode 3. Den Schl\u00fcssel verwenden <code>--force<\/code><\/strong><\/p>\n<p><img decoding=\"async\" alt=\"Die Helm-Architektur und ihre Fallstricke\" src=\"\/wp-content\/uploads\/2020\/02\/4888cddfb7698b7044ab31b6f6070063.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLass uns die Handb\u00fccher zu Rate ziehen und nach dem n\u00f6tigen Schl\u00fcssel suchen. Der Schl\u00fcssel, der am meisten Sinn macht, ist die Schl\u00fcsseloption. <code>--force<\/code>. Trotz des sprechenden Namens weicht das Verhalten von den Erwartungen ab. Statt ein erzwungenes Update der Anwendung durchzuf\u00fchren, ist der eigentliche Zweck die Wiederherstellung einer im Status FAILED befindlichen Version. Wenn dieser Schl\u00fcssel nicht verwendet wird, m\u00fcssen die Befehle nacheinander ausgef\u00fchrt werden. <code>helm delete &amp;&amp; helm install --replace<\/code>. Stattdessen wird vorgeschlagen, den Schl\u00fcssel <code>--force<\/code>, der die abwechselnde Ausf\u00fchrung dieser Befehle 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 dennoch dazu zu bringen, die Version der Anwendung zu aktualisieren, ist leider dieser Schl\u00fcssel nicht geeignet.<\/p>\n<p><strong>Methode 4. Labels direkt in Kubernetes \u00e4ndern<\/strong><\/p>\n<p><img decoding=\"async\" alt=\"Die Helm-Architektur und ihre Fallstricke\" src=\"\/wp-content\/uploads\/2020\/02\/0a35e7aaa7479685f07dd5b935c95eb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDas direkte Update des Labels im Cluster mit dem Befehl <code>kubectl edit<\/code> ist keine gute Idee. Diese Aktion f\u00fchrt zu Inkonsistenzen zwischen der laufenden Anwendung und dem, was urspr\u00fcnglich zur Bereitstellung gesendet wurde. Das Verhalten von Helm bei der Bereitstellung weicht in diesem Fall von seiner Version ab: Helm 2 wird nichts tun, w\u00e4hrend Helm 3 die neue Version der Anwendung bereitstellt. Um die Gr\u00fcnde zu verstehen, ist es notwendig zu wissen, wie Helm funktioniert.<\/p>\n<h3>Wie Helm funktioniert<\/h3>\n<p>\nUm festzustellen, ob sich die Anwendung seit dem letzten Release ge\u00e4ndert hat, kann Helm auf Folgendes zur\u00fcckgreifen:<\/p>\n<ul>\n<li>die laufende Anwendung in Kubernetes;<\/li>\n<li>neue values.yaml und aktuelles Chart;<\/li>\n<li>interne Informationen von Helm \u00fcber Releases.<\/li>\n<\/ul>\n<p><b class=\"spoiler_title\">F\u00fcr die Neugierigen: Wo speichert Helm die internen Informationen \u00fcber Releases?<\/b>Durch den Befehl <code>helm history<\/code>, erhalten wir alle Informationen \u00fcber die Versionen, die mit Helm installiert wurden.<\/p>\n<p><img decoding=\"async\" alt=\"Die Helm-Architektur und ihre Fallstricke\" src=\"\/wp-content\/uploads\/2020\/02\/0bf3afeb9c4947220474af648a1fa1ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEs gibt auch detaillierte Informationen zu den gesendeten Vorlagen und Werten. Wir k\u00f6nnen sie anfordern:<\/p>\n<p><img decoding=\"async\" alt=\"Die Helm-Architektur und ihre Fallstricke\" 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), in einer ConfigMap, die mit dem Label \u201eOWNER=TILLER\u201c gekennzeichnet ist:<\/p>\n<p><img decoding=\"async\" alt=\"Die Helm-Architektur und ihre Fallstricke\" src=\"\/wp-content\/uploads\/2020\/02\/ba665a079ccddeb4ca7049822c42a498.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMit dem Erscheinen der dritten Version von Helm wurden die Informationen in Secrets verschoben, und zwar in denselben Namespace, in dem die Anwendung l\u00e4uft. Dadurch wurde es m\u00f6glich, mehrere Anwendungen in verschiedenen Namespaces mit demselben Release-Namen gleichzeitig auszuf\u00fchren. In der zweiten Version war dies ein gro\u00dfes Problem, da Namespaces isoliert sind, aber sich gegenseitig beeinflussen k\u00f6nnen.<\/p>\n<p><img decoding=\"async\" alt=\"Die Helm-Architektur und ihre Fallstricke\" src=\"\/wp-content\/uploads\/2020\/02\/b9b82b7c86320a0e3642e4265a1f0241.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nDie zweite Version von Helm verwendet bei der \u00dcberpr\u00fcfung, ob ein Update erforderlich ist, nur zwei Informationsquellen: das, was ihr jetzt bereitgestellt wurde, und die internen Informationen \u00fcber die Releases, die in der ConfigMap gespeichert sind.<\/p>\n<p><img decoding=\"async\" alt=\"Die Helm-Architektur und ihre Fallstricke\" src=\"\/wp-content\/uploads\/2020\/02\/0550ba5f6ce7be1e7f666dfc65e639ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDer dritte Helm verwendet die Strategie des Three-Way-Merge: Zus\u00e4tzlich zu den vorhandenen Informationen ber\u00fccksichtigt er auch die Anwendung, die gerade in Kubernetes l\u00e4uft.<\/p>\n<p><img decoding=\"async\" alt=\"Die Helm-Architektur und ihre Fallstricke\" 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 tun, da sie die Informationen der Anwendung im Cluster nicht ber\u00fccksichtigt, w\u00e4hrend Helm 3 \u00c4nderungen erh\u00e4lt und die neue Anwendung f\u00fcr das Deployment sendet.<\/p>\n<p><strong>Methode 5. Den Schl\u00fcssel &#8212;recreate-pods verwenden<\/strong><\/p>\n<p>Mit dem Schl\u00fcssel <code>--recreate-pods<\/code> kann das erreicht werden, was urspr\u00fcnglich mit dem Schl\u00fcssel geplant war. <code>--force<\/code>Die Container werden neu gestartet und, gem\u00e4\u00df der Policy imagePullPolicy: Always f\u00fcr das Tag latest (dar\u00fcber in der Fu\u00dfnote oben), wird Kubernetes die neue Version des Images herunterladen und starten. Das geschieht nicht auf die beste Art: Ohne Ber\u00fccksichtigung des StrategyType des Deployments schaltet es abrupt alle alten Instanzen der Anwendung ab und beginnt, neue zu starten. W\u00e4hrend des Neustarts wird das System nicht funktionieren, und die Benutzer werden darunter leiden.<\/p>\n<p>Auch im Kubernetes selbst gab es dieses Problem lange Zeit. Und nach 4 Jahren seit der Entdeckung <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/kubernetes\/issues\/13488\">Issue<\/a><\/noindex>, wurde das Problem behoben, und seit Version 1.15 von Kubernetes gibt es die M\u00f6glichkeit, diese Pods rolling-restart.<\/p>\n<p>Helm schaltet einfach alle Anwendungen aus und startet daneben neue Container. Das sollte in der Produktion nicht gemacht werden, um einen Stillstand der Anwendung zu vermeiden. Das ist nur f\u00fcr Entwicklungszwecke notwendig und kann nur in Stage-Umgebungen durchgef\u00fchrt werden.<\/p>\n<h2>Wie aktualisiere ich die Version der Anwendung mit Helm?<\/h2>\n<p>\nWir werden die Werte \u00e4ndern, die an Helm gesendet werden. In der Regel sind dies die Werte, die anstelle des Tags des Images eingesetzt werden. Im Fall von latest, das h\u00e4ufig f\u00fcr nicht produktive Umgebungen verwendet wird, ist die zu \u00e4ndernde Information die Annotation, die f\u00fcr Kubernetes nutzlos ist, aber f\u00fcr Helm ein Signal zum Aktualisieren der Anwendung darstellt. M\u00f6glichkeiten zur Ausf\u00fcllung des Wertes der Annotation:<\/p>\n<ol>\n<li><strong>Zuf\u00e4lliger Wert<\/strong> mithilfe der Standardfunktion \u2014 <code>{{ randAlphaNum 6 }}<\/code>. <br \/>\nEs gibt einen Sch\u00f6nheitsfehler: Nach jedem Deployment mit einem Chart, der solch eine Variable enth\u00e4lt, wird der Wert der Annotation einzigartig sein, und Helm wird annehmen, dass es \u00c4nderungen gibt. Das bedeutet, wir werden die Anwendung immer neu starten, auch wenn wir ihre Version nicht ge\u00e4ndert haben. Das ist nicht kritisch, da es keine Stillst\u00e4nde geben wird, aber dennoch unangenehm.<\/li>\n<li>Aktuelles <strong>Datum und Uhrzeit<\/strong> \u2014 <code>{{ .Release.Date }}<\/code>. <br \/>\nDie Variante \u00e4hnelt dem zuf\u00e4lligen Wert mit einer st\u00e4ndig einzigartigen Variablen.<\/li>\n<li>Eine bessere Methode ist die Verwendung von <strong>Pr\u00fcfziffern<\/strong>. Das ist der SHA des Images oder der SHA des letzten Commits in Git \u2014 <code>{{ .Values.sha }}<\/code>. <br \/>\nDiese m\u00fcssen berechnet und an den Helm-Client auf der aufrufenden Seite gesendet werden, zum Beispiel in Jenkins. Wenn sich die Anwendung \u00e4ndert, \u00e4ndert sich auch die Pr\u00fcfziffer. Folglich wird Helm die Anwendung nur dann aktualisieren, wenn es n\u00f6tig ist.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Fassen wir unsere Versuche zusammen<\/h2>\n<p><\/p>\n<ul>\n<li>Helm nimmt \u00c4nderungen auf die am wenigsten invasive Weise vor, daher f\u00fchrt jede \u00c4nderung auf der Ebene des Anwendungsimages im Docker Registry nicht zu einem Update: Nach Ausf\u00fchrung des Befehls passiert nichts.<\/li>\n<li>Schl\u00fcssel <code>--force<\/code> wird zur Wiederherstellung problematischer Releases verwendet und steht nicht im Zusammenhang mit einem erzwungenen Update.<\/li>\n<li>Schl\u00fcssel <code>--recreate-pods<\/code> erzwingt die Aktualisierung von Anwendungen, tut dies jedoch auf eine gewaltsame Weise: Es schaltet abrupt alle Container aus. Davon leiden die Benutzer, im produktiven Betrieb sollte man das nicht tun.<\/li>\n<li>Direkt \u00c4nderungen am Kubernetes-Cluster mit dem Befehl <code>kubectl edit<\/code> sind nicht erforderlich: Wir w\u00fcrden die Konsistenz verletzen, und das Verhalten w\u00e4re von der Helm-Version abh\u00e4ngig.<\/li>\n<li>Mit der neuen Version von Helm sind viele Nuancen hinzugekommen. Die Issues im Helm-Repository sind in verst\u00e4ndlicher Sprache beschrieben und helfen, die Details zu verstehen.<\/li>\n<li>Durch das Hinzuf\u00fcgen einer ver\u00e4nderbaren Annotation zum Chart wird es flexibler. Dadurch kann die Anwendung richtig ausgerollt werden, ohne Ausfallzeiten.<\/li>\n<\/ul>\n<p>\nEin Gedanke, der in allen Lebensbereichen funktioniert: Lesen Sie die Anleitung vor der Anwendung und nicht danach. Nur mit vollst\u00e4ndigen Informationen lassen sich zuverl\u00e4ssige Systeme aufbauen und die Benutzer gl\u00fccklich machen.<\/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 Bericht wurde erstmals auf <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/at-kubernetes-conference\/\">@Kubernetes Conference<\/a><\/noindex> von Mail.ru Cloud Solutions. Sehen Sie <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/playlist?list=PLQzTaxmOHjnv0tP_HDxsIvcuac2kkIJTQ\">das Video<\/a><\/noindex> weitere Vortr\u00e4ge und abonnieren Sie die Ank\u00fcndigungen von Veranstaltungen 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 5.0.1.1 - aioseo.com -->\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) 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\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: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\udd47Die Funktionsweise von Helm und seine Fallstricke | ProHoster","description":"","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: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","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\/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}]}}