{"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\/cs\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni","title":{"rendered":"Za\u0159\u00edzen\u00ed Helm a jeho \u00faskal\u00ed","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Za\u0159\u00edzen\u00ed Helm a jeho \u00faskal\u00ed\" 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 n\u00e1kladn\u00edho stroje Typhon, Anton Swanepoel<\/a><\/noindex><\/p>\n<p>Jmenuji se Dmitrij Sugrobov, jsem v\u00fdvoj\u00e1\u0159 ve spole\u010dnosti \"Leroy Merlin\". V tomto \u010dl\u00e1nku v\u00e1m pov\u00edm, pro\u010d je Helm pot\u0159ebn\u00fd, jak usnad\u0148uje pr\u00e1ci s Kubernetes, co se zm\u011bnilo ve t\u0159et\u00ed verzi a jak pomoc\u00ed n\u011bj aktualizovat aplikace v produkci bez v\u00fdpadk\u016f.<\/p>\n<p>Toto je shrnut\u00ed na z\u00e1klad\u011b vystoupen\u00ed na konferenci <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 pokud nechcete \u010d\u00edst, pod\u00edvejte se na 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=\"P\u0159ehr\u00e1t 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>Pro\u010d pou\u017e\u00edv\u00e1me Kubernetes v produkci<\/h2>\n<p>\n\"Leroy Merlin\" je l\u00eddrem na trhu DIY retailu v Rusku a Evrop\u011b. V na\u0161\u00ed spole\u010dnosti je v\u00edce ne\u017e sto v\u00fdvoj\u00e1\u0159\u016f, 33 000 intern\u00edch zam\u011bstnanc\u016f a obrovsk\u00e9 mno\u017estv\u00ed lid\u00ed nav\u0161t\u011bvuj\u00edc\u00edch hypermarkety a webov\u00e9 str\u00e1nky. Abychom je v\u0161echny u\u010dinili \u0161\u0165astn\u00fdmi, rozhodli jsme se dr\u017eet standardn\u00edch p\u0159\u00edstup\u016f v pr\u016fmyslu. Nov\u00e9 aplikace vyv\u00edj\u00edme pomoc\u00ed mikroservisn\u00ed architektury; pro izolaci prost\u0159ed\u00ed a spr\u00e1vnou dod\u00e1vku pou\u017e\u00edv\u00e1me kontejnery; a pro orchestraci pou\u017e\u00edv\u00e1me Kubernetes. Cena pou\u017e\u00edv\u00e1n\u00ed orchestr\u00e1tor\u016f rychle kles\u00e1: na trhu roste po\u010det in\u017een\u00fdr\u016f se znalost\u00ed t\u00e9to technologie, objevuj\u00ed se poskytovatel\u00e9 nab\u00edzej\u00edc\u00ed Kubernetes jako slu\u017ebu.<\/p>\n<p>V\u0161echno, co Kubernetes d\u011bl\u00e1, lze samoz\u0159ejm\u011b ud\u011blat i jin\u00fdmi zp\u016fsoby, nap\u0159\u00edklad pomoc\u00ed skript\u016f v Jenkins a docker-compose, ale pro\u010d si zt\u011b\u017eovat \u017eivot, kdy\u017e existuje hotov\u00e9 a spolehliv\u00e9 \u0159e\u0161en\u00ed? Proto jsme p\u0159e\u0161li k Kubernetes a u\u017e rok ho pou\u017e\u00edv\u00e1me v produkci. Nyn\u00ed m\u00e1me dvacet \u010dty\u0159i klastr\u016f Kubernetes, nejstar\u0161\u00edmu z nich je v\u00edce ne\u017e rok, obsahuje kolem dvou set pod\u016f.<\/p>\n<h2>Proklet\u00ed velk\u00e9ho po\u010dtu YAML soubor\u016f v Kubernetes<\/h2>\n<p>\nPro spu\u0161t\u011bn\u00ed mikroservisu v Kubernetes vytvo\u0159\u00edme alespo\u0148 p\u011bt YAML soubor\u016f: pro Deployment, Service, Ingress, ConfigMap, Secrets \u2014 a ode\u0161leme je do klastru. Pro dal\u0161\u00ed aplikaci nap\u00ed\u0161eme stejn\u00fd bal\u00ed\u010dek YAML, pro t\u0159et\u00ed \u2014 dal\u0161\u00ed a tak d\u00e1le. Vyn\u00e1sob\u00edme po\u010det dokument\u016f po\u010dtem prost\u0159ed\u00ed a ji\u017e z\u00edsk\u00e1me stovky soubor\u016f, a to je\u0161t\u011b nezohled\u0148ujeme dynamick\u00e1 prost\u0159ed\u00ed.<\/p>\n<p><img decoding=\"async\" alt=\"Za\u0159\u00edzen\u00ed Helm a jeho \u00faskal\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/c46c3f5ae49cbefa4851cbb388bfd051.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAdam Reese, kl\u00ed\u010dov\u00fd udr\u017eovatel Helm, zavedl pojem \u201e<noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/cZ1S2Gp47ng?t=323\">Cyklus v\u00fdvoje v Kubernetes<\/a><\/noindex>\u201c, kter\u00fd vypad\u00e1 takto:<\/p>\n<ol>\n<li>Kop\u00edrovat YAML \u2014 zkop\u00edrujte YAML soubor.<\/li>\n<li>Vlo\u017eit YAML \u2014 vlo\u017ete ho.<\/li>\n<li>Opravit odsazen\u00ed \u2014 opravte odsazen\u00ed.<\/li>\n<li>Opakujte \u2014 opakujte znovu.<\/li>\n<\/ol>\n<p>\nVarianta funguje, ale mus\u00edte \u010dasto kop\u00edrovat YAML soubory. Abychom tento cyklus zm\u011bnili, byl vynalezen Helm.<\/p>\n<h3>Co je Helm<\/h3>\n<p>\nZa prv\u00e9, Helm \u2014<strong> bal\u00ed\u010dkov\u00fd mana\u017eer<\/strong>, kter\u00fd pom\u00e1h\u00e1 vyhled\u00e1vat a instalovat pot\u0159ebn\u00e9 programy. Pro instalaci nap\u0159\u00edklad MongoDB nen\u00ed pot\u0159eba nav\u0161t\u011bvovat ofici\u00e1ln\u00ed str\u00e1nku a stahovat bin\u00e1rn\u00ed soubory, sta\u010d\u00ed prov\u00e9st p\u0159\u00edkaz <code>helm install stable\/mongodb<\/code>.<\/p>\n<p>Za prv\u00e9, Helm \u2014 <strong>\u0161ablonovac\u00ed n\u00e1stroj<\/strong>, kter\u00fd pom\u00e1h\u00e1 parametrizovat soubory. Vr\u00e1t\u00edme se k situaci s YAML soubory v Kubernetes. Je snaz\u0161\u00ed napsat ten sam\u00fd YAML soubor, p\u0159idat do n\u011bj n\u011bkter\u00e9 placeholdery, do kter\u00fdch Helm dosad\u00ed hodnoty. Tak\u017ee m\u00edsto velk\u00e9ho mno\u017estv\u00ed YAML soubor\u016f budeme m\u00edt sadu \u0161ablon, do kter\u00fdch se v pot\u0159ebn\u00fd moment dosad\u00ed pot\u0159ebn\u00e9 hodnoty.<\/p>\n<p>Za druh\u00e9, Helm \u2014 <strong>mistr nasazov\u00e1n\u00ed<\/strong>. Pomoc\u00ed n\u011bj lze instalovat, vracet a aktualizovat aplikace. Poj\u010fme se pod\u00edvat, jak to ud\u011blat.<\/p>\n<p><img decoding=\"async\" alt=\"Za\u0159\u00edzen\u00ed Helm a jeho \u00faskal\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/8b517dbcf503ced229569fe3726418c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Jak pou\u017e\u00edvat Helm pro nasazen\u00ed vlastn\u00edch aplikac\u00ed<\/h3>\n<p>\nNainstalujeme klienta Helm na po\u010d\u00edta\u010d podle ofici\u00e1ln\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/install\/\">instrukci<\/a><\/noindex>. Pak vytvo\u0159\u00edme sadu YAML soubor\u016f. M\u00edsto zad\u00e1n\u00ed konkr\u00e9tn\u00edch hodnot nech\u00e1me placeholdery, kter\u00e9 Helm v budoucnu vypln\u00ed informacemi. Sada t\u011bchto soubor\u016f se naz\u00fdv\u00e1 Helm chart. Do konzolov\u00e9ho klienta Helm ji lze poslat t\u0159emi zp\u016fsoby:<\/p>\n<ul>\n<li>uv\u00e9st slo\u017eku se \u0161ablonami;<\/li>\n<li>zabalit do .tar archivu a uv\u00e9st na n\u011bj;<\/li>\n<li>um\u00edstit \u0161ablonu do vzd\u00e1len\u00e9ho repozit\u00e1\u0159e a p\u0159idat odkaz na repozit\u00e1\u0159 do klienta Helm.<\/li>\n<\/ul>\n<p>\nJe\u0161t\u011b je pot\u0159eba soubor se hodnotami \u2014 values.yaml. Data z n\u011bj budou dosazena do \u0161ablony. Vytvo\u0159\u00edme i ten.<\/p>\n<p><img decoding=\"async\" alt=\"Za\u0159\u00edzen\u00ed Helm a jeho \u00faskal\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/c0fe24cc8186640147f95ce201794d96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVe druh\u00e9 verzi Helmu existuje dal\u0161\u00ed serverov\u00e1 aplikace \u2014 Tiller. Ta vis\u00ed mimo Kubernetes a \u010dek\u00e1 na po\u017eadavky od klienta Helm, a kdy\u017e je vyvol\u00e1na, dosad\u00ed pot\u0159ebn\u00e9 hodnoty do \u0161ablony a ode\u0161le je do Kubernetes.<\/p>\n<p><img decoding=\"async\" alt=\"Za\u0159\u00edzen\u00ed Helm a jeho \u00faskal\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/6b821a0bb4680829d5ce9982d2bb4c55.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHelm 3 je jednodu\u0161\u0161\u00ed: m\u00edsto zpracov\u00e1n\u00ed \u0161ablon na serveru, se informace nyn\u00ed zpracov\u00e1vaj\u00ed celkov\u011b na stran\u011b klienta Helm a odes\u00edlaj\u00ed se p\u0159\u00edmo do Kubernetes API. Toto zjednodu\u0161en\u00ed zvy\u0161uje bezpe\u010dnost clusteru a usnad\u0148uje sch\u00e9ma nasazov\u00e1n\u00ed.<\/p>\n<p><strong>Jak to v\u0161echno funguje<\/strong><\/p>\n<p>Spust\u00edme p\u0159\u00edkaz <code>helm install<\/code>. Uvedeme n\u00e1zev releasu aplikace, d\u00e1me cestu k values.yaml. Na konci uvedeme repozit\u00e1\u0159, ve kter\u00e9m le\u017e\u00ed chart a n\u00e1zev chartu. V p\u0159\u00edkladu to je \u201elmru\u201c a \u201ebestchart\u201c, respektive.<\/p>\n<pre><code class=\"plaintext\">helm install --name bestapp --values values.yaml lmru\/bestchart\n<\/code><\/pre>\n<p>\nProv\u00e1d\u011bn\u00ed p\u0159\u00edkazu je mo\u017en\u00e9 pouze jednou, p\u0159i op\u011btovn\u00e9m proveden\u00ed m\u00edsto <code>install<\/code> je pot\u0159eba pou\u017e\u00edt <code>upgrade<\/code>. Pro zjednodu\u0161en\u00ed m\u00edsto dvou p\u0159\u00edkaz\u016f je mo\u017en\u00e9 prov\u00e9st p\u0159\u00edkaz <code>upgrade<\/code> s dal\u0161\u00edm kl\u00ed\u010dem <code>--install<\/code>. P\u0159i prvn\u00edm spu\u0161t\u011bn\u00ed Helm ode\u0161le p\u0159\u00edkaz k instalaci relace a pot\u00e9 ji bude aktualizovat.<\/p>\n<pre><code class=\"plaintext\">helm upgrade --install bestapp --values values.yaml lmru\/bestchart\n<\/code><\/pre>\n<p><\/p>\n<h2>\u00daskal\u00ed nasazov\u00e1n\u00ed nov\u00fdch verz\u00ed aplikace pomoc\u00ed Helmu<\/h2>\n<p>\n<i>V t\u00e9to \u010d\u00e1sti p\u0159\u00edb\u011bhu si hraji se s\u00e1lem v \u201eKdo chce b\u00fdt milion\u00e1\u0159em\u201c, a zji\u0161\u0165ujeme, jak donutit Helm aktualizovat verzi aplikace. <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/w1PhTe9gnOI?list=PLQzTaxmOHjnv0tP_HDxsIvcuac2kkIJTQ&amp;t=778\"><i>Sledovat video<\/i><\/a><\/noindex>.<\/p>\n<p>Kdy\u017e jsem zkoumal fungov\u00e1n\u00ed Helmu, p\u0159ekvapilo m\u011b podivn\u00e9 chov\u00e1n\u00ed p\u0159i pokusu o aktualizaci verz\u00ed spu\u0161t\u011bn\u00fdch aplikac\u00ed. K\u00f3d aplikace jsem aktualizoval, v docker registry nahr\u00e1l nov\u00fd obraz, odeslal p\u0159\u00edkaz k nasazen\u00ed \u2013 a nic se nestalo. N\u00ed\u017ee uv\u00e1d\u00edm n\u011bkolik m\u00e9n\u011b \u00fasp\u011b\u0161n\u00fdch zp\u016fsob\u016f, jak aktualizovat aplikace. P\u0159i podrobn\u011bj\u0161\u00edm zkoum\u00e1n\u00ed ka\u017ed\u00e9ho z nich za\u010dnete ch\u00e1pat vnit\u0159n\u00ed fungov\u00e1n\u00ed n\u00e1stroje a d\u016fvody tak ne zcela z\u0159ejm\u00e9ho chov\u00e1n\u00ed.<\/p>\n<p><strong>Zp\u016fsob 1. Nem\u011bnit informace od posledn\u00edho spu\u0161t\u011bn\u00ed<\/strong><\/p>\n<p>Jak prav\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/using_helm\/#helm-upgrade-and-helm-rollback-upgrading-a-release-and-recovering-on-failure\">ofici\u00e1ln\u00ed web<\/a><\/noindex> Helm, \u201eKubernetes chart m\u016f\u017ee b\u00fdt velk\u00fd a slo\u017eit\u00fd, a proto se Helm sna\u017e\u00ed co nejm\u00e9n\u011b zasahovat\u201c. Proto, pokud aktualizujete latest-verzi obrazu aplikace v docker registry a provedete p\u0159\u00edkaz <code>helm upgrade<\/code>, nic se nestane. Helm bude myslet, \u017ee se nic nezm\u011bnilo, a \u017ee nen\u00ed pot\u0159eba pos\u00edlat do Kubernetes p\u0159\u00edkaz k aktualizaci aplikace.<\/p>\n<blockquote><p>Zde a d\u00e1le je tag latest uveden pouze jako p\u0159\u00edklad. P\u0159i pou\u017eit\u00ed tohoto tagu Kubernetes bude poka\u017ed\u00e9 stahovat obraz z docker registry, bez ohledu na parametr imagePullPolicy. Pou\u017eit\u00ed latest v produkci je ne\u017e\u00e1douc\u00ed a m\u016f\u017ee zp\u016fsobit vedlej\u0161\u00ed efekty.<\/p><\/blockquote>\n<p>\n<strong>Zp\u016fsob 2. Aktualizovat LABEL v obraze<\/strong><\/p>\n<p>Jak je uvedeno ve stejn\u00e9m <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/using_helm\/#helm-upgrade-and-helm-rollback-upgrading-a-release-and-recovering-on-failure\">dokumentaci<\/a><\/noindex>, \u201eHelm bude aktualizovat aplikaci pouze tehdy, pokud se zm\u011bnila od posledn\u00edho vyd\u00e1n\u00ed\u201c. Logick\u00fdm krokem pro to by se zd\u00e1lo b\u00fdt aktualizace labelu LABEL v samotn\u00e9m docker obrazu. Nicm\u00e9n\u011b Helm nenahl\u00ed\u017e\u00ed do obraz\u016f aplikac\u00ed a nem\u00e1 pon\u011bt\u00ed o jak\u00fdchkoliv zm\u011bn\u00e1ch v nich. Tud\u00ed\u017e p\u0159i aktualizaci label\u016f v obraze se o nich Helm nedozv\u00ed a p\u0159\u00edkaz k aktualizaci aplikace v Kubernetes nebude odesl\u00e1n.<\/p>\n<p><strong>Zp\u016fsob 3. Pou\u017e\u00edt kl\u00ed\u010d <code>--force<\/code><\/strong><\/p>\n<p><img decoding=\"async\" alt=\"Za\u0159\u00edzen\u00ed Helm a jeho \u00faskal\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/4888cddfb7698b7044ab31b6f6070063.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nObra\u0165me se na p\u0159\u00edru\u010dky a hledejme pot\u0159ebn\u00fd kl\u00ed\u010d. Nejv\u00edce smyslupln\u00fd kl\u00ed\u010d se zd\u00e1 b\u00fdt <code>--force<\/code>. I kdy\u017e n\u00e1zev nazna\u010duje opak, chov\u00e1n\u00ed se li\u0161\u00ed od o\u010dek\u00e1van\u00e9ho. Nam\u00edsto vynucen\u00e9ho aktualizov\u00e1n\u00ed aplikace je jeho skute\u010dn\u00fdm c\u00edlem obnoven\u00ed vyd\u00e1n\u00ed, kter\u00e9 je ve stavu FAILED. Pokud se tento kl\u00ed\u010d nepou\u017eije, je pot\u0159eba postupn\u011b vykonat p\u0159\u00edkazy. <code>helm delete &amp;&amp; helm install --replace<\/code>. M\u00edsto toho je navr\u017eeno pou\u017e\u00edt kl\u00ed\u010d <code>--force<\/code>, kter\u00fd automatizuje postupn\u00e9 vykon\u00e1v\u00e1n\u00ed t\u011bchto p\u0159\u00edkaz\u016f. V\u00edce informac\u00ed v tomto <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\/pull\/3597\">pull requestu.<\/a><\/noindex>. Abychom p\u0159inutili Helm p\u0159esto aktualizovat verzi aplikace, bohu\u017eel tento kl\u00ed\u010d nevyhovuje.<\/p>\n<p><strong>Zp\u016fsob 4. M\u011bnit labely p\u0159\u00edmo v Kubernetes.<\/strong><\/p>\n<p><img decoding=\"async\" alt=\"Za\u0159\u00edzen\u00ed Helm a jeho \u00faskal\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/0a35e7aaa7479685f07dd5b935c95eb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAktualizace labelu p\u0159\u00edmo v clusteru pomoc\u00ed p\u0159\u00edkazu <code>kubectl edit<\/code> \u2014 \u0161patn\u00fd n\u00e1pad. Tento krok povede k nekonzistenci informac\u00ed mezi b\u011b\u017e\u00edc\u00ed aplikac\u00ed a t\u00edm, co bylo p\u016fvodn\u011b poslano k nasazen\u00ed. Chov\u00e1n\u00ed Helmu p\u0159i nasazov\u00e1n\u00ed se v tomto p\u0159\u00edpad\u011b li\u0161\u00ed podle verze: Helm 2 nic ned\u011bl\u00e1, zat\u00edmco Helm 3 nasad\u00ed novou verzi aplikace. Abychom pochopili d\u016fvod, mus\u00edme rozum\u011bt, jak Helm funguje.<\/p>\n<h3>Jak funguje Helm.<\/h3>\n<p>\nAby zjistil, zda se aplikace od posledn\u00edho vyd\u00e1n\u00ed zm\u011bnila, m\u016f\u017ee Helm vyu\u017e\u00edt:<\/p>\n<ul>\n<li>b\u011b\u017e\u00edc\u00ed aplikaci v Kubernetes;<\/li>\n<li>nov\u00fd values.yaml a aktu\u00e1ln\u00ed chart;<\/li>\n<li>vnit\u0159n\u00ed informace Helmu o vyd\u00e1n\u00edch.<\/li>\n<\/ul>\n<p><b class=\"spoiler_title\">Pro nejzv\u011bdav\u011bj\u0161\u00ed: kde Helm uchov\u00e1v\u00e1 vnit\u0159n\u00ed informace o vyd\u00e1n\u00edch?<\/b>Proveden\u00edm p\u0159\u00edkazu <code>helm history<\/code>, z\u00edsk\u00e1me v\u0161echny informace o verz\u00edch nainstalovan\u00fdch pomoc\u00ed Helmu.<\/p>\n<p><img decoding=\"async\" alt=\"Za\u0159\u00edzen\u00ed Helm a jeho \u00faskal\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/0bf3afeb9c4947220474af648a1fa1ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJe k dispozici tak\u00e9 podrobn\u00e1 informace o zaslan\u00fdch \u0161ablon\u00e1ch a hodnot\u00e1ch. M\u016f\u017eeme o n\u011b po\u017e\u00e1dat:<\/p>\n<p><img decoding=\"async\" alt=\"Za\u0159\u00edzen\u00ed Helm a jeho \u00faskal\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/858560c0f4adf7375060cec339df7574.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVe druh\u00e9 verzi Helmu tyto informace le\u017eely ve stejn\u00e9m namespace, kde byl spu\u0161t\u011bn Tiller (v\u00fdchoz\u00ed \u2014 kube-system), v ConfigMap ozna\u010den\u00e9 \u0161t\u00edtkem \u201eOWNER=TILLER\u201c:<\/p>\n<p><img decoding=\"async\" alt=\"Za\u0159\u00edzen\u00ed Helm a jeho \u00faskal\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/ba665a079ccddeb4ca7049822c42a498.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nS p\u0159\u00edchodem t\u0159et\u00ed verze Helmu se informace p\u0159esunuly do tajemstv\u00ed, p\u0159i\u010dem\u017e ve stejn\u00e9m namespace, kde byla aplikace spu\u0161t\u011bna. D\u00edky tomu lze spou\u0161t\u011bt sou\u010dasn\u011b n\u011bkolik aplikac\u00ed v r\u016fzn\u00fdch namespacech se stejn\u00fdm n\u00e1zvem vyd\u00e1n\u00ed. Ve druh\u00e9 verzi to byla velk\u00e1 bolest hlavy, kdy\u017e byly namespace izolovan\u00e9, ale mohly na sebe m\u00edt vliv.<\/p>\n<p><img decoding=\"async\" alt=\"Za\u0159\u00edzen\u00ed Helm a jeho \u00faskal\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/b9b82b7c86320a0e3642e4265a1f0241.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nDruh\u00fd Helm, kdy\u017e se sna\u017e\u00ed pochopit, zda je t\u0159eba aktualizace, pou\u017e\u00edv\u00e1 pouze dva zdroje informac\u00ed: to, co mu bylo nyn\u00ed poskytnuto, a vnit\u0159n\u00ed informace o vyd\u00e1n\u00edch, kter\u00e9 le\u017e\u00ed v ConfigMap.<\/p>\n<p><img decoding=\"async\" alt=\"Za\u0159\u00edzen\u00ed Helm a jeho \u00faskal\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/0550ba5f6ce7be1e7f666dfc65e639ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nT\u0159et\u00ed Helm pou\u017e\u00edv\u00e1 strategii three-way merge: krom\u011b d\u0159\u00edve z\u00edskan\u00fdch informac\u00ed zohled\u0148uje tak\u00e9 aplikaci, kter\u00e1 moment\u00e1ln\u011b b\u011b\u017e\u00ed v Kubernetes.<\/p>\n<p><img decoding=\"async\" alt=\"Za\u0159\u00edzen\u00ed Helm a jeho \u00faskal\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/252085adb83e097e01b4a0655706ede5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nZ tohoto d\u016fvodu star\u00e1 verze Helmu nic ned\u011bl\u00e1, proto\u017ee nebere v \u00favahu informace o aplikaci v klastru, zat\u00edmco Helm 3 zm\u011bny zpracov\u00e1v\u00e1 a nasazuje novou aplikaci.<\/p>\n<p><strong>Zp\u016fsob 5. Pou\u017e\u00edt kl\u00ed\u010d &#8212;recreate-pods<\/strong><\/p>\n<p>Pomoc\u00ed kl\u00ed\u010de <code>--recreate-pods<\/code> je mo\u017en\u00e9 dos\u00e1hnout v\u00fdsledku, kter\u00fd se d\u0159\u00edve pl\u00e1novalo z\u00edskat pomoc\u00ed kl\u00ed\u010de <code>--force<\/code>. Kontejnery se restartuj\u00ed a podle politiky imagePullPolicy: Always pro tag latest (o tom v pozn\u00e1mce v\u00fd\u0161e) Kubernetes st\u00e1hne a spust\u00ed novou verzi obrazu. Neprob\u011bhne to v\u0161ak nejlep\u0161\u00edm zp\u016fsobem: ani\u017e by bral v \u00favahu StrategyType nasazen\u00ed, n\u00e1hle vypne v\u0161echny star\u00e9 instance aplikace a za\u010dne spou\u0161t\u011bt nov\u00e9. B\u011bhem restartu nebude syst\u00e9m fungovat, u\u017eivatel\u00e9 budou trp\u011bt.<\/p>\n<p>V samotn\u00e9m Kubernetes podobn\u00fd probl\u00e9m tak\u00e9 existoval po dlouhou dobu. A te\u010f, po 4 letech od jeho objeven\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/kubernetes\/issues\/13488\">Issue<\/a><\/noindex>, byla chyba opravena a od verze 1.15 Kubernetes se objevuje mo\u017enost rolling-restart pod\u016f.<\/p>\n<p>Helm prost\u011b vyp\u00edn\u00e1 v\u0161echny aplikace a spou\u0161t\u00ed vedle nov\u00fdch kontejner\u016f. V produk\u010dn\u00edm prost\u0159ed\u00ed to nen\u00ed mo\u017en\u00e9, aby nedo\u0161lo k v\u00fdpadku aplikace. To by m\u011blo b\u00fdt pou\u017e\u00edv\u00e1no pouze pro v\u00fdvojov\u00e9 pot\u0159eby, lze to prov\u00e1d\u011bt pouze v stagingov\u00fdch prost\u0159ed\u00edch.<\/p>\n<h2>Jak aktualizovat verzi aplikace pomoc\u00ed Helmu?<\/h2>\n<p>\nBudeme m\u011bnit hodnoty, zas\u00edlan\u00e9 do Helmu. Obecn\u011b to jsou hodnoty, kter\u00e9 nahrazuj\u00ed tag obrazu. V p\u0159\u00edpad\u011b latest, \u010dasto pou\u017e\u00edvan\u00e9ho pro neproduktivn\u00ed prost\u0159ed\u00ed, se jako m\u011bniteln\u00e1 informace pou\u017e\u00edv\u00e1 anotace, kter\u00e1 je pro samotn\u00e9 Kubernetes bezcenn\u00e1, ale pro Helm bude sign\u00e1lem k nutnosti aktualizace aplikace. Mo\u017enosti vypln\u011bn\u00ed hodnoty anotace:<\/p>\n<ol>\n<li><strong>N\u00e1hodn\u00e1 hodnota<\/strong> pomoc\u00ed standardn\u00ed funkce \u2014 <code>{{ randAlphaNum 6 }}<\/code>. <br \/>\nJe tu jedna nuenda: po ka\u017ed\u00e9m nasazen\u00ed s pou\u017eit\u00edm chartu s takovou prom\u011bnnou bude hodnota anotace unik\u00e1tn\u00ed a Helm bude p\u0159edpokl\u00e1dat, \u017ee do\u0161lo ke zm\u011bn\u00e1m. To znamen\u00e1, \u017ee v\u017edy budeme restartovat aplikaci, i kdy\u017e jsme jej\u00ed verzi nezm\u011bnili. Nen\u00ed to kritick\u00e9, proto\u017ee nedoch\u00e1z\u00ed k v\u00fdpadk\u016fm, ale p\u0159ece jen je to nep\u0159\u00edjemn\u00e9.<\/li>\n<li>Vlo\u017eit aktu\u00e1ln\u00ed <strong>datum a \u010das<\/strong> \u2014 <code>{{ .Release.Date }}<\/code>. <br \/>\nTento zp\u016fsob se podob\u00e1 n\u00e1hodn\u00e9 hodnot\u011b s neust\u00e1le unik\u00e1tn\u00ed prom\u011bnnou.<\/li>\n<li>Spr\u00e1vn\u011bj\u0161\u00ed zp\u016fsob \u2014 pou\u017e\u00edt <strong>kontroln\u00ed sou\u010dty<\/strong>. Toto je SHA obrazu nebo SHA posledn\u00edho commitu v Gitu \u2014 <code>{{ .Values.sha }}<\/code>. <br \/>\nMus\u00ed se spo\u010d\u00edtat a odeslat do klienta Helm na volaj\u00edc\u00ed stran\u011b, nap\u0159\u00edklad v Jenkinsu. Pokud se aplikace zm\u011bn\u00ed, zm\u011bn\u00ed se i kontroln\u00ed sou\u010det. Helm proto aktualizuje aplikaci pouze tehdy, kdy\u017e je to nutn\u00e9.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Shr\u0148me na\u0161e pokusy<\/h2>\n<p><\/p>\n<ul>\n<li>Helm prov\u00e1d\u00ed zm\u011bny nejm\u00e9n\u011b invazivn\u00edm zp\u016fsobem, proto jak\u00e1koli zm\u011bna na \u00farovni obrazu aplikace v Docker Registry nepovede k aktualizaci: po vykon\u00e1n\u00ed p\u0159\u00edkazu se nic nestane.<\/li>\n<li>Kl\u00ed\u010d <code>--force<\/code> pou\u017e\u00edv\u00e1 se k obnoven\u00ed problematick\u00fdch vyd\u00e1n\u00ed a nesouvis\u00ed s nucenou aktualizac\u00ed.<\/li>\n<li>Kl\u00ed\u010d <code>--recreate-pods<\/code> nucen\u011b aktualizuje aplikace, ale ud\u011bl\u00e1 to drsn\u00fdm zp\u016fsobem: n\u00e1hle vypne v\u0161echny kontejnery. U\u017eivatel\u00e9 t\u00edm trp\u00ed, takto to na produkci d\u011blat nelze.<\/li>\n<li>P\u0159\u00edmo prov\u00e1d\u011bt zm\u011bny v klastru Kubernetes pomoc\u00ed p\u0159\u00edkazu <code>kubectl edit<\/code> nen\u00ed t\u0159eba: naru\u0161\u00edme konzistenci a chov\u00e1n\u00ed se bude li\u0161it v z\u00e1vislosti na verzi Helm.<\/li>\n<li>S vyd\u00e1n\u00edm nov\u00e9 verze Helm se objevilo mnoho nuanc\u00ed. Probl\u00e9my v repozit\u00e1\u0159i Helm jsou pops\u00e1ny srozumiteln\u00fdm jazykem a pomohou objasnit detaily.<\/li>\n<li>P\u0159id\u00e1n\u00ed zm\u011bniteln\u00e9 anotace do chartu ho u\u010din\u00ed flexibiln\u011bj\u0161\u00edm. To umo\u017en\u00ed zav\u00e1d\u011bt aplikaci spr\u00e1vn\u011b, bez prostoje.<\/li>\n<\/ul>\n<p>\nMy\u0161lenka z kategorie \"m\u00edru na cel\u00e9m sv\u011bt\u011b\", funguj\u00edc\u00ed ve v\u0161ech oblastech \u017eivota: \u010dt\u011bte n\u00e1vod p\u0159ed pou\u017eit\u00edm, nikoli po n\u011bm. Teprve s \u00fapln\u00fdmi informacemi m\u016f\u017eete stav\u011bt spolehliv\u00e9 syst\u00e9my a d\u011blat u\u017eivatele \u0161\u0165astn\u00e9.<\/p>\n<p><strong>Dal\u0161\u00ed odkazy na t\u00e9ma:<\/strong><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/453734\/\">Sezn\u00e1men\u00ed s <i>Helm<\/i> 3<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/\">Ofici\u00e1ln\u00ed str\u00e1nka Helm<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\">Repozit\u00e1\u0159 Helm na GitHubu<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/425343\/\">25 u\u017eite\u010dn\u00fdch n\u00e1stroj\u016f Kubernetes: nasazen\u00ed a spr\u00e1va<\/a><\/noindex><\/li>\n<\/ol>\n<p>\nTento refer\u00e1t byl poprv\u00e9 p\u0159edstaven 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. Pod\u00edvejte se <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/playlist?list=PLQzTaxmOHjnv0tP_HDxsIvcuac2kkIJTQ\">video<\/a><\/noindex> dal\u0161\u00ed vystoupen\u00ed a p\u0159ihlaste se k ozn\u00e1men\u00edm akc\u00ed na Telegramu <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/k8s_mail\">Kolem Kubernetes v Mail.ru Group<\/a><\/noindex>.<br \/>\n<br \/>Zdroj: <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\/cs\/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=\"cs_CZ\" \/>\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\/cs\/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\udd47Struktura Helm a jej\u00ed \u00faskal\u00ed | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/70954","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=70954"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/70954\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/70955"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=70954"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=70954"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=70954"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}