{"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\/da\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni","title":{"rendered":"Helm-enhed og dens faldgruber","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Helm-enhed og dens faldgruber\" 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\">Typhon fragt transportkoncept, Anton Swanepoel<\/a><\/noindex><\/p>\n<p>Mit mit navn er Dmitry Sugrobov, jeg er udvikler hos \u00abLeroy Merlin\u00bb. I denne artikel vil jeg fort\u00e6lle, hvorfor Helm er vigtigt, hvordan det forenkler arbejdet med Kubernetes, hvad der er \u00e6ndret i den tredje version, og hvordan man opdaterer applikationer i produktionen uden nedetid ved hj\u00e6lp af det.<\/p>\n<p>Dette er et resum\u00e9 inspireret af et opl\u00e6g p\u00e5 konferencen <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/at-kubernetes-conference\/\">@Kubernetes Konference<\/a><\/noindex> by <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\">Mail.ru Cloud Solutions<\/a><\/noindex> \u2014 hvis du ikke vil l\u00e6se, s\u00e5 se videoen.<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=\"Afspil 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>Hvorfor vi bruger Kubernetes i produktion<\/h2>\n<p>\n\u00abLeroy Merlin\u00bb er en markedsleder inden for DIY-detailhandel i Rusland og Europa. I vores virksomhed er der mere end hundrede udviklere, 33.000 interne medarbejdere og et stort antal mennesker, der bes\u00f8ger hypermarkederne og hjemmesiden. For at g\u00f8re alle dem glade besluttede vi at f\u00f8lge de standardmetoder i branchen. Vi udvikler nye applikationer ved hj\u00e6lp af mikroservicesarkitektur; for at isolere milj\u00f8er og sikre korrekt levering bruger vi containere; og til orkestrering bruger vi Kubernetes. Prisen for at bruge orkestratorer falder hastigt: p\u00e5 markedet stiger antallet af ingeni\u00f8rer, der behersker teknologien, og der kommer udbydere, der tilbyder Kubernetes som en tjeneste.<\/p>\n<p>Alt, hvad Kubernetes g\u00f8r, kan selvf\u00f8lgelig g\u00f8res p\u00e5 andre m\u00e5der, for eksempel ved at smide en masse scripts oveni Jenkins og docker-compose, men hvorfor g\u00f8re livet mere kompliceret, hvis der findes en klar og p\u00e5lidelig l\u00f8sning? Derfor valgte vi Kubernetes og har allerede brugt det i produktionen i et \u00e5r. I \u00f8jeblikket har vi fireogtyve Kubernetes-klynger, den \u00e6ldste af dem er over et \u00e5r gammel og har omkring to hundrede pods.<\/p>\n<h2>Forbandelsen ved et stort antal YAML-filer i Kubernetes<\/h2>\n<p>\nFor at starte en mikrotjeneste i Kubernetes skal vi oprette mindst fem YAML-filer: til Deployment, Service, Ingress, ConfigMap, Secrets \u2014 og sende dem til klyngen. Til den n\u00e6ste applikation skriver vi den samme pakke af YAML-filer, den tredje \u2014 endnu en, og s\u00e5 videre. Hvis vi multiplicerer antallet af dokumenter med antallet af milj\u00f8er, har vi allerede hundrede filer, og det er endnu ikke medregnet dynamiske milj\u00f8er.<\/p>\n<p><img decoding=\"async\" alt=\"Helm-enhed og dens faldgruber\" src=\"\/wp-content\/uploads\/2020\/02\/c46c3f5ae49cbefa4851cbb388bfd051.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAdam Reese, kernevedligeholder for Helm, introducerede begrebet \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/cZ1S2Gp47ng?t=323\">Udviklingscyklus i Kubernetes<\/a><\/noindex>\u00bb, som ser s\u00e5ledes ud:<\/p>\n<ol>\n<li>Copy YAML - kopier YAML-filen.<\/li>\n<li>Paste YAML - inds\u00e6t den.<\/li>\n<li>Fix Indents - ret indrykningen.<\/li>\n<li>Repeat - gentag.<\/li>\n<\/ol>\n<p>\nMetoden fungerer, men det kr\u00e6ver, at man kopierer YAML-filer mange gange. For at \u00e6ndre denne cyklus blev Helm opfundet.<\/p>\n<h3>Hvad er Helm<\/h3>\n<p>\nFor det f\u00f8rste er Helm \u2014<strong> pakkeh\u00e5ndtering<\/strong>, der hj\u00e6lper med at finde og installere de n\u00f8dvendige programmer. For eksempel, for at installere MongoDB beh\u00f8ver man ikke at g\u00e5 ind p\u00e5 den officielle hjemmeside og downloade bin\u00e6rfilerne, det er nok at udf\u00f8re kommandoen <code>helm install stable\/mongodb<\/code>.<\/p>\n<p>For det andet, Helm \u2014 <strong>skabelonmotor<\/strong>, hj\u00e6lper med at parametrisere filer. Lad os vende tilbage til situationen med YAML-filer i Kubernetes. Det er lettere at skrive den samme YAML-fil, tilf\u00f8je nogle pladsholdere i den, som Helm vil inds\u00e6tte v\u00e6rdier i. Det vil sige, at i stedet for et stort antal YAML-filer vil der v\u00e6re et s\u00e6t skabeloner, hvor de n\u00f8dvendige v\u00e6rdier vil blive indsat p\u00e5 det rigtige tidspunkt.<\/p>\n<p>For det tredje, Helm \u2014 <strong>mester i deployment<\/strong>. Med det kan man installere, rulle tilbage og opdatere applikationer. Lad os se, hvordan man g\u00f8r det.<\/p>\n<p><img decoding=\"async\" alt=\"Helm-enhed og dens faldgruber\" src=\"\/wp-content\/uploads\/2020\/02\/8b517dbcf503ced229569fe3726418c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>S\u00e5dan bruger du Helm til at deploye dine egne applikationer<\/h3>\n<p>\nVi installerer Helm-klienten p\u00e5 computeren ved at f\u00f8lge den officielle <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/install\/\">vejledningen<\/a><\/noindex>. Derefter vil vi oprette et s\u00e6t YAML-filer. I stedet for at angive specifikke v\u00e6rdier vil vi lade pladsholdere st\u00e5, som Helm i fremtiden vil udfylde med information. S\u00e6ttet af disse filer kaldes en Helm Chart. I den konsolklient, der er Helm, kan det sendes p\u00e5 tre m\u00e5der:<\/p>\n<ul>\n<li>angive en mappe med skabeloner;<\/li>\n<li>pakke det i en .tar-arkiv og henvise til det;<\/li>\n<li>placere skabelonen i et fjernt lager og tilf\u00f8je et link til lageret i Helm-klienten.<\/li>\n<\/ul>\n<p>\nVi har ogs\u00e5 brug for en fil med v\u00e6rdier \u2014 values.yaml. Data derfra vil blive indsat i skabelonen. Lad os oprette den.<\/p>\n<p><img decoding=\"async\" alt=\"Helm-enhed og dens faldgruber\" src=\"\/wp-content\/uploads\/2020\/02\/c0fe24cc8186640147f95ce201794d96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI den anden version af Helm er der en ekstra serverapplikation \u2014 Tiller. Den k\u00f8rer uden for Kubernetes og venter p\u00e5 anmodninger fra Helm-klienten, og ved kaldet inds\u00e6tter de n\u00f8dvendige v\u00e6rdier i skabelonen og sender den til Kubernetes.<\/p>\n<p><img decoding=\"async\" alt=\"Helm-enhed og dens faldgruber\" src=\"\/wp-content\/uploads\/2020\/02\/6b821a0bb4680829d5ce9982d2bb4c55.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHelm 3 er enklere: i stedet for at behandle skabeloner p\u00e5 serveren, behandles informationen nu helt p\u00e5 siden af Helm-klienten og sendes direkte til Kubernetes API. Denne forenkling forbedrer sikkerheden for klyngen og letter udrulningsprocessen.<\/p>\n<p><strong>Hvordan fungerer det hele?<\/strong><\/p>\n<p>Vi k\u00f8rer kommandoen <code>helm install<\/code>. Lad os angive navnet p\u00e5 applikationsudgivelsen, give stien til values.yaml. I slutningen angiver vi lageret, hvor chartet ligger, og navnet p\u00e5 chartet. I eksemplet er det \u00ablmru\u00bb og \u00abbestchart\u00bb henholdsvis.<\/p>\n<pre><code class=\"plaintext\">helm install --name bestapp --values values.yaml lmru\/bestchart\n<\/code><\/pre>\n<p>\nUdf\u00f8relse af kommandoen er kun mulig \u00e9n gang, ved gentagen udf\u00f8relse i stedet for <code>installation<\/code> skal der anvendes <code>opgraderinger<\/code>. For enkelhed kan man udf\u00f8re kommandoen <code>opgraderinger<\/code> med en ekstra n\u00f8gle <code>--install<\/code>Ved f\u00f8rste udf\u00f8relse vil Helm sende en kommando til at installere udgivelsen, og fremover vil den opdatere den.<\/p>\n<pre><code class=\"plaintext\">helm upgrade --install bestapp --values values.yaml lmru\/bestchart\n<\/code><\/pre>\n<p><\/p>\n<h2>Fallgruber ved deployment af nye versioner af applikationen med Helm<\/h2>\n<p>\n<i>I denne del af fort\u00e6llingen spiller jeg med salen i \"Hvem vil v\u00e6re million\u00e6r?\", og vi unders\u00f8ger, hvordan man f\u00e5r Helm til at opdatere applikationens version. <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/w1PhTe9gnOI?list=PLQzTaxmOHjnv0tP_HDxsIvcuac2kkIJTQ&amp;t=778\"><i>Se video<\/i><\/a><\/noindex>.<\/p>\n<p>Da jeg studerede Helm, blev jeg overrasket over den m\u00e6rkelige opf\u00f8rsel, n\u00e5r jeg fors\u00f8gte at opdatere versionerne af de k\u00f8rende applikationer. Jeg opdaterede applikationskoden, uploadede det nye billede til docker-registry, sendte en deployment-kommando \u2013 og der skete intet. Nedenfor er nogle mindre vellykkede metoder til at opdatere applikationer. Ved at unders\u00f8ge hver af dem n\u00e6rmere begynder man at forst\u00e5 v\u00e6rkt\u00f8jets indre mekanisme og \u00e5rsagerne til denne ikke-indlysende opf\u00f8rsel.<\/p>\n<p><strong>Metode 1. Ikke \u00e6ndre informationen siden sidste opstart<\/strong><\/p>\n<p>Som det siges <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/using_helm\/#helm-upgrade-and-helm-rollback-upgrading-a-release-and-recovering-on-failure\">den officielle hjemmeside<\/a><\/noindex> Helm, \"Kubernetes charts kan v\u00e6re store og komplekse, s\u00e5 Helm fors\u00f8ger ikke at \u00e6ndre noget un\u00f8digt\". S\u00e5 hvis man opdaterer latest-versionen af applikationens billede i docker registry og udf\u00f8rer kommandoen <code>helm upgrade<\/code>, vil der ikke ske noget. Helm vil tro, at der ikke er sket nogen \u00e6ndringer, og der er ikke behov for at sende en opdateringskommando til Kubernetes.<\/p>\n<blockquote><p>Her og fremover er tagget latest kun vist som eksempel. N\u00e5r man angiver dette tag, vil Kubernetes hver gang hente billedet fra docker registry, uanset parameteren imagePullPolicy. Brug af latest i produktion anbefales ikke og kan for\u00e5rsage bivirkninger.<\/p><\/blockquote>\n<p>\n<strong>Metode 2. Opdatere LABEL i billedet<\/strong><\/p>\n<p>Som det st\u00e5r i samme <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/using_helm\/#helm-upgrade-and-helm-rollback-upgrading-a-release-and-recovering-on-failure\">dokumentationen<\/a><\/noindex>, \"Helm vil kun opdatere applikationen, hvis den er blevet \u00e6ndret siden den sidste udgivelse\". En logisk mulighed for dette ville v\u00e6re at opdatere LABEL-tagget i selve docker-billedet. Men Helm kigger ikke ind i applikationernes billeder og har ikke kendskab til eventuelle \u00e6ndringer i dem. Derfor, n\u00e5r man opdaterer etiketterne i billedet, vil Helm ikke f\u00e5 kendskab til dem, og opdateringskommandoen til applikationen vil ikke blive sendt til Kubernetes.<\/p>\n<p><strong>Metode 3. Brug en n\u00f8gle <code>--force<\/code><\/strong><\/p>\n<p><img decoding=\"async\" alt=\"Helm-enhed og dens faldgruber\" src=\"\/wp-content\/uploads\/2020\/02\/4888cddfb7698b7044ab31b6f6070063.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLad os se i manualerne og finde den n\u00f8dvendige n\u00f8gle. Den mest passende n\u00f8gle i betydning ser ud til at v\u00e6re n\u00f8glen <code>--force<\/code>. P\u00e5 trods af det sigende navn, adskiller adf\u00e6rden sig fra det forventede. I stedet for at tvinge en opdatering af applikationen, er dens egentlige form\u00e5l genopretning af en udgivelse, der er i status FAILED. Hvis denne n\u00f8gle ikke bruges, skal kommandoerne udf\u00f8res sekventielt. <code>helm delete &amp;&amp; helm install --replace<\/code>. I stedet foresl\u00e5s det at bruge n\u00f8glen <code>--force<\/code>, som automatiserer sekventiel udf\u00f8relse af disse kommandoer. Mere information findes i denne <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\/pull\/3597\">pull-request.<\/a><\/noindex>. For at f\u00e5 Helm til endelig at opdatere versionen af applikationen, fungerer desv\u00e6rre denne n\u00f8gle ikke.<\/p>\n<p><strong>M\u00e5de 4. \u00c6ndring af labels direkte i Kubernetes.<\/strong><\/p>\n<p><img decoding=\"async\" alt=\"Helm-enhed og dens faldgruber\" src=\"\/wp-content\/uploads\/2020\/02\/0a35e7aaa7479685f07dd5b935c95eb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOpdatering af label direkte i klyngen ved hj\u00e6lp af kommandoen <code>kubectl edit<\/code> \u2013 det er en d\u00e5rlig id\u00e9. Denne handling vil f\u00f8re til inkonsistens mellem den k\u00f8rende applikation og det, der oprindeligt blev sendt til deployment. Helm's adf\u00e6rd ved deployment i dette tilf\u00e6lde adskiller sig fra dets version: Helm 2 vil ikke g\u00f8re noget, mens Helm 3 vil deploye en ny version af applikationen. For at forst\u00e5 \u00e5rsagen, er det n\u00f8dvendigt at forst\u00e5, hvordan Helm fungerer.<\/p>\n<h3>Hvordan fungerer Helm?<\/h3>\n<p>\nFor at bestemme, om applikationen er \u00e6ndret siden den sidste udgivelse, kan Helm benytte sig af:<\/p>\n<ul>\n<li>den k\u00f8rende applikation i Kubernetes;<\/li>\n<li>en ny values.yaml og den aktuelle chart;<\/li>\n<li>intern information fra Helm om udgivelserne.<\/li>\n<\/ul>\n<p><b class=\"spoiler_title\">For de mest nysgerrige: hvor gemmer Helm intern information om udgivelserne?<\/b>Ved at k\u00f8re kommandoen <code>helm history<\/code>, f\u00e5r vi al information om versioner installeret ved hj\u00e6lp af Helm.<\/p>\n<p><img decoding=\"async\" alt=\"Helm-enhed og dens faldgruber\" src=\"\/wp-content\/uploads\/2020\/02\/0bf3afeb9c4947220474af648a1fa1ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDer er ogs\u00e5 detaljeret information om de sendte skabeloner og v\u00e6rdier. Vi kan anmode om det:<\/p>\n<p><img decoding=\"async\" alt=\"Helm-enhed og dens faldgruber\" src=\"\/wp-content\/uploads\/2020\/02\/858560c0f4adf7375060cec339df7574.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI den anden version af Helm ligger disse oplysninger i den samme namespace, hvor Tiller k\u00f8rer (standard er kube-system), i en ConfigMap m\u00e6rket med labelen \u00abOWNER=TILLER\u00bb:<\/p>\n<p><img decoding=\"async\" alt=\"Helm-enhed og dens faldgruber\" src=\"\/wp-content\/uploads\/2020\/02\/ba665a079ccddeb4ca7049822c42a498.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI takt med at den tredje version af Helm kom frem, blev informationen flyttet til hemmeligheder, og i samme namespace, hvor applikationen k\u00f8rer. Dette gjorde det muligt at k\u00f8re flere applikationer samtidigt i forskellige namespaces med det samme navn p\u00e5 udgivelsen. I den anden version var dette en stor hovedpine, n\u00e5r namespaces er isolerede, men kan p\u00e5virke hinanden.<\/p>\n<p><img decoding=\"async\" alt=\"Helm-enhed og dens faldgruber\" src=\"\/wp-content\/uploads\/2020\/02\/b9b82b7c86320a0e3642e4265a1f0241.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nDen anden Helm, n\u00e5r den fors\u00f8ger at forst\u00e5, om der er behov for en opdatering, bruger kun to kilder til information: det, der blev givet nu, og den interne information om udgivelserne, som ligger i ConfigMap.<\/p>\n<p><img decoding=\"async\" alt=\"Helm-enhed og dens faldgruber\" src=\"\/wp-content\/uploads\/2020\/02\/0550ba5f6ce7be1e7f666dfc65e639ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDen tredje Helm bruger en three-way merge-strategi: ud over den information, der tages i betragtning, overvejer den ogs\u00e5 applikationen, der k\u00f8rer lige nu i Kubernetes.<\/p>\n<p><img decoding=\"async\" alt=\"Helm-enhed og dens faldgruber\" src=\"\/wp-content\/uploads\/2020\/02\/252085adb83e097e01b4a0655706ede5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAf denne grund vil den gamle version af Helm ikke g\u00f8re noget, da den ikke tager hensyn til informationen om applikationen i klyngen, mens Helm 3 vil modtage \u00e6ndringerne og sende den nye applikation til deployment.<\/p>\n<p><strong>Metode 5. Brug n\u00f8gle &#8212;recreate-pods<\/strong><\/p>\n<p>Med n\u00f8glen <code>--recreate-pods<\/code> kan man opn\u00e5, hvad der oprindeligt var meningen med n\u00f8glen <code>--force<\/code>. Containerne vil blive genstartet, og if\u00f8lge politikken imagePullPolicy: Always for tagget latest (dette er n\u00e6vnt tidligere), vil Kubernetes downloade og starte den nye version af billedet. Det vil ikke ske p\u00e5 den bedste m\u00e5de: uden at tage hensyn til StrategyType for deployment, vil det skarpt slukke for alle gamle instanser af applikationen og begynde at starte nye. Under genstarten vil systemet ikke fungere, og brugerne vil lide.<\/p>\n<p>I selve Kubernetes eksisterede der ogs\u00e5 et lignende problem i lang tid. Og nu, fire \u00e5r efter \u00e5bningen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/kubernetes\/issues\/13488\">Problem<\/a><\/noindex>, er problemet blevet l\u00f8st, og fra version 1.15 af Kubernetes er der mulighed for rolling-restart af pods.<\/p>\n<p>Helm slukker simpelthen for alle applikationer og starter nye containere ved siden af. I produktionen kan man ikke g\u00f8re det, da det vil for\u00e5rsage nedetid for applikationen. Dette skal kun g\u00f8res for udviklingsform\u00e5l, og kan kun udf\u00f8res i stage-milj\u00f8er.<\/p>\n<h2>Hvordan opdaterer man applikationsversionen ved hj\u00e6lp af Helm?<\/h2>\n<p>\nVi vil \u00e6ndre v\u00e6rdierne, der sendes til Helm. Som regel er dette v\u00e6rdier, der inds\u00e6ttes i stedet for billede-tagget. I tilf\u00e6lde af latest, som ofte bruges til ikke-produktive milj\u00f8er, fungerer annotationen, som er v\u00e6rdifuld for Helm, men ubrugelig for Kubernetes, som et signal til opdatering af applikationen. Muligheder for at udfylde annoteringsv\u00e6rdien:<\/p>\n<ol>\n<li><strong>Tilf\u00e6ldig v\u00e6rdi<\/strong> ved hj\u00e6lp af den standardfunktion \u2014 <code>{{ randAlphaNum 6 }}<\/code>. <br \/>\nDer er et nuanceret punkt: efter hver deployment ved hj\u00e6lp af chart med en s\u00e5dan variabel vil annoteringsv\u00e6rdien v\u00e6re unik, og Helm vil tro, at der er \u00e6ndringer. Dette betyder, at vi altid vil genstarte applikationen, selvom vi ikke har \u00e6ndret dens version. Det er ikke kritisk, da der ikke vil v\u00e6re nedetid, men det er stadig ubehageligt.<\/li>\n<li>Inds\u00e6tte den nuv\u00e6rende <strong>dato og tid<\/strong> \u2014 <code>{{ .Release.Date }}<\/code>. <br \/>\nVarianten ligner en tilf\u00e6ldig v\u00e6rdi med en konstant unik variabel.<\/li>\n<li>En mere korrekt m\u00e5de er at bruge <strong>kontrolsummer<\/strong>. Dette er SHA for billedet eller SHA for den seneste commit i git \u2014 <code>{{ .Values.sha }}<\/code>. <br \/>\nDe skal t\u00e6lles og sendes til Helm-klienten p\u00e5 den kaldende side, for eksempel i Jenkins. Hvis applikationen \u00e6ndres, \u00e6ndres kontrolsummen ogs\u00e5. Derfor vil Helm kun opdatere applikationen, n\u00e5r det er n\u00f8dvendigt.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Lad os opsummere vores fors\u00f8g<\/h2>\n<p><\/p>\n<ul>\n<li>Helm foretr\u00e6kker at lave \u00e6ndringer p\u00e5 den mindst invasive m\u00e5de, s\u00e5 enhver \u00e6ndring p\u00e5 niveauet for applikationsbilledet i Docker Registry f\u00f8rer ikke til en opdatering: efter udf\u00f8relsen af kommandoen vil intet ske.<\/li>\n<li>N\u00f8gle <code>--force<\/code> bruger til at gendanne problematiske udgivelser og er ikke relateret til en tvungen opdatering.<\/li>\n<li>N\u00f8gle <code>--recreate-pods<\/code> tvinger applikationer til at opdatere, men g\u00f8r det p\u00e5 en vildg\u00e5ende m\u00e5de: den slukker brat for alle containere. Dette vil skade brugerne, og det b\u00f8r ikke g\u00f8res i produktion.<\/li>\n<li>At foretage \u00e6ndringer direkte i Kubernetes-klusteret ved hj\u00e6lp af kommandoen <code>kubectl edit<\/code> skal undg\u00e5s: vi vil bryde konsistens, og adf\u00e6rden vil variere afh\u00e6ngigt af Helm-versionen.<\/li>\n<li>Med den nye version af Helm er der opst\u00e5et mange nuancer. Issues i Helm-repositoriet er beskrevet i et letforst\u00e5eligt sprog, og de vil hj\u00e6lpe med at forst\u00e5 detaljerne.<\/li>\n<li>At tilf\u00f8je en \u00e6ndret annotation til chartet vil g\u00f8re det mere fleksibelt. Dette vil muligg\u00f8re korrekt udrulning af applikationen uden nedetid.<\/li>\n<\/ul>\n<p>\nEn tanke fra kategorien 'verdensfred', der fungerer i alle livets omr\u00e5der: l\u00e6s brugsanvisningen inden brug, ikke efter. Kun ved at have fuld information vil det v\u00e6re muligt at bygge p\u00e5lidelige systemer og g\u00f8re brugerne glade.<\/p>\n<p><strong>Andre links om emnet:<\/strong><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/453734\/\">Introduktion til <i>Helm<\/i> 3<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/\">Den officielle Helm-hjemmeside<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\">Helm-repositoriet p\u00e5 GitHub<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/425343\/\">25 nyttige Kubernetes-v\u00e6rkt\u00f8jer: udrulning og administration<\/a><\/noindex><\/li>\n<\/ol>\n<p>\nDenne pr\u00e6sentation blev f\u00f8rste gang pr\u00e6senteret ved <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/at-kubernetes-conference\/\">@Kubernetes Konference<\/a><\/noindex> af Mail.ru Cloud Solutions. Se <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/playlist?list=PLQzTaxmOHjnv0tP_HDxsIvcuac2kkIJTQ\">en video<\/a><\/noindex> andre pr\u00e6sentationer og tilmeld dig nyhedsbreve om arrangementer p\u00e5 Telegram <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/k8s_mail\">Omkring Kubernetes i Mail.ru Group<\/a><\/noindex>.<br \/>\n<br \/>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Helm-struktur og dens faldgruber | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/70954","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=70954"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/70954\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/70955"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=70954"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=70954"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=70954"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}