{"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\/pl\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni","title":{"rendered":"Urz\u0105dzenie Helm i jego pu\u0142apki","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Urz\u0105dzenie Helm i jego pu\u0142apki\" 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\">Koncept transportowca Typhon, Anton Swanepoel<\/a><\/noindex><\/p>\n<p>Nazywam si\u0119 Dmitrij Sugrobow, jestem programist\u0105 w \u201eLeroy Merlin\u201d. W artykule opowiem, po co potrzebny jest Helm, jak upraszcza prac\u0119 z Kubernetes, co si\u0119 zmieni\u0142o w trzeciej wersji i jak za jego pomoc\u0105 aktualizowa\u0107 aplikacje w produkcji bez przestoj\u00f3w.<\/p>\n<p>To jest streszczenie na podstawie wyst\u0105pienia na konferencji <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 je\u015bli nie chcesz czyta\u0107, obejrzyj wideo.<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=\"Odtwarzaj wideo\" 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>Dlaczego u\u017cywamy Kubernetes w produkcji<\/h2>\n<p>\n\u201eLeroy Merlin\u201d jest liderem na rynku DIY w Rosji i Europie. W naszej firmie pracuje ponad stu programist\u00f3w, 33 000 pracownik\u00f3w i ogromna liczba os\u00f3b odwiedzaj\u0105cych hipermarkety i stron\u0119 internetow\u0105. Aby uszcz\u0119\u015bliwi\u0107 wszystkich, postanowili\u015bmy stosowa\u0107 standardowe podej\u015bcia w bran\u017cy. Tworzy\u0107 nowe aplikacje, korzystaj\u0105c z architektury mikrous\u0142ugowej; aby izolowa\u0107 \u015brodowiska i zapewni\u0107 w\u0142a\u015bciw\u0105 dostaw\u0119, stosowa\u0107 kontenery; a do orkiestracji u\u017cywa\u0107 Kubernetes. Koszt korzystania z orkiestrator\u00f3w szybko maleje: na rynku przybywa in\u017cynier\u00f3w znaj\u0105cych t\u0119 technologi\u0119, pojawiaj\u0105 si\u0119 dostawcy oferuj\u0105cy Kubernetes jako us\u0142ug\u0119.<\/p>\n<p>Wszystko, co robi Kubernetes, mo\u017cna oczywi\u015bcie osi\u0105gn\u0105\u0107 innymi metodami, na przyk\u0142ad u\u017cywaj\u0105c Jenkins i docker-compose, ale po co utrudnia\u0107 sobie \u017cycie, je\u015bli jest gotowe i niezawodne rozwi\u0105zanie? Dlatego zdecydowali\u015bmy si\u0119 na Kubernetes i ju\u017c od roku u\u017cywamy go w produkcji. Obecnie mamy dwadzie\u015bcia cztery klastry Kubernetes, najstarszy z nich ma ponad rok, w nim jest oko\u0142o dwustu pod\u00f3w.<\/p>\n<h2>Przekle\u0144stwo du\u017cych ilo\u015bci plik\u00f3w YAML w Kubernetes<\/h2>\n<p>\nAby uruchomi\u0107 mikrous\u0142ug\u0119 w Kubernetes, musimy stworzy\u0107 co najmniej pi\u0119\u0107 plik\u00f3w YAML: dla Deployment, Service, Ingress, ConfigMap, Secrets \u2014 i wys\u0142a\u0107 je do klastra. Dla nast\u0119pnej aplikacji napiszemy ten sam zestaw plik\u00f3w YAML, dla trzeciej \u2014 jeszcze jeden i tak dalej. Pomn\u00f3\u017cmy liczb\u0119 dokument\u00f3w przez liczb\u0119 \u015brodowisk, ju\u017c otrzymujemy setki plik\u00f3w, nie uwzgl\u0119dniaj\u0105c jeszcze dynamicznych \u015brodowisk.<\/p>\n<p><img decoding=\"async\" alt=\"Urz\u0105dzenie Helm i jego pu\u0142apki\" src=\"\/wp-content\/uploads\/2020\/02\/c46c3f5ae49cbefa4851cbb388bfd051.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAdam Reese, g\u0142\u00f3wny opiekun Helm, wprowadzi\u0142 poj\u0119cie \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/cZ1S2Gp47ng?t=323\">Cykl rozwoju w Kubernetes<\/a><\/noindex>\u201d, kt\u00f3ry wygl\u0105da tak:<\/p>\n<ol>\n<li>Copy YAML \u2014 skopiuj plik YAML.<\/li>\n<li>Paste YAML \u2014 wklej go.<\/li>\n<li>Fix Indents \u2014 popraw wci\u0119cia.<\/li>\n<li>Repeat \u2014 powt\u00f3rz.<\/li>\n<\/ol>\n<p>\nOpcja dzia\u0142a, ale trzeba wiele razy kopiowa\u0107 pliki YAML. Aby zmieni\u0107 ten cykl, wymy\u015blono Helm.<\/p>\n<h3>Czym jest Helm<\/h3>\n<p>\nPo pierwsze, Helm \u2014<strong> mened\u017cer pakiet\u00f3w<\/strong>, pomagaj\u0105cy znale\u017a\u0107 i zainstalowa\u0107 potrzebne programy. Aby zainstalowa\u0107, na przyk\u0142ad, MongoDB nie trzeba wchodzi\u0107 na oficjaln\u0105 stron\u0119 i pobiera\u0107 plik\u00f3w binarnych, wystarczy wykona\u0107 polecenie <code>helm install stable\/mongodb<\/code>.<\/p>\n<p>Po drugie, Helm \u2014 <strong>szablonowanie<\/strong>, pomaga parametryzowa\u0107 pliki. Wr\u00f3\u0107my do sytuacji z plikami YAML w Kubernetes. \u0141atwiej jest napisa\u0107 ten sam plik YAML, doda\u0107 do niego kilka placeholder\u00f3w, w kt\u00f3re Helm podstawia warto\u015bci. To znaczy, \u017ce zamiast du\u017cego zestawu plik\u00f3w YAML b\u0119dziemy mieli zestaw szablon\u00f3w, w kt\u00f3re w odpowiednim momencie zostan\u0105 podstawione potrzebne warto\u015bci.<\/p>\n<p>Po trzecie, Helm \u2014 <strong>mistrz wdro\u017ce\u0144<\/strong>. Dzi\u0119ki niemu mo\u017cna instalowa\u0107, cofa\u0107 i aktualizowa\u0107 aplikacje. Zobaczmy, jak to zrobi\u0107.<\/p>\n<p><img decoding=\"async\" alt=\"Urz\u0105dzenie Helm i jego pu\u0142apki\" src=\"\/wp-content\/uploads\/2020\/02\/8b517dbcf503ced229569fe3726418c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Jak u\u017cywa\u0107 Helm do wdra\u017cania w\u0142asnych aplikacji<\/h3>\n<p>\nZainstalujemy klienta Helm na komputerze, post\u0119puj\u0105c zgodnie z oficjaln\u0105 <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/install\/\">instrukcj\u0105<\/a><\/noindex>. Nast\u0119pnie stworzymy zestaw plik\u00f3w YAML. Zamiast podawania konkretnych warto\u015bci zostawimy placeholdery, kt\u00f3re w przysz\u0142o\u015bci Helm wype\u0142ni informacjami. Zestaw takich plik\u00f3w nazywa si\u0119 Helm chart. Do klienta konsolowego Helm mo\u017cna go wys\u0142a\u0107 na trzy sposoby:<\/p>\n<ul>\n<li>wskaza\u0107 folder z szablonami;<\/li>\n<li>zapakowa\u0107 w archiwum .tar i wskaza\u0107 na nie;<\/li>\n<li>doda\u0107 szablon do zdalnego repozytorium i doda\u0107 link do repozytorium w kliencie Helm.<\/li>\n<\/ul>\n<p>\nNiezb\u0119dny jest tak\u017ce plik ze warto\u015bciami \u2014 values.yaml. Dane z niego b\u0119d\u0105 podstawiane w szablon. Stw\u00f3rzmy go r\u00f3wnie\u017c.<\/p>\n<p><img decoding=\"async\" alt=\"Urz\u0105dzenie Helm i jego pu\u0142apki\" src=\"\/wp-content\/uploads\/2020\/02\/c0fe24cc8186640147f95ce201794d96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nW drugiej wersji Helm istnieje dodatkowa aplikacja serwerowa \u2014 Tiller. Dzia\u0142a na zewn\u0105trz Kubernetes i czeka na \u017c\u0105dania od klienta Helm, a po ich przyj\u0119ciu podstawia odpowiednie warto\u015bci w szablon i wysy\u0142a do Kubernetes.<\/p>\n<p><img decoding=\"async\" alt=\"Urz\u0105dzenie Helm i jego pu\u0142apki\" src=\"\/wp-content\/uploads\/2020\/02\/6b821a0bb4680829d5ce9982d2bb4c55.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHelm 3 jest prostszy: zamiast przetwarzania szablon\u00f3w na serwerze, informacje s\u0105 teraz przetwarzane ca\u0142kowicie po stronie klienta Helm i wysy\u0142ane bezpo\u015brednio do API Kubernetes. To uproszczenie zwi\u0119ksza bezpiecze\u0144stwo klastra i u\u0142atwia proces wdra\u017cania.<\/p>\n<p><strong>Jak to wszystko dzia\u0142a<\/strong><\/p>\n<p>Uruchamiamy polecenie <code>helm install<\/code>. Wska\u017cemy nazw\u0119 wydania aplikacji, podamy \u015bcie\u017ck\u0119 do values.yaml. Na ko\u0144cu wska\u017cemy repozytorium, w kt\u00f3rym znajduje si\u0119 chart oraz jego nazw\u0119. W tym przypadku to \u201elmru\u201d i \u201ebestchart\u201d odpowiednio.<\/p>\n<pre><code class=\"plaintext\">helm install --name bestapp --values values.yaml lmru\/bestchart\n<\/code><\/pre>\n<p>\nWykonanie polecenia jest mo\u017cliwe tylko raz, przy powt\u00f3rnym wykonaniu zamiast <code>install<\/code> trzeba u\u017cy\u0107 <code>upgrade<\/code>. Dla uproszczenia zamiast dw\u00f3ch polece\u0144 mo\u017cna wykona\u0107 polecenie <code>upgrade<\/code> z dodatkowym kluczem <code>--install<\/code>. Przy pierwszym uruchomieniu Helm wy\u015ble polecenie do zainstalowania wydania, a nast\u0119pnie b\u0119dzie je aktualizowa\u0107.<\/p>\n<pre><code class=\"plaintext\">helm upgrade --install bestapp --values values.yaml lmru\/bestchart\n<\/code><\/pre>\n<p><\/p>\n<h2>Pu\u0142apki w deploymencie nowych wersji aplikacji z Helm<\/h2>\n<p>\n<i>W tym momencie opowie\u015bci gram z sal\u0105 w 'Kto chce zosta\u0107 milionerem', i ustalamy, jak zmusi\u0107 Helm do aktualizacji wersji aplikacji. <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/w1PhTe9gnOI?list=PLQzTaxmOHjnv0tP_HDxsIvcuac2kkIJTQ&amp;t=778\"><i>Zobacz wideo<\/i><\/a><\/noindex>.<\/p>\n<p>Kiedy uczy\u0142em si\u0119 pracy z Helm, zaskoczy\u0142o mnie dziwne zachowanie podczas pr\u00f3by aktualizacji wersji uruchomionych aplikacji. Kod aplikacji zosta\u0142 zaktualizowany, nowy obraz zosta\u0142 za\u0142adowany do rejestru Dockera, wys\u0142a\u0142em polecenie do wdro\u017cenia \u2013 i nic si\u0119 nie sta\u0142o. Poni\u017cej kilka nie do ko\u0144ca udanych sposob\u00f3w aktualizacji aplikacji. Badaj\u0105c ka\u017cdy z nich bardziej szczeg\u00f3\u0142owo, zaczynasz rozumie\u0107 wewn\u0119trzn\u0105 struktur\u0119 narz\u0119dzia oraz przyczyny takiego nieoczywistego zachowania.<\/p>\n<p><strong>Spos\u00f3b 1. Nie zmienia\u0107 informacji od ostatniego uruchomienia<\/strong><\/p>\n<p>Jak g\u0142osi <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/using_helm\/#helm-upgrade-and-helm-rollback-upgrading-a-release-and-recovering-on-failure\">oficjalnej strony<\/a><\/noindex> Helm, 'Kubernetes chartry mog\u0105 by\u0107 du\u017ce i skomplikowane, wi\u0119c Helm stara si\u0119 niczego nie zmienia\u0107 bez potrzeby'. Dlatego, je\u015bli zaktualizujesz najnowsz\u0105 wersj\u0119 obrazu aplikacji w rejestrze dockera i wykonasz polecenie <code>helm upgrade<\/code>, to nic si\u0119 nie stanie. Helm b\u0119dzie my\u015bla\u0142, \u017ce nic si\u0119 nie zmieni\u0142o i nie b\u0119dzie potrzeby wysy\u0142ania w Kubernetes polecenia do aktualizacji aplikacji.<\/p>\n<blockquote><p>Tutaj i dalej tag latest pokazany jest wy\u0142\u0105cznie jako przyk\u0142ad. Przy wskazywaniu tego tagu Kubernetes za ka\u017cdym razem pobiera obraz z rejestru dockera, niezale\u017cnie od parametru imagePullPolicy. U\u017cywanie latest w produkcji jest niepo\u017c\u0105dane i powoduje efekty uboczne.<\/p><\/blockquote>\n<p>\n<strong>Spos\u00f3b 2. Aktualizowa\u0107 LABEL w obrazie<\/strong><\/p>\n<p>Jak napisano w tym samym <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/using_helm\/#helm-upgrade-and-helm-rollback-upgrading-a-release-and-recovering-on-failure\">dokumentacji<\/a><\/noindex>, 'Helm b\u0119dzie aktualizowa\u0107 aplikacj\u0119, tylko je\u015bli zmieni\u0142a si\u0119 od ostatniego wydania'. Logicznym sposobem na to wydaje si\u0119 aktualizacja etykiety LABEL w samym obrazie dockera. Jednak Helm nie zagl\u0105da do obraz\u00f3w aplikacji i nie ma poj\u0119cia o jakichkolwiek zmianach w nich. W zwi\u0105zku z tym, przy aktualizacji etykiet w obrazie, Helm ich nie zauwa\u017cy, a polecenie aktualizacji aplikacji w Kubernetes nie zostanie wys\u0142ane.<\/p>\n<p><strong>Spos\u00f3b 3. U\u017cywa\u0107 klucza <code>--force<\/code><\/strong><\/p>\n<p><img decoding=\"async\" alt=\"Urz\u0105dzenie Helm i jego pu\u0142apki\" src=\"\/wp-content\/uploads\/2020\/02\/4888cddfb7698b7044ab31b6f6070063.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nZwr\u00f3\u0107my si\u0119 do podr\u0119cznik\u00f3w i poszukajmy odpowiedniego klucza. Najbardziej sensownym zdaje si\u0119 klucz <code>--force<\/code>. Pomimo m\u00f3wi\u0105cej nazwy, zachowanie r\u00f3\u017cni si\u0119 od oczekiwanego. Zamiast wymusza\u0107 aktualizacj\u0119 aplikacji, rzeczywistym przeznaczeniem jest przywr\u00f3cenie wydania w statusie FAILED. Je\u015bli ten klucz nie jest u\u017cywany, konieczne jest sequentialne wykonanie polece\u0144 <code>helm delete &amp;&amp; helm install --replace<\/code>. Zamiast tego proponuje si\u0119 u\u017cycie klucza <code>--force<\/code>, kt\u00f3ry automatyzuje sekwencyjne wykonanie tych polece\u0144. Wi\u0119cej informacji w tej <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\/pull\/3597\">pro\u015bbie pull<\/a><\/noindex>. Aby poinformowa\u0107 Helm o konieczno\u015bci zaktualizowania wersji aplikacji, niestety ten klucz si\u0119 nie nadaje.<\/p>\n<p><strong>Spos\u00f3b 4. Zmiana oznacze\u0144 bezpo\u015brednio w Kubernetes<\/strong><\/p>\n<p><img decoding=\"async\" alt=\"Urz\u0105dzenie Helm i jego pu\u0142apki\" src=\"\/wp-content\/uploads\/2020\/02\/0a35e7aaa7479685f07dd5b935c95eb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAktualizacja etykiety bezpo\u015brednio w klastrze za pomoc\u0105 polecenia <code>kubectl edit<\/code> \u2014 to z\u0142y pomys\u0142. Ta akcja doprowadzi do niesp\u00f3jno\u015bci informacji pomi\u0119dzy dzia\u0142aj\u0105c\u0105 aplikacj\u0105 a tym, co pierwotnie zosta\u0142o wys\u0142ane na wdro\u017cenie. Zachowanie Helma podczas wdro\u017cenia w tym przypadku r\u00f3\u017cni si\u0119 od jego wersji: Helm 2 nic nie zrobi, a Helm 3 wyda now\u0105 wersj\u0119 aplikacji. Aby zrozumie\u0107 przyczyn\u0119, nale\u017cy zrozumie\u0107, jak dzia\u0142a Helm.<\/p>\n<h3>Jak dzia\u0142a Helm<\/h3>\n<p>\nAby okre\u015bli\u0107, czy aplikacja zmieni\u0142a si\u0119 od ostatniego wydania, Helm mo\u017ce skorzysta\u0107 z:<\/p>\n<ul>\n<li>dzia\u0142aj\u0105cej aplikacji w Kubernetes;<\/li>\n<li>nowego pliku values.yaml i aktualnego wykresu;<\/li>\n<li>wewn\u0119trznych informacji Helma o wydaniach.<\/li>\n<\/ul>\n<p><b class=\"spoiler_title\">Dla najbardziej dociekliwych: gdzie Helm przechowuje wewn\u0119trzne informacje o wydaniach?<\/b>Wykonuj\u0105c polecenie <code>helm history<\/code>, otrzymamy wszystkie informacje o wersjach zainstalowanych za pomoc\u0105 Helma.<\/p>\n<p><img decoding=\"async\" alt=\"Urz\u0105dzenie Helm i jego pu\u0142apki\" src=\"\/wp-content\/uploads\/2020\/02\/0bf3afeb9c4947220474af648a1fa1ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDodatkowo dost\u0119pne s\u0105 szczeg\u00f3\u0142owe informacje o przes\u0142anych szablonach i warto\u015bciach. Mo\u017cemy je zapyta\u0107:<\/p>\n<p><img decoding=\"async\" alt=\"Urz\u0105dzenie Helm i jego pu\u0142apki\" src=\"\/wp-content\/uploads\/2020\/02\/858560c0f4adf7375060cec339df7574.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nW drugiej wersji Helma te informacje znajduj\u0105 si\u0119 w tym samym przestrzeni nazw, gdzie uruchomiony jest Tiller (domy\u015blnie \u2014 kube-system), w ConfigMap oznaczonym etykiet\u0105 \u201eOWNER=TILLER\u201d:<\/p>\n<p><img decoding=\"async\" alt=\"Urz\u0105dzenie Helm i jego pu\u0142apki\" src=\"\/wp-content\/uploads\/2020\/02\/ba665a079ccddeb4ca7049822c42a498.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nW momencie pojawienia si\u0119 trzeciej wersji Helma informacje przenios\u0142y si\u0119 do sekret\u00f3w, w tym samym przestrzeni nazw, gdzie uruchomiona jest aplikacja. Dzi\u0119ki temu sta\u0142o si\u0119 mo\u017cliwe jednoczesne uruchamianie kilku aplikacji w r\u00f3\u017cnych przestrzeniach nazw z identycznymi nazwami wyda\u0144. W drugiej wersji by\u0142o to du\u017cy b\u00f3l g\u0142owy, gdy przestrzenie nazw by\u0142y izolowane, ale mog\u0142y na siebie wp\u0142ywa\u0107.<\/p>\n<p><img decoding=\"async\" alt=\"Urz\u0105dzenie Helm i jego pu\u0142apki\" src=\"\/wp-content\/uploads\/2020\/02\/b9b82b7c86320a0e3642e4265a1f0241.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nDrugi Helm, gdy pr\u00f3buje okre\u015bli\u0107, czy aktualizacja jest wymagana, korzysta tylko z dw\u00f3ch \u017ar\u00f3de\u0142 informacji: tego, co zosta\u0142o mu teraz dostarczone, oraz wewn\u0119trznych informacji o wydaniach, kt\u00f3re znajduj\u0105 si\u0119 w ConfigMap.<\/p>\n<p><img decoding=\"async\" alt=\"Urz\u0105dzenie Helm i jego pu\u0142apki\" src=\"\/wp-content\/uploads\/2020\/02\/0550ba5f6ce7be1e7f666dfc65e639ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTrzeci Helm u\u017cywa strategii tr\u00f3jstronnego scalania: opr\u00f3cz tej informacji bierze pod uwag\u0119 tak\u017ce aplikacj\u0119, kt\u00f3ra dzia\u0142a obecnie w Kubernetes.<\/p>\n<p><img decoding=\"async\" alt=\"Urz\u0105dzenie Helm i jego pu\u0142apki\" src=\"\/wp-content\/uploads\/2020\/02\/252085adb83e097e01b4a0655706ede5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nZ tego powodu stara wersja Helma nie b\u0119dzie nic robi\u0107, poniewa\u017c nie uwzgl\u0119dnia informacji o aplikacji w klastrze, a Helm 3 otrzyma zmiany i wdro\u017cy now\u0105 aplikacj\u0119.<\/p>\n<p><strong>Metoda 5. U\u017cy\u0107 klucza \u2014recreate-pods<\/strong><\/p>\n<p>Z pomoc\u0105 klucza <code>--recreate-pods<\/code> mo\u017cna osi\u0105gn\u0105\u0107 to, co pierwotnie planowano uzyska\u0107 za pomoc\u0105 klucza <code>--force<\/code>. Kontenery zostan\u0105 ponownie uruchomione, a zgodnie z polityk\u0105 imagePullPolicy: Always dla tagu latest (o tym w przypisie powy\u017cej), Kubernetes pobierze i uruchomi now\u0105 wersj\u0119 obrazu. Zrobi to w spos\u00f3b niezbyt optymalny: bez uwzgl\u0119dnienia StrategyType wdro\u017cenia, nagle wy\u0142\u0105czy wszystkie stare instancje aplikacji i przyst\u0105pi do uruchamiania nowych. W czasie ponownego uruchamiania system nie b\u0119dzie dzia\u0142a\u0142, u\u017cytkownicy b\u0119d\u0105 cierpie\u0107.<\/p>\n<p>W samym Kubernetes podobny problem r\u00f3wnie\u017c istnia\u0142 przez d\u0142ugi czas. I oto, cztery lata po zg\u0142oszeniu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/kubernetes\/issues\/13488\">Problemu<\/a><\/noindex>, problem zosta\u0142 rozwi\u0105zany, a pocz\u0105wszy od wersji 1.15 Kubernetes pojawi\u0142a si\u0119 mo\u017cliwo\u015b\u0107 rolling-restart pod\u00f3w.<\/p>\n<p>Helm po prostu wy\u0142\u0105cza wszystkie aplikacje i uruchamia nowe kontenery obok. Na produkcji nie mo\u017cna tak robi\u0107, aby nie wywo\u0142a\u0107 przestoju aplikacji. Takie co\u015b mo\u017cna stosowa\u0107 tylko do cel\u00f3w deweloperskich, mo\u017cna to robi\u0107 tylko w \u015brodowiskach stagingowych.<\/p>\n<h2>Jak zaktualizowa\u0107 wersj\u0119 aplikacji za pomoc\u0105 Helma?<\/h2>\n<p>\nB\u0119dziemy zmienia\u0107 warto\u015bci przekazywane do Helma. Zazwyczaj s\u0105 to warto\u015bci u\u017cywane w miejsce tagu obrazu. W przypadku latest, cz\u0119sto u\u017cywanego w \u015brodowiskach nieprodukcyjnych, zmienn\u0105 informacj\u0105 jest adnotacja, kt\u00f3ra dla samego Kubernetesa jest bezu\u017cyteczna, a dla Helma s\u0142u\u017cy jako sygna\u0142 do konieczno\u015bci aktualizacji aplikacji. Opcje wype\u0142nienia warto\u015bci adnotacji:<\/p>\n<ol>\n<li><strong>Losowa warto\u015b\u0107<\/strong> z u\u017cyciem standardowej funkcji \u2014 <code>{{ randAlphaNum 6 }}<\/code>. <br \/>\nJest pewna kwestia: po ka\u017cdym wdro\u017ceniu z u\u017cyciem wykresu z tak\u0105 zmienn\u0105 warto\u015b\u0107 adnotacji b\u0119dzie unikalna, a Helm b\u0119dzie uwa\u017ca\u0142, \u017ce zasz\u0142y zmiany. Oznacza to, \u017ce zawsze b\u0119dziemy ponownie uruchamia\u0107 aplikacj\u0119, nawet je\u015bli nie zmienili\u015bmy jej wersji. To nie jest krytyczne, poniewa\u017c nie b\u0119dzie przestoju, ale wci\u0105\u017c jest to nieprzyjemne.<\/li>\n<li>Wstawia\u0107 aktualn\u0105 <strong>dat\u0119 i czas<\/strong> \u2014 <code>{{ .Release.Date }}<\/code>. <br \/>\nOpcja ta przypomina losow\u0105 warto\u015b\u0107 z ci\u0105gle unikaln\u0105 zmienn\u0105.<\/li>\n<li>Bardziej w\u0142a\u015bciwy spos\u00f3b \u2014 u\u017cy\u0107 <strong>sumy kontrolne<\/strong>. To jest SHA obrazu lub SHA ostatniego commita w Gicie \u2014 <code>{{ .Values.sha }}<\/code>. <br \/>\nTrzeba b\u0119dzie je obliczy\u0107 i wys\u0142a\u0107 do klienta Helm po stronie wywo\u0142uj\u0105cej, na przyk\u0142ad w Jenkinsie. Je\u015bli aplikacja si\u0119 zmieni, to r\u00f3wnie\u017c suma kontrolna si\u0119 zmieni. W zwi\u0105zku z tym, Helm zaktualizuje aplikacj\u0119 tylko wtedy, gdy zajdzie taka potrzeba.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Podsumujmy nasze pr\u00f3by<\/h2>\n<p><\/p>\n<ul>\n<li>Helm wprowadza zmiany w spos\u00f3b najmniej inwazyjny, wi\u0119c jakakolwiek zmiana na poziomie obrazu aplikacji w Rejestrze Dockera nie spowoduje aktualizacji: po wykonaniu polecenia nic si\u0119 nie stanie.<\/li>\n<li>Klucz <code>--force<\/code> jest u\u017cywany do przywracania problematycznych wyda\u0144 i nie jest zwi\u0105zany z wymuszonymi aktualizacjami.<\/li>\n<li>Klucz <code>--recreate-pods<\/code> wymusi aktualizacj\u0119 aplikacji, ale zrobi to w brutalny spos\u00f3b: nagle wy\u0142\u0105czy wszystkie kontenery. Na tym ucierpi\u0105 u\u017cytkownicy, w produkcji nie powinno si\u0119 tak robi\u0107.<\/li>\n<li>Nie wprowadzaj zmian w klastrze Kubernetes za pomoc\u0105 polecenia <code>kubectl edit<\/code> nie nale\u017cy: naruszymy sp\u00f3jno\u015b\u0107, a zachowanie b\u0119dzie si\u0119 r\u00f3\u017cni\u0107 w zale\u017cno\u015bci od wersji Helma.<\/li>\n<li>Z wydaniem nowej wersji Helma pojawi\u0142o si\u0119 wiele niuans\u00f3w. Problemy w repozytorium Helma s\u0105 opisane zrozumia\u0142ym j\u0119zykiem, pomog\u0105 zrozumie\u0107 szczeg\u00f3\u0142y.<\/li>\n<li>Dodanie zmiennej adnotacji do chartu uczyni go bardziej elastycznym. Umo\u017cliwi to prawid\u0142owe wdra\u017canie aplikacji, bez przestoj\u00f3w.<\/li>\n<\/ul>\n<p>\nM\u0105dro\u015b\u0107 z kategorii \u201epok\u00f3j na ca\u0142ym \u015bwiecie\u201d, dzia\u0142aj\u0105ca we wszystkich dziedzinach \u017cycia: czytaj instrukcj\u0119 przed u\u017cyciem, a nie po. Tylko posiadaj\u0105c pe\u0142ne informacje, mo\u017cna budowa\u0107 niezawodne systemy i uszcz\u0119\u015bliwia\u0107 u\u017cytkownik\u00f3w.<\/p>\n<p><strong>Inne linki na ten temat:<\/strong><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/453734\/\">Wprowadzenie do <i>Helm<\/i> 3<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/\">Oficjalna strona Helma<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\">Repozytorium Helma na GitHubie<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/425343\/\">25 przydatnych narz\u0119dzi Kubernetes: wdro\u017cenie i zarz\u0105dzanie<\/a><\/noindex><\/li>\n<\/ol>\n<p>\nTa prezentacja pierwszy raz zosta\u0142a zaprezentowana na <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/at-kubernetes-conference\/\">@Kubernetes Conference<\/a><\/noindex> by Mail.ru Cloud Solutions. Zobacz <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/playlist?list=PLQzTaxmOHjnv0tP_HDxsIvcuac2kkIJTQ\">wideo<\/a><\/noindex> inne prezentacje i subskrybuj zapowiedzi wydarze\u0144 w Telegramie <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/k8s_mail\">Wok\u00f3\u0142 Kubernetes w Mail.ru Group<\/a><\/noindex>.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/488192\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Typhon freight hauler concept, Anton Swanepoel \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0421\u0443\u0433\u0440\u043e\u0431\u043e\u0432, \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u00ab\u041b\u0435\u0440\u0443\u0430 \u041c\u0435\u0440\u043b\u0435\u043d\u00bb. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d Helm, \u043a\u0430\u043a \u043e\u043d \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 Kubernetes, \u0447\u0442\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u043a\u0430\u043a \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0431\u0435\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u044f. \u042d\u0442\u043e \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 @Kubernetes Conference by Mail.ru Cloud [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":70955,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-70954","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Urz\u0105dzenie Helm i jego pu\u0142apki | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/70954","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=70954"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/70954\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/70955"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=70954"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=70954"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=70954"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}