{"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\/it\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni","title":{"rendered":"Dispositivo Helm e i suoi svantaggi","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Dispositivo Helm e i suoi svantaggi\" 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\">Concetto di trasportatore Typhon, Anton Swanepoel<\/a><\/noindex><\/p>\n<p>Mi chiamo Dmitrij Sugrobov, sono sviluppatore presso \u00abLeroy Merlin\u00bb. In questo articolo parler\u00f2 del perch\u00e9 Helm sia necessario, come semplifica il lavoro con Kubernetes, cosa \u00e8 cambiato nella terza versione e come usarlo per aggiornare le applicazioni in produzione senza downtime.<\/p>\n<p>Questa \u00e8 una sintesi ispirata a una presentazione conferenza <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/at-kubernetes-conference\/\">@Kubernetes Conference<\/a><\/noindex> by <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\">Mail.ru Cloud Solutions<\/a><\/noindex> \u2014 se non volete leggere, guardate il video.<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=\"Riproduci video\" 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>Perch\u00e9 usiamo Kubernetes in produzione<\/h2>\n<p>\n\u00abLeroy Merlin\u00bb \u00e8 leader nel mercato del retail DIY in Russia e in Europa. Nella nostra azienda lavorano pi\u00f9 di cento sviluppatori, 33.000 dipendenti interni e un'enorme quantit\u00e0 di persone visitano i ipermarchi e il sito. Per farli tutti felici, abbiamo deciso di seguire gli approcci standard nel settore. Sviluppiamo nuove applicazioni utilizzando architetture a microservizi; per isolare gli ambienti e garantire una corretta distribuzione utilizziamo container; e per l'orchestrazione utilizziamo Kubernetes. Il costo dell'utilizzo degli orchestratori sta rapidamente diminuendo: nel mercato cresce il numero di ingegneri esperti nella tecnologia e ci sono fornitori che offrono Kubernetes come servizio.<\/p>\n<p>Tutto ci\u00f2 che fa Kubernetes pu\u00f2 sicuramente essere fatto in altri modi, come impiegare script con Jenkins e docker-compose, ma perch\u00e9 complicarsi la vita quando esiste una soluzione pronta e affidabile? Per questo motivo abbiamo scelto Kubernetes e lo utilizziamo in produzione da un anno. Attualmente gestiamo ventiquattro cluster Kubernetes, il pi\u00f9 vecchio dei quali ha pi\u00f9 di un anno e conta circa duecento pod.<\/p>\n<h2>La maledizione del gran numero di file YAML in Kubernetes<\/h2>\n<p>\nPer avviare un microservizio in Kubernetes, creeremo almeno cinque file YAML: per Deployment, Service, Ingress, ConfigMap, Secrets e li invieremo al cluster. Per l'applicazione successiva scriveremo lo stesso pacchetto di file YAML, con un terzo ancora e cos\u00ec via. Moltiplicando il numero di documenti per il numero di ambienti, otteniamo gi\u00e0 centinaia di file, senza contare gli ambienti dinamici.<\/p>\n<p><img decoding=\"async\" alt=\"Dispositivo Helm e i suoi svantaggi\" src=\"\/wp-content\/uploads\/2020\/02\/c46c3f5ae49cbefa4851cbb388bfd051.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAdam Reese, core maintainer di Helm, ha introdotto il concetto di \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/cZ1S2Gp47ng?t=323\">Ciclo di sviluppo in Kubernetes<\/a><\/noindex>\u00bb, che appare cos\u00ec:<\/p>\n<ol>\n<li>Copia YAML \u2014 copiare il file YAML.<\/li>\n<li>Incolla YAML \u2014 incollarlo.<\/li>\n<li>Correggi gli indent \u2014 sistemare gli spazi.<\/li>\n<li>Ripeti \u2014 ripetere di nuovo.<\/li>\n<\/ol>\n<p>\nQuesto approccio funziona, ma richiede di copiare molte volte i file YAML. \u00c8 per modificare questo ciclo che \u00e8 nato Helm.<\/p>\n<h3>Che cos'\u00e8 Helm<\/h3>\n<p>\nInnanzitutto, Helm \u00e8<strong> un gestore di pacchetti<\/strong>, che aiuta a trovare e installare i programmi necessari. Per installare, ad esempio, MongoDB, non \u00e8 necessario visitare il sito ufficiale e scaricare i binari, basta eseguire il comando <code>helm install stable\/mongodb<\/code>.<\/p>\n<p>In secondo luogo, Helm \u2014 <strong>un generatore di template<\/strong>, aiuta a parametrizzare i file. Torniamo alla situazione con i file YAML in Kubernetes. \u00c8 pi\u00f9 semplice scrivere lo stesso file YAML, aggiungere alcuni segnaposto, nei quali Helm inserir\u00e0 i valori. Quindi, invece di un grande insieme di file YAML, ci sar\u00e0 un insieme di template, nei quali al momento opportuno verranno inseriti i valori necessari.<\/p>\n<p>In terzo luogo, Helm \u2014 <strong>\u00e8 un maestro nell'implementazione<\/strong>. Con il suo aiuto \u00e8 possibile installare, ripristinare e aggiornare le applicazioni. Vediamo come fare.<\/p>\n<p><img decoding=\"async\" alt=\"Dispositivo Helm e i suoi svantaggi\" src=\"\/wp-content\/uploads\/2020\/02\/8b517dbcf503ced229569fe3726418c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Come utilizzare Helm per il deployment delle proprie applicazioni<\/h3>\n<p>\nInstalleremo il client Helm sul computer, seguendo la documentazione ufficiale <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/install\/\">documentazione<\/a><\/noindex>. Quindi creeremo un insieme di file YAML. Invece di specificare valori concreti, lasceremo dei segnaposto, che in futuro Helm compiler\u00e0 con le informazioni. Un insieme di tali file \u00e8 chiamato chart Helm. Pu\u00f2 essere inviato al client console di Helm in tre modi:<\/p>\n<ul>\n<li>specificando la cartella con i template;<\/li>\n<li>imballandoli in un archivio .tar e specificando il percorso.<\/li>\n<li>caricare il template nel repository remoto e aggiungere il link al repository nel client Helm.<\/li>\n<\/ul>\n<p>\n\u00c8 necessaro anche un file di valori \u2014 values.yaml. I dati da l\u00ec verranno inseriti nel template. Creiamo anche quello.<\/p>\n<p><img decoding=\"async\" alt=\"Dispositivo Helm e i suoi svantaggi\" src=\"\/wp-content\/uploads\/2020\/02\/c0fe24cc8186640147f95ce201794d96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNella seconda versione di Helm c'\u00e8 un'applicazione server aggiuntiva \u2014 Tiller. Essa risiede all'esterno di Kubernetes e attende richieste dal client Helm, e al momento della chiamata inserisce i valori richiesti nel template e li invia a Kubernetes.<\/p>\n<p><img decoding=\"async\" alt=\"Dispositivo Helm e i suoi svantaggi\" src=\"\/wp-content\/uploads\/2020\/02\/6b821a0bb4680829d5ce9982d2bb4c55.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHelm 3 \u00e8 pi\u00f9 semplice: invece di elaborare i template sul server, le informazioni vengono ora elaborate interamente dal lato del client Helm e inviate direttamente all'API di Kubernetes. Questa semplificazione aumenta la sicurezza del cluster e facilita il processo di distribuzione.<\/p>\n<p><strong>Come funziona tutto ci\u00f2<\/strong><\/p>\n<p>Eseguiamo il comando <code>helm install<\/code>. Specifichiamo il nome della release dell'applicazione, diamo il percorso per values.yaml. Alla fine indichiamo il repository in cui si trova il chart e il nome del chart. Nell'esempio questi sono \u00ablmru\u00bb e \u00abbestchart\u00bb rispettivamente.<\/p>\n<pre><code class=\"plaintext\">helm install --name bestapp --values values.yaml lmru\/bestchart\n<\/code><\/pre>\n<p>\nL'esecuzione del comando \u00e8 possibile solo una volta, durante l'esecuzione ripetuta verr\u00e0 sostituito <code>install<\/code> bisogna usare <code>aggiornamento<\/code>. Per semplicit\u00e0, invece di due comandi, \u00e8 possibile eseguire il comando <code>aggiornamento<\/code> con l'opzione aggiuntiva <code>--install<\/code>. Alla prima esecuzione, Helm invier\u00e0 un comando per installare la release e in seguito la aggiorner\u00e0.<\/p>\n<pre><code class=\"plaintext\">helm upgrade --install bestapp --values values.yaml lmru\/bestchart\n<\/code><\/pre>\n<p><\/p>\n<h2>Le insidie nella distribuzione delle nuove versioni dell'applicazione con Helm<\/h2>\n<p>\n<i>In questo punto della narrazione, sto giocando con il pubblico a 'Chi vuol essere milionario' e scopriamo come far aggiornare Helm alla nuova versione dell'applicazione. <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/w1PhTe9gnOI?list=PLQzTaxmOHjnv0tP_HDxsIvcuac2kkIJTQ&amp;t=778\"><i>Guarda il video<\/i><\/a><\/noindex>.<\/p>\n<p>Quando ho studiato come funziona Helm, sono rimasto sorpreso dal comportamento strano durante il tentativo di aggiornare le versioni delle applicazioni gi\u00e0 in esecuzione. Ho aggiornato il codice dell'app, caricato una nuova immagine nel docker registry e inviato il comando per la distribuzione \u2013 e non \u00e8 successo nulla. Di seguito ci sono alcuni modi non del tutto efficaci per aggiornare le applicazioni. Esaminando ciascuno di essi in dettaglio, inizia a comprendere il funzionamento interno dello strumento e le ragioni di questo comportamento non intuitivo.<\/p>\n<p><strong>Metodo 1. Non modificare le informazioni dall'ultimo avvio<\/strong><\/p>\n<p>Come dice <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/using_helm\/#helm-upgrade-and-helm-rollback-upgrading-a-release-and-recovering-on-failure\">sito ufficiale<\/a><\/noindex> Helm, 'I chart di Kubernetes possono essere grandi e complessi, quindi Helm cerca di non toccare nulla pi\u00f9 del necessario'. Pertanto, se aggiorni l'immagine pi\u00f9 recente dell'app nel docker registry e esegui il comando <code>helm upgrade<\/code>, quindi non succeder\u00e0 nulla. Helm penser\u00e0 che nulla sia cambiato e non sar\u00e0 necessario inviare a Kubernetes un comando per aggiornare l'applicazione.<\/p>\n<blockquote><p>Qui e oltre, il tag latest \u00e8 mostrato esclusivamente come esempio. Specificando questo tag, Kubernetes scaricher\u00e0 ogni volta l'immagine dal registry Docker, indipendentemente dal parametro imagePullPolicy. L'uso di latest in produzione \u00e8 indesiderato e pu\u00f2 causare effetti collaterali.<\/p><\/blockquote>\n<p>\n<strong>Metodo 2. Aggiornare il LABEL nell'immagine<\/strong><\/p>\n<p>Come scritto nello stesso <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/using_helm\/#helm-upgrade-and-helm-rollback-upgrading-a-release-and-recovering-on-failure\">documentazione<\/a><\/noindex>, \"Helm aggiorner\u00e0 l'applicazione solo se \u00e8 cambiata dalla ultima release.\" Un'opzione logica per questo sarebbe aggiornare l'etichetta LABEL nell'immagine Docker stessa. Tuttavia, Helm non esamina le immagini delle applicazioni e non ha idea di eventuali cambiamenti in esse. Pertanto, aggiornando le etichette nell'immagine, Helm non ne sar\u00e0 a conoscenza e il comando di aggiornamento dell'applicazione in Kubernetes non verr\u00e0 eseguito.<\/p>\n<p><strong>Metodo 3. Utilizzare la chiave <code>\u2014force<\/code><\/strong><\/p>\n<p><img decoding=\"async\" alt=\"Dispositivo Helm e i suoi svantaggi\" src=\"\/wp-content\/uploads\/2020\/02\/4888cddfb7698b7044ab31b6f6070063.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nRivolgendoci ai manuali e cercando la chiave necessaria. La chiave pi\u00f9 adatta per significato \u00e8 <code>\u2014force<\/code>. Nonostante il nome, il comportamento \u00e8 diverso da quanto previsto. Invece di forzare l'aggiornamento dell'applicazione, il suo vero scopo \u00e8 ripristinare una release che si trova nello stato FAILED. Se non usi questa chiave, devi eseguire i comandi in modo sequenziale. <code>helm delete &amp;&amp; helm install --replace<\/code>. Invece, si consiglia di utilizzare la chiave <code>\u2014force<\/code>, che automatizza l'esecuzione sequenziale di questi comandi. Maggiori informazioni in questo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\/pull\/3597\">pull request.<\/a><\/noindex>. Per dire a Helm di aggiornare comunque la versione dell'applicazione, purtroppo questa chiave non \u00e8 adatta.<\/p>\n<p><strong>Metodo 4. Modificare direttamente le etichette in Kubernetes.<\/strong><\/p>\n<p><img decoding=\"async\" alt=\"Dispositivo Helm e i suoi svantaggi\" src=\"\/wp-content\/uploads\/2020\/02\/0a35e7aaa7479685f07dd5b935c95eb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAggiornare l'etichetta direttamente nel cluster utilizzando il comando <code>kubectl edit<\/code> \u00e8 una cattiva idea. Questa azione porter\u00e0 a un'incoerenza tra l'applicazione in esecuzione e ci\u00f2 che \u00e8 stato originariamente inviato per il deployment. Il comportamento di Helm durante il deployment in questo caso \u00e8 diverso rispetto alla sua versione: Helm 2 non far\u00e0 nulla, mentre Helm 3 deployer\u00e0 una nuova versione dell'applicazione. Per comprendere il motivo, \u00e8 necessario capire come funziona Helm.<\/p>\n<h3>Come funziona Helm.<\/h3>\n<p>\nPer determinare se l'applicazione \u00e8 cambiata dall'ultimo rilascio, Helm pu\u00f2 avvalersi di:<\/p>\n<ul>\n<li>applicazione in esecuzione su Kubernetes;<\/li>\n<li>nuovo values.yaml e chart aggiornato;<\/li>\n<li>informazioni interne di Helm sui rilascio.<\/li>\n<\/ul>\n<p><b class=\"spoiler_title\">Per i pi\u00f9 curiosi: dove Helm memorizza le informazioni interne sui rilascio?<\/b>Eseguendo il comando <code>helm history<\/code>, otterremo tutte le informazioni sulle versioni installate tramite Helm.<\/p>\n<p><img decoding=\"async\" alt=\"Dispositivo Helm e i suoi svantaggi\" src=\"\/wp-content\/uploads\/2020\/02\/0bf3afeb9c4947220474af648a1fa1ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCi sono anche ulteriori dettagli sui template e valori inviati. Possiamo richiederli:<\/p>\n<p><img decoding=\"async\" alt=\"Dispositivo Helm e i suoi svantaggi\" src=\"\/wp-content\/uploads\/2020\/02\/858560c0f4adf7375060cec339df7574.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNella seconda versione di Helm, queste informazioni si trovano nello stesso namespace in cui \u00e8 in esecuzione Tiller (di default \u2014 kube-system), nel ConfigMap contrassegnato con l'etichetta \u00abOWNER=TILLER\u00bb:<\/p>\n<p><img decoding=\"async\" alt=\"Dispositivo Helm e i suoi svantaggi\" src=\"\/wp-content\/uploads\/2020\/02\/ba665a079ccddeb4ca7049822c42a498.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCon l'arrivo della terza versione di Helm, le informazioni sono state spostate nei segreti, sempre nello stesso namespace in cui \u00e8 in esecuzione l'applicazione. Questo ha reso possibile eseguire pi\u00f9 applicazioni contemporaneamente in diversi namespace con lo stesso nome di rilascio. Nella seconda versione, era un grosso problema quando i namespace erano isolati ma potevano influenzarsi a vicenda.<\/p>\n<p><img decoding=\"async\" alt=\"Dispositivo Helm e i suoi svantaggi\" src=\"\/wp-content\/uploads\/2020\/02\/b9b82b7c86320a0e3642e4265a1f0241.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nIl secondo Helm, quando cerca di capire se \u00e8 necessario un aggiornamento, utilizza solo due fonti di informazione: quelle fornite attualmente e le informazioni interne sui rilascio, che si trovano nel ConfigMap.<\/p>\n<p><img decoding=\"async\" alt=\"Dispositivo Helm e i suoi svantaggi\" src=\"\/wp-content\/uploads\/2020\/02\/0550ba5f6ce7be1e7f666dfc65e639ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIl terzo Helm utilizza una strategia di merge a tre vie: oltre alle informazioni esistenti, considera anche l'applicazione attualmente attiva in Kubernetes.<\/p>\n<p><img decoding=\"async\" alt=\"Dispositivo Helm e i suoi svantaggi\" src=\"\/wp-content\/uploads\/2020\/02\/252085adb83e097e01b4a0655706ede5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPer questo motivo, la vecchia versione di Helm non svolger\u00e0 alcuna operazione, poich\u00e9 non tiene conto delle informazioni dell'applicazione nel cluster, mentre Helm 3 ricever\u00e0 le modifiche e invier\u00e0 una nuova applicazione per il deploy.<\/p>\n<p><strong>Metodo 5. Utilizzare la chiave &#8212;recreate-pods<\/strong><\/p>\n<p>Con l'opzione <code>--recreate-pods<\/code> \u00e8 possibile raggiungere ci\u00f2 che si intendeva inizialmente ottenere con l'opzione <code>\u2014force<\/code>. I contenitori verranno riavviati e, in base alla politica imagePullPolicy: Always per il tag latest (come spiegato nella nota precedente), Kubernetes scaricher\u00e0 e avvier\u00e0 una nuova versione dell'immagine. Questo non avverr\u00e0 nel modo migliore: ignorando lo StrategyType del deployment, spegner\u00e0 bruscamente tutte le vecchie istanze dell'applicazione e proceder\u00e0 a lanciare nuove. Durante il riavvio, il sistema non funzioner\u00e0 e gli utenti subiranno disagi.<\/p>\n<p>Nel Kubernetes stesso, un problema simile \u00e8 esistito a lungo. E ora, dopo 4 anni dall'apertura <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/kubernetes\/issues\/13488\">Issue<\/a><\/noindex>, il problema \u00e8 stato risolto e a partire dalla versione 1.15 di Kubernetes \u00e8 disponibile la possibilit\u00e0 di rolling-restart dei pod.<\/p>\n<p>Helm semplicemente chiude tutte le applicazioni e avvia nuovi contenitori affianco. In produzione non \u00e8 permesso farlo, per non causare inattivit\u00e0 all'applicazione. Questo dovrebbe essere fatto solo per esigenze di sviluppo, e pu\u00f2 essere eseguito solo in ambienti di stage.<\/p>\n<h2>Come aggiornare la versione dell'applicazione utilizzando Helm?<\/h2>\n<p>\nModificheremo i valori inviati a Helm. Di solito, si tratta di valori sostituiti al posto del tag dell'immagine. Nel caso di latest, comunemente usato per ambienti non produttivi, l'informazione modificabile \u00e8 l'annotazione, che per Kubernetes stessa \u00e8 inutile, mentre per Helm rappresenta un segnale per l'aggiornamento dell'applicazione. Opzioni per riempire il valore dell'annotazione:<\/p>\n<ol>\n<li><strong>Valore casuale<\/strong> utilizzando la funzione standard \u2014 <code>{{ randAlphaNum 6 }}<\/code>. <br \/>\nC'\u00e8 un'osservazione: dopo ogni deployment utilizzando un chart con tale variabile, il valore dell'annotazione sar\u00e0 unico, e Helm presumer\u00e0 che ci siano delle modifiche. Di conseguenza, riavvieremo sempre l'applicazione, anche se non ne abbiamo cambiato la versione. Questo non \u00e8 critico, poich\u00e9 non ci sar\u00e0 inattivit\u00e0, ma \u00e8 comunque sgradevole.<\/li>\n<li>Inserire la <strong>data e ora<\/strong> \u2014 <code>{{ .Release.Date }}<\/code>. <br \/>\nL'opzione sembra un valore casuale con una variabile sempre unica.<\/li>\n<li>Un modo pi\u00f9 corretto \u00e8 utilizzare <strong>checksum<\/strong>. Questo \u00e8 lo SHA dell'immagine o lo SHA dell'ultimo commit nel git \u2014 <code>{{ .Values.sha }}<\/code>. <br \/>\nDovranno essere calcolati e inviati al client Helm sul lato chiamante, ad esempio in Jenkins. Se l'applicazione \u00e8 cambiata, anche il checksum cambier\u00e0. Di conseguenza, Helm aggiorner\u00e0 l'applicazione solo quando necessario.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Riassumiamo i nostri tentativi.<\/h2>\n<p><\/p>\n<ul>\n<li>Helm apporta le modifiche nel modo meno invasivo, quindi qualsiasi cambiamento a livello di immagine dell'applicazione nel Docker Registry non porter\u00e0 a un aggiornamento: dopo l'esecuzione del comando, non accadr\u00e0 nulla.<\/li>\n<li>Chiave <code>\u2014force<\/code> \u00e8 utilizzato per il ripristino di release problematiche e non \u00e8 correlato a un aggiornamento forzato.<\/li>\n<li>Chiave <code>--recreate-pods<\/code> aggiorner\u00e0 forzatamente le applicazioni, ma lo far\u00e0 in modo distruttivo: spegner\u00e0 bruscamente tutti i container. Gli utenti subiranno disagi; in produzione non si dovrebbe fare in questo modo.<\/li>\n<li>Non \u00e8 necessario apportare modifiche direttamente al cluster Kubernetes usando il comando <code>kubectl edit<\/code> : violeremmo la coerenza, e il comportamento varier\u00e0 a seconda della versione di Helm.<\/li>\n<li>Con l'uscita della nuova versione di Helm, sono emersi molti dettagli. Le Issues nel repository di Helm sono descritte in modo chiaro e possono aiutare a comprendere le sfumature.<\/li>\n<li>Aggiungere un'annotazione modificabile nel chart lo render\u00e0 pi\u00f9 flessibile. Questo permetter\u00e0 di distribuire l'applicazione in modo corretto, senza interruzione.<\/li>\n<\/ul>\n<p>\nUn pensiero del tipo \"pace nel mondo\", che funziona in tutti gli ambiti della vita: leggi le istruzioni prima dell'uso, non dopo. Solo possedendo tutte le informazioni, sar\u00e0 possibile costruire sistemi affidabili e rendere gli utenti felici.<\/p>\n<p><strong>Altri link pertinenti:<\/strong><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/453734\/\">Introduzione a <i>Helm<\/i> 3<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/\">Sito ufficiale di Helm<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\">Repository di Helm su GitHub<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/425343\/\">25 strumenti utili per Kubernetes: distribuzione e gestione<\/a><\/noindex><\/li>\n<\/ol>\n<p>\nQuesta relazione \u00e8 stata presentata per la prima volta al <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/at-kubernetes-conference\/\">@Kubernetes Conference<\/a><\/noindex> da Mail.ru Cloud Solutions. Guarda <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/playlist?list=PLQzTaxmOHjnv0tP_HDxsIvcuac2kkIJTQ\">video<\/a><\/noindex> altri interventi e iscriviti agli avvisi degli eventi su Telegram <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/k8s_mail\">Attorno a Kubernetes in Mail.ru Group<\/a><\/noindex>.<br \/>\n<br \/>Fonte: <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\/it\/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=\"it_IT\" \/>\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\/it\/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 La struttura di Helm e le sue insidie | ProHoster","description":"Concetto di trasportatore Typhon, Anton Swanepoel. Mi chiamo Dmitry Sugrobov, sono sviluppatore in 'Leroy Merlin'. In questo articolo, parler\u00f2 dell'importanza di Helm, come semplifica il lavoro con Kubernetes, cosa \u00e8 cambiato nella terza versione e come utilizzarlo per aggiornare le applicazioni in produzione senza interruzioni. Questa \u00e8 un'analisi basata su una presentazione alla conferenza @Kubernetes Conference by Mail.ru Cloud.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/70954","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=70954"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/70954\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/70955"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=70954"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=70954"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=70954"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}