{"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\/fr\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni","title":{"rendered":"Dispositif Helm et ses pi\u00e8ges","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Dispositif Helm et ses pi\u00e8ges\" 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\">Concept de transporteur Typhon, Anton Swanepoel<\/a><\/noindex><\/p>\n<p>Je m'appelle Dmitry Sugrobov, je suis d\u00e9veloppeur chez \u00abLeroy Merlin\u00bb. Dans cet article, je vais expliquer pourquoi Helm est n\u00e9cessaire, comment il simplifie le travail avec Kubernetes, ce qui a chang\u00e9 dans la troisi\u00e8me version et comment l'utiliser pour mettre \u00e0 jour des applications en production sans temps d'arr\u00eat.<\/p>\n<p>Ceci est un r\u00e9sum\u00e9 bas\u00e9 sur une pr\u00e9sentation de conf\u00e9rence <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/at-kubernetes-conference\/\">@Kubernetes Conference<\/a><\/noindex> en <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\">Mail.ru Cloud Solutions<\/a><\/noindex> \u2014 si vous ne voulez pas lire, regardez la vid\u00e9o.<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=\"Lire la vid\u00e9o\" 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>Pourquoi nous utilisons Kubernetes en production<\/h2>\n<p>\n\u00abLeroy Merlin\u00bb est un leader sur le march\u00e9 du bricolage en Russie et en Europe. Dans notre entreprise, nous avons plus de cent d\u00e9veloppeurs, 33 000 employ\u00e9s internes et un grand nombre de personnes visitant nos hypermarch\u00e9s et notre site. Pour rendre tout le monde heureux, nous avons d\u00e9cid\u00e9 de respecter des approches standard dans l'industrie. Nous d\u00e9veloppons de nouvelles applications en utilisant une architecture microservices ; pour l'isolation des environnements et une bonne livraison, nous utilisons des conteneurs ; et pour l'orchestration, nous utilisons Kubernetes. Le co\u00fbt d'utilisation des orchestrateurs baisse rapidement : le nombre d'ing\u00e9nieurs ma\u00eetrisant la technologie augmente, et des fournisseurs proposent Kubernetes en tant que service.<\/p>\n<p>Tout ce que fait Kubernetes peut bien s\u00fbr \u00eatre r\u00e9alis\u00e9 de diverses mani\u00e8res, par exemple en obfusquant des scripts avec Jenkins et docker-compose, mais pourquoi compliquer la vie quand il existe une solution pr\u00eate et fiable ? C'est pourquoi nous avons adopt\u00e9 Kubernetes et l'utilisons d\u00e9j\u00e0 en production depuis un an. Actuellement, nous avons vingt-quatre clusters Kubernetes, le plus ancien ayant plus d'un an, avec environ deux cents pods.<\/p>\n<h2>La mal\u00e9diction d'un grand nombre de fichiers YAML dans Kubernetes<\/h2>\n<p>\nPour d\u00e9ployer un microservice dans Kubernetes, nous allons cr\u00e9er au moins cinq fichiers YAML : pour Deployment, Service, Ingress, ConfigMap, Secrets \u2014 et les envoyer au cluster. Pour l'application suivante, nous \u00e9crirons le m\u00eame ensemble de fichiers YAML, pour la troisi\u00e8me \u2014 encore un autre, et ainsi de suite. En multipliant le nombre de documents par le nombre d'environnements, nous finissons avec des centaines de fichiers, sans compter les environnements dynamiques.<\/p>\n<p><img decoding=\"async\" alt=\"Dispositif Helm et ses pi\u00e8ges\" src=\"\/wp-content\/uploads\/2020\/02\/c46c3f5ae49cbefa4851cbb388bfd051.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAdam Reese, mainteneur principal de Helm, a introduit le concept de \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/cZ1S2Gp47ng?t=323\">Cycle de d\u00e9veloppement dans Kubernetes<\/a><\/noindex>\u00bb, qui se pr\u00e9sente comme suit :<\/p>\n<ol>\n<li>Copy YAML \u2014 copier le fichier YAML.<\/li>\n<li>Paste YAML \u2014 le coller.<\/li>\n<li>Fix Indents \u2014 corriger les indentations.<\/li>\n<li>Repeat \u2014 r\u00e9p\u00e9ter.<\/li>\n<\/ol>\n<p>\nCette m\u00e9thode fonctionne, mais n\u00e9cessite de copier de nombreux fichiers YAML plusieurs fois. Pour changer ce cycle, Helm a \u00e9t\u00e9 con\u00e7u.<\/p>\n<h3>Qu'est-ce que Helm<\/h3>\n<p>\nD'abord, Helm \u2014<strong> gestionnaire de paquets<\/strong>, qui aide \u00e0 trouver et \u00e0 installer les programmes n\u00e9cessaires. Pour installer, par exemple, MongoDB, il n'est pas n\u00e9cessaire d'aller sur le site officiel et de t\u00e9l\u00e9charger les binaires, il suffit d'ex\u00e9cuter la commande <code>helm install stable\/mongodb<\/code>.<\/p>\n<p>Deuxi\u00e8mement, Helm \u2014 <strong>un outil de templating<\/strong>, aide \u00e0 param\u00e9trer les fichiers. Revenons \u00e0 la situation des fichiers YAML dans Kubernetes. Il est plus simple d'\u00e9crire ce m\u00eame fichier YAML, d'y ajouter certains placeholders, dans lesquels Helm substituera des valeurs. C'est-\u00e0-dire qu'au lieu d'un grand nombre de fichiers YAML, il y aura un ensemble de templates (mod\u00e8les), dans lesquels les valeurs seront ins\u00e9r\u00e9es au bon moment.<\/p>\n<p>Troisi\u00e8mement, Helm \u2014 <strong>ma\u00eetre du d\u00e9ploiement<\/strong>. Avec lui, on peut installer, revenir en arri\u00e8re et mettre \u00e0 jour des applications. Voyons comment faire cela.<\/p>\n<p><img decoding=\"async\" alt=\"Dispositif Helm et ses pi\u00e8ges\" src=\"\/wp-content\/uploads\/2020\/02\/8b517dbcf503ced229569fe3726418c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Comment utiliser Helm pour d\u00e9ployer ses propres applications<\/h3>\n<p>\nInstallons le client Helm sur l'ordinateur, en suivant le guide officiel <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/install\/\">des instructions<\/a><\/noindex>. Ensuite, nous cr\u00e9erons un ensemble de fichiers YAML. Au lieu d'indiquer des valeurs sp\u00e9cifiques, laissons des placeholders qui seront compl\u00e9t\u00e9s par Helm plus tard. Cet ensemble de fichiers est appel\u00e9 un chart Helm. On peut l'envoyer au client en ligne de commande de trois mani\u00e8res :<\/p>\n<ul>\n<li>indiquer le dossier avec les templates ;<\/li>\n<li>emballer dans une archive .tar et y faire r\u00e9f\u00e9rence ;<\/li>\n<li>placer le template dans un d\u00e9p\u00f4t distant et ajouter un lien vers le d\u00e9p\u00f4t dans le client Helm.<\/li>\n<\/ul>\n<p>\nUn fichier de valeurs est \u00e9galement n\u00e9cessaire \u2014 values.yaml. Les donn\u00e9es de ce fichier seront ins\u00e9r\u00e9es dans le template. Cr\u00e9ons-le aussi.<\/p>\n<p><img decoding=\"async\" alt=\"Dispositif Helm et ses pi\u00e8ges\" src=\"\/wp-content\/uploads\/2020\/02\/c0fe24cc8186640147f95ce201794d96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDans la deuxi\u00e8me version de Helm, il y a une application server additionnelle \u2014 Tiller. Elle r\u00e9side en dehors de Kubernetes et attend les requ\u00eates du client Helm, puis substitue les valeurs n\u00e9cessaires dans le template et les envoie \u00e0 Kubernetes.<\/p>\n<p><img decoding=\"async\" alt=\"Dispositif Helm et ses pi\u00e8ges\" src=\"\/wp-content\/uploads\/2020\/02\/6b821a0bb4680829d5ce9982d2bb4c55.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHelm 3 est plus simple : au lieu de traiter les templates sur le serveur, les informations sont d\u00e9sormais enti\u00e8rement trait\u00e9es du c\u00f4t\u00e9 du client Helm et envoy\u00e9es directement \u00e0 l'API Kubernetes. Cette simplification am\u00e9liore la s\u00e9curit\u00e9 du cluster et facilite le d\u00e9ploiement.<\/p>\n<p><strong>Comment tout cela fonctionne<\/strong><\/p>\n<p>Nous ex\u00e9cutons la commande <code>helm install<\/code>. Indiquons le nom de la version de l'application, donnons le chemin vers values.yaml. \u00c0 la fin, indiquons le d\u00e9p\u00f4t o\u00f9 se trouve le chart et le nom du chart. Dans l'exemple, c'est \u00ab lmru \u00bb et \u00ab bestchart \u00bb respectivement.<\/p>\n<pre><code class=\"plaintext\">helm install --name bestapp --values values.yaml lmru\/bestchart\n<\/code><\/pre>\n<p>\nL'ex\u00e9cution de la commande n'est possible qu'une seule fois, lors de l'ex\u00e9cution r\u00e9p\u00e9t\u00e9e, \u00e0 la place de <code>install<\/code> devrait utiliser <code>de mise \u00e0 niveau<\/code>. Pour simplifier, au lieu de deux commandes, on peut ex\u00e9cuter la commande <code>de mise \u00e0 niveau<\/code> avec une cl\u00e9 suppl\u00e9mentaire <code>--install<\/code>Lors de la premi\u00e8re ex\u00e9cution, Helm enverra une commande pour installer la release, et par la suite, il l'actualisera.<\/p>\n<pre><code class=\"plaintext\">helm upgrade --install bestapp --values values.yaml lmru\/bestchart\n<\/code><\/pre>\n<p><\/p>\n<h2>Les pi\u00e8ges dans le d\u00e9ploiement de nouvelles versions d'applications avec Helm<\/h2>\n<p>\n<i>\u00c0 ce point de l'histoire, je joue avec le public dans \u00ab Qui veut gagner des millions ? \u00bb, et nous d\u00e9terminons comment faire en sorte que Helm mette \u00e0 jour la version de l'application. <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/w1PhTe9gnOI?list=PLQzTaxmOHjnv0tP_HDxsIvcuac2kkIJTQ&amp;t=778\"><i>Voir la vid\u00e9o<\/i><\/a><\/noindex>.<\/p>\n<p>Lorsque j'\u00e9tudiais le fonctionnement de Helm, j'ai \u00e9t\u00e9 surpris par le comportement \u00e9trange lors de la mise \u00e0 jour des versions d'applications d\u00e9j\u00e0 d\u00e9ploy\u00e9es. Le code de l'application a \u00e9t\u00e9 mis \u00e0 jour, une nouvelle image a \u00e9t\u00e9 t\u00e9l\u00e9charg\u00e9e dans le registre Docker, j'ai envoy\u00e9 la commande de d\u00e9ploiement - et rien ne s'est produit. Voici quelques m\u00e9thodes pas tr\u00e8s efficaces pour mettre \u00e0 jour les applications. En examinant chacune d'elles plus en d\u00e9tail, on commence \u00e0 comprendre le fonctionnement interne de l'outil et les raisons de ce comportement peu \u00e9vident.<\/p>\n<p><strong>M\u00e9thode 1. Ne pas changer d'information depuis le dernier d\u00e9ploiement<\/strong><\/p>\n<p>Comme le dit <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/using_helm\/#helm-upgrade-and-helm-rollback-upgrading-a-release-and-recovering-on-failure\">le site officiel<\/a><\/noindex> Helm, \u00ab Les charts Kubernetes peuvent \u00eatre grands et complexes, donc Helm essaie de ne rien toucher inutilement \u00bb. Par cons\u00e9quent, si vous mettez \u00e0 jour la version latest de l'image de l'application dans le registre Docker et ex\u00e9cutez la commande <code>helm upgrade<\/code>, alors rien ne se passera. Helm pensera que rien n'a chang\u00e9 et il n'est pas n\u00e9cessaire d'envoyer la commande de mise \u00e0 jour de l'application \u00e0 Kubernetes.<\/p>\n<blockquote><p>Ici et plus loin, la balise latest est montr\u00e9e uniquement \u00e0 titre d'exemple. En mentionnant cette balise, Kubernetes t\u00e9l\u00e9chargera syst\u00e9matiquement l'image depuis le registre Docker, quel que soit le param\u00e8tre imagePullPolicy. L'utilisation de latest en production est ind\u00e9sirable et entra\u00eene des effets secondaires.<\/p><\/blockquote>\n<p>\n<strong>M\u00e9thode 2. Mettre \u00e0 jour le LABEL dans l'image<\/strong><\/p>\n<p>Comme mentionn\u00e9 dans le m\u00eame <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/using_helm\/#helm-upgrade-and-helm-rollback-upgrading-a-release-and-recovering-on-failure\">documentation<\/a><\/noindex>, \u00ab Helm mettra \u00e0 jour l'application uniquement si elle a chang\u00e9 depuis le dernier release \u00bb. Une option logique serait de mettre \u00e0 jour le label LABEL dans l'image Docker elle-m\u00eame. Cependant, Helm ne v\u00e9rifie pas les images des applications et n'a pas connaissance des changements qui s'y produisent. Par cons\u00e9quent, en mettant \u00e0 jour les labels dans l'image, Helm ne le saura pas, et la commande de mise \u00e0 jour de l'application ne sera pas envoy\u00e9e \u00e0 Kubernetes.<\/p>\n<p><strong>M\u00e9thode 3. Utiliser une cl\u00e9 <code>--force<\/code><\/strong><\/p>\n<p><img decoding=\"async\" alt=\"Dispositif Helm et ses pi\u00e8ges\" src=\"\/wp-content\/uploads\/2020\/02\/4888cddfb7698b7044ab31b6f6070063.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nConsultons les manuels et cherchons la cl\u00e9 n\u00e9cessaire. La cl\u00e9 qui semble le plus appropri\u00e9e au sens est <code>--force<\/code>. Malgr\u00e9 son nom \u00e9vocateur, son comportement diff\u00e8re de ce qui \u00e9tait attendu. Au lieu de forcer la mise \u00e0 jour de l'application, son v\u00e9ritable objectif est de restaurer un d\u00e9ploiement ayant le statut FAILED. Si cette option n'est pas utilis\u00e9e, il est n\u00e9cessaire d'ex\u00e9cuter les commandes de mani\u00e8re s\u00e9quentielle. <code>helm delete &amp;&amp; helm install --replace<\/code>. Il est recommand\u00e9 d'utiliser l'option <code>--force<\/code>, qui automatise l'ex\u00e9cution s\u00e9quentielle de ces commandes. Plus d'informations dans ce <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\/pull\/3597\">pull request.<\/a><\/noindex>. Afin de dire \u00e0 Helm de mettre \u00e0 jour la version de l'application, malheureusement, cette option ne sera pas utile.<\/p>\n<p><strong>M\u00e9thode 4. Modifier directement les labels dans Kubernetes.<\/strong><\/p>\n<p><img decoding=\"async\" alt=\"Dispositif Helm et ses pi\u00e8ges\" src=\"\/wp-content\/uploads\/2020\/02\/0a35e7aaa7479685f07dd5b935c95eb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLa mise \u00e0 jour des labels directement dans le cluster \u00e0 l'aide de la commande <code>kubectl edit<\/code> est une mauvaise id\u00e9e. Cette action entra\u00eenera une incoh\u00e9rence entre les informations de l'application en cours d'ex\u00e9cution et celles qui ont \u00e9t\u00e9 initialement d\u00e9ploy\u00e9es. Le comportement de Helm lors du d\u00e9ploiement dans ce cas est diff\u00e9rent de sa version : Helm 2 ne fera rien, tandis que Helm 3 d\u00e9ploiera une nouvelle version de l'application. Pour comprendre la raison, il faut savoir comment Helm fonctionne.<\/p>\n<h3>Comment Helm fonctionne.<\/h3>\n<p>\nPour d\u00e9terminer si l'application a chang\u00e9 depuis le dernier d\u00e9ploiement, Helm peut s'appuyer sur :<\/p>\n<ul>\n<li>l'application en cours d'ex\u00e9cution dans Kubernetes ;<\/li>\n<li>le nouveau values.yaml et le chart actuel ;<\/li>\n<li>les informations internes de Helm concernant les d\u00e9ploiements.<\/li>\n<\/ul>\n<p><b class=\"spoiler_title\">Pour les plus curieux : o\u00f9 Helm stocke-t-il ses informations internes sur les d\u00e9ploiements ?<\/b>En ex\u00e9cutant la commande <code>helm history<\/code>, nous obtiendrons toutes les informations sur les versions install\u00e9es \u00e0 l'aide de Helm.<\/p>\n<p><img decoding=\"async\" alt=\"Dispositif Helm et ses pi\u00e8ges\" src=\"\/wp-content\/uploads\/2020\/02\/0bf3afeb9c4947220474af648a1fa1ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIl y a aussi des informations d\u00e9taill\u00e9es sur les mod\u00e8les et les valeurs envoy\u00e9s. Nous pouvons les demander :<\/p>\n<p><img decoding=\"async\" alt=\"Dispositif Helm et ses pi\u00e8ges\" src=\"\/wp-content\/uploads\/2020\/02\/858560c0f4adf7375060cec339df7574.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDans la deuxi\u00e8me version de Helm, ces informations se trouvent dans le m\u00eame namespace que Tiller (par d\u00e9faut - kube-system), dans un ConfigMap \u00e9tiquet\u00e9 \u00ab OWNER=TILLER \u00bb :<\/p>\n<p><img decoding=\"async\" alt=\"Dispositif Helm et ses pi\u00e8ges\" src=\"\/wp-content\/uploads\/2020\/02\/ba665a079ccddeb4ca7049822c42a498.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAvec l'apparition de la troisi\u00e8me version de Helm, les informations ont \u00e9t\u00e9 d\u00e9plac\u00e9es vers des secrets, dans le m\u00eame namespace o\u00f9 se trouve l'application. Gr\u00e2ce \u00e0 cela, il est d\u00e9sormais possible de faire fonctionner plusieurs applications avec le m\u00eame nom de d\u00e9ploiement dans diff\u00e9rents namespaces. Dans la deuxi\u00e8me version, c'\u00e9tait un v\u00e9ritable casse-t\u00eate, car les namespaces \u00e9taient isol\u00e9s mais pouvaient interf\u00e9rer les uns avec les autres.<\/p>\n<p><img decoding=\"async\" alt=\"Dispositif Helm et ses pi\u00e8ges\" src=\"\/wp-content\/uploads\/2020\/02\/b9b82b7c86320a0e3642e4265a1f0241.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nLe deuxi\u00e8me Helm, lorsqu'il essaie de d\u00e9terminer si une mise \u00e0 jour est n\u00e9cessaire, utilise uniquement deux sources d'informations : celles qui lui sont fournies actuellement et les informations internes sur les d\u00e9ploiements, qui se trouvent dans le ConfigMap.<\/p>\n<p><img decoding=\"async\" alt=\"Dispositif Helm et ses pi\u00e8ges\" src=\"\/wp-content\/uploads\/2020\/02\/0550ba5f6ce7be1e7f666dfc65e639ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLe troisi\u00e8me Helm utilise la strat\u00e9gie de fusion \u00e0 trois voies : en plus des informations existantes, il prend \u00e9galement en compte l'application qui fonctionne actuellement dans Kubernetes.<\/p>\n<p><img decoding=\"async\" alt=\"Dispositif Helm et ses pi\u00e8ges\" src=\"\/wp-content\/uploads\/2020\/02\/252085adb83e097e01b4a0655706ede5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPour cette raison, l'ancienne version de Helm ne fera rien, car elle ne consid\u00e8re pas les informations de l'application dans le cluster, tandis que Helm 3 recevra des modifications et d\u00e9ploiera une nouvelle application.<\/p>\n<p><strong>M\u00e9thode 5. Utiliser la cl\u00e9 &#8212;recreate-pods<\/strong><\/p>\n<p>Avec la cl\u00e9 <code>--recreate-pods<\/code> on peut atteindre ce qui \u00e9tait initialement pr\u00e9vu avec la cl\u00e9 <code>--force<\/code>. Les conteneurs red\u00e9marreront et, selon la politique imagePullPolicy : Always pour la balise latest (voir la note ci-dessus), Kubernetes t\u00e9l\u00e9chargera et ex\u00e9cutera une nouvelle version de l'image. Cela ne se fera pas de la meilleure fa\u00e7on : sans prendre en compte le StrategyType du d\u00e9ploiement, cela \u00e9teindra brusquement toutes les anciennes instances de l'application et lancera de nouvelles. Pendant le red\u00e9marrage, le syst\u00e8me ne fonctionnera pas, les utilisateurs souffriront.<\/p>\n<p>Dans Kubernetes, un probl\u00e8me similaire a \u00e9galement persist\u00e9 pendant longtemps. Et voil\u00e0, quatre ans apr\u00e8s l'ouverture <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/kubernetes\/issues\/13488\">Probl\u00e8me<\/a><\/noindex>, le probl\u00e8me a \u00e9t\u00e9 r\u00e9solu, et \u00e0 partir de la version 1.15 de Kubernetes, la possibilit\u00e9 de rolling-restart des pods est introduite.<\/p>\n<p>Helm, en revanche, \u00e9teint simplement toutes les applications et lance de nouveaux conteneurs \u00e0 c\u00f4t\u00e9. En production, cela ne doit pas \u00eatre fait pour \u00e9viter un temps d'arr\u00eat de l'application. Cela est n\u00e9cessaire uniquement pour des besoins de d\u00e9veloppement, et ne doit \u00eatre effectu\u00e9 que dans des environnements de stage.<\/p>\n<h2>Comment mettre \u00e0 jour la version de l'application avec Helm ?<\/h2>\n<p>\nNous allons changer les valeurs envoy\u00e9es \u00e0 Helm. En g\u00e9n\u00e9ral, ce sont des valeurs qui remplacent la balise de l'image. Dans le cas de latest, souvent utilis\u00e9e pour les environnements non productifs, les informations modifiables correspondent \u00e0 une annotation, qui est inutile pour Kubernetes mais servira de signal pour Helm de mettre \u00e0 jour l'application. Options pour remplir la valeur de l'annotation :<\/p>\n<ol>\n<li><strong>Valeur al\u00e9atoire<\/strong> avec la fonction standard \u2014 <code>{{ randAlphaNum 6 }}<\/code>. <br \/>\nIl y a un d\u00e9tail : apr\u00e8s chaque d\u00e9ploiement utilisant un chart avec une telle variable, la valeur de l'annotation sera unique, et Helm consid\u00e9rera qu'il y a des modifications. Cela signifie que nous red\u00e9marrerons toujours l'application, m\u00eame si nous n'avons pas chang\u00e9 sa version. Ce n'est pas critique, car il n'y aura pas de temps d'arr\u00eat, mais c'est quand m\u00eame d\u00e9sagr\u00e9able.<\/li>\n<li>Ins\u00e9rer la <strong>date et l'heure actuelles<\/strong> \u2014 <code>{{ .Release.Date }}<\/code>. <br \/>\nCette option est similaire \u00e0 une valeur al\u00e9atoire avec une variable toujours unique.<\/li>\n<li>Une m\u00e9thode plus correcte consiste \u00e0 utiliser <strong>somme de contr\u00f4le<\/strong>. C'est le SHA de l'image ou le SHA du dernier commit dans git \u2014 <code>{{ .Values.sha }}<\/code>. <br \/>\nIls devront \u00eatre calcul\u00e9s et envoy\u00e9s au client Helm sur le c\u00f4t\u00e9 appelant, par exemple dans Jenkins. Si l'application a chang\u00e9, alors la somme de contr\u00f4le changera \u00e9galement. Par cons\u00e9quent, Helm mettra \u00e0 jour l'application uniquement lorsque cela est n\u00e9cessaire.<\/li>\n<\/ol>\n<p><\/p>\n<h2>R\u00e9capitulons nos tentatives<\/h2>\n<p><\/p>\n<ul>\n<li>Helm effectue les modifications de la mani\u00e8re la moins invasive, donc tout changement au niveau de l'image de l'application dans le Docker Registry ne m\u00e8nera pas \u00e0 une mise \u00e0 jour : apr\u00e8s l'ex\u00e9cution de la commande, rien ne se passera.<\/li>\n<li>Cl\u00e9 <code>--force<\/code> est utilis\u00e9e pour restaurer les versions probl\u00e9matiques et n'est pas li\u00e9e \u00e0 une mise \u00e0 jour forc\u00e9e.<\/li>\n<li>Cl\u00e9 <code>--recreate-pods<\/code> mettra \u00e0 jour les applications de mani\u00e8re forc\u00e9e, mais le fera de mani\u00e8re brutale : elle \u00e9teindra tous les conteneurs de mani\u00e8re abrupte. Cela nuira aux utilisateurs, il ne faut pas faire cela en production.<\/li>\n<li>Apporter des modifications directement au cluster Kubernetes avec la commande <code>kubectl edit<\/code> n'est pas n\u00e9cessaire : nous violerions la coh\u00e9rence, et le comportement d\u00e9pendra de la version de Helm.<\/li>\n<li>Avec la sortie de la nouvelle version de Helm, de nombreux d\u00e9tails ont \u00e9merg\u00e9. Les issues dans le d\u00e9p\u00f4t Helm sont d\u00e9crites dans un langage clair, elles aideront \u00e0 comprendre les d\u00e9tails.<\/li>\n<li>L'ajout d'une annotation modifiable dans le chart le rendra plus flexible. Cela permettra de d\u00e9ployer l'application correctement, sans temps d'arr\u00eat.<\/li>\n<\/ul>\n<p>\nUne pens\u00e9e du genre \u00ab paix dans le monde \u00bb, applicable dans tous les domaines de la vie : lisez le manuel avant de l'utiliser, pas apr\u00e8s. Ce n'est qu'en ayant toutes les informations que l'on peut construire des syst\u00e8mes fiables et rendre les utilisateurs heureux.<\/p>\n<p><strong>Autres liens sur le sujet :<\/strong><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/453734\/\">Introduction \u00e0 <i>Helm<\/i> 3<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/\">Site officiel de Helm<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\">D\u00e9p\u00f4t Helm sur GitHub<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/425343\/\">25 outils Kubernetes utiles : d\u00e9ploiement et gestion<\/a><\/noindex><\/li>\n<\/ol>\n<p>\nCette pr\u00e9sentation a \u00e9t\u00e9 prononc\u00e9e pour la premi\u00e8re fois \u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/at-kubernetes-conference\/\">@Kubernetes Conference<\/a><\/noindex> par Mail.ru Cloud Solutions. Voir <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/playlist?list=PLQzTaxmOHjnv0tP_HDxsIvcuac2kkIJTQ\">vid\u00e9o<\/a><\/noindex> d'autres pr\u00e9sentations et abonnez-vous aux annonces des \u00e9v\u00e9nements sur Telegram. <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/k8s_mail\">Autour de Kubernetes dans Mail.ru Group.<\/a><\/noindex>.<br \/>\n<br \/>Source : <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.2 - 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\/fr\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\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\/fr\/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\udd47Le fonctionnement de Helm et ses pi\u00e8ges | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/70954","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=70954"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/70954\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/70955"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=70954"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=70954"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=70954"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}