{"id":33654,"date":"2019-10-31T21:53:58","date_gmt":"2019-10-31T18:53:58","guid":{"rendered":"https:\/\/prohoster.info\/blog\/deploj-prilozhenij-v-vm-nomad-i-kubernetes\/"},"modified":"2019-10-31T21:53:58","modified_gmt":"2019-10-31T18:53:58","slug":"deploj-prilozhenij-v-vm-nomad-i-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/deploj-prilozhenij-v-vm-nomad-i-kubernetes","title":{"rendered":"Nasazen\u00ed aplikac\u00ed na VM, Nomad a Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ahoj v\u0161ichni! Jmenuji se Pavel Agaletsky. Pracuji jako t\u00fdmov\u00fd l\u00eddr v t\u00fdmu, kter\u00fd vyv\u00edj\u00ed doru\u010dovac\u00ed syst\u00e9m Lamoda. V roce 2018 jsem vystoupil na konferenci HighLoad++, a dnes v\u00e1m chci p\u0159edstavit p\u0159epis sv\u00e9ho vystoupen\u00ed.<\/p>\n<p>M\u00e9 t\u00e9ma se zab\u00fdv\u00e1 zku\u0161enost\u00ed na\u0161\u00ed spole\u010dnosti s nasazen\u00edm syst\u00e9m\u016f a slu\u017eeb do r\u016fzn\u00fdch prost\u0159ed\u00ed. Za\u010d\u00edn\u00e1me od na\u0161ich prav\u011bk\u00fdch \u010das\u016f, kdy jsme nasazovali v\u0161echny syst\u00e9my na b\u011b\u017en\u00e9 virtu\u00e1ln\u00ed servery, a kon\u010d\u00edme postupn\u00fdm p\u0159echodem od Nomadu k nasazen\u00ed do Kubernetes. \u0158eknu v\u00e1m, pro\u010d jsme to ud\u011blali a jak\u00e9 probl\u00e9my jsme v procesu m\u011bli.<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"oqrb7dWECSo\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/oqrb7dWECSo\/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><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1>Nasazen\u00ed aplikac\u00ed na VM<\/h1>\n<p>\nZa\u010dneme t\u00edm, \u017ee p\u0159ed 3 lety byly v\u0161echny syst\u00e9my a slu\u017eby spole\u010dnosti nasazov\u00e1ny na b\u011b\u017en\u00e9 virtu\u00e1ln\u00ed servery. Technicky bylo uspo\u0159\u00e1d\u00e1no tak, \u017ee cel\u00fd k\u00f3d na\u0161ich syst\u00e9m\u016f byl shroma\u017e\u010fov\u00e1n prost\u0159ednictv\u00edm automatick\u00e9 kompilace s pomoc\u00ed Jenkins. Pomoc\u00ed Ansible se pak roz\u0161i\u0159oval z na\u0161eho syst\u00e9mu spr\u00e1vy verz\u00ed na virtu\u00e1ln\u00ed servery. P\u0159i\u010dem\u017e ka\u017ed\u00fd syst\u00e9m, kter\u00fd byl v na\u0161\u00ed spole\u010dnosti, byl nasazen minim\u00e1ln\u011b na 2 servery: jedna z nich byla head a druh\u00e1 tail. Tyto dva syst\u00e9my byly mezi sebou absolutn\u011b identick\u00e9 ve v\u0161ech sv\u00fdch nastaven\u00edch, v\u00fdkonu, konfiguraci a dal\u0161\u00edm. Rozd\u00edl mezi nimi byl jen ten, \u017ee head dost\u00e1val u\u017eivatelsk\u00fd provoz, zat\u00edmco tail nikdy \u017e\u00e1dn\u00fd u\u017eivatelsk\u00fd provoz nedost\u00e1val. <\/p>\n<p>Pro\u010d bylo toto opat\u0159en\u00ed zavedeno? <\/p>\n<p>Kdy\u017e jsme nasazovali nov\u00e9 verze na\u0161\u00ed aplikace, cht\u011bli jsme zajistit mo\u017enost bezprobl\u00e9mov\u00e9ho v\u00fdstupu, tedy bez viditeln\u00fdch d\u016fsledk\u016f pro u\u017eivatele. Toho bylo dosa\u017eeno t\u00edm, \u017ee nov\u00e1 sestaven\u00e1 verze byla pomoc\u00ed Ansible nasazena na tail. Tam lid\u00e9, kte\u0159\u00ed se zab\u00fdvali nasazen\u00edm, mohli zkontrolovat a ujistit se, \u017ee v\u0161e funguje; v\u0161echny metriky, sekce a aplikace funguj\u00ed; spou\u0161t\u00ed se pot\u0159ebn\u00e9 skripty. A\u017e pot\u00e9, co se ujistili, \u017ee je v\u0161e v po\u0159\u00e1dku, do\u0161lo k p\u0159epnut\u00ed provozu. Ten za\u010dal sm\u011b\u0159ovat na server, kter\u00fd do t\u00e9 doby byl tail. A server, kter\u00fd byl a\u017e dosud head, z\u016fstal bez u\u017eivatelsk\u00e9ho provozu, p\u0159i\u010dem\u017e m\u011bl na sob\u011b p\u0159edchoz\u00ed verzi na\u0161\u00ed aplikace.<\/p>\n<p>T\u00edmto zp\u016fsobem pro u\u017eivatele bylo v\u0161e bezprobl\u00e9mov\u00e9. P\u0159epnut\u00ed je okam\u017eit\u00e9, proto\u017ee se jedn\u00e1 pouze o p\u0159epnut\u00ed zat\u00ed\u017een\u00ed. Velmi snadno se d\u00e1 vr\u00e1tit k p\u0159edchoz\u00ed verzi pouh\u00fdm p\u0159epnut\u00edm zp\u011bt. M\u011bli jsme tak\u00e9 mo\u017enost ov\u011b\u0159it schopnosti aplikace v produkci je\u0161t\u011b p\u0159ed t\u00edm, ne\u017e na ni za\u010dne proudit u\u017eivatelsk\u00fd provoz, co\u017e bylo velmi pohodln\u00e9. <\/p>\n<p>Jak\u00e9 v\u00fdhody jsme v tom v\u0161em vid\u011bli?<\/p>\n<ol>\n<li>V prvn\u00ed \u0159ad\u011b je to dost <b>jednoduch\u00e9.<\/b> Ka\u017ed\u00e9mu je jasn\u00e9, jak takov\u00fd zp\u016fsob nasazen\u00ed funguje, proto\u017ee v\u011bt\u0161ina lid\u00ed n\u011bkdy nasazovala na b\u011b\u017en\u00e9 virtu\u00e1ln\u00ed servery.<\/li>\n<li>Je to dost <b>spolehliv\u00e9<\/b>, proto\u017ee technologie nasazen\u00ed je jednoduch\u00e1, osv\u011bd\u010den\u00e1 tis\u00edci spole\u010dnost\u00ed. Miliony server\u016f jsou nasazov\u00e1ny pr\u00e1v\u011b t\u00edmto zp\u016fsobem. T\u011b\u017eko se to d\u00e1 rozb\u00edt. <\/li>\n<li>A kone\u010dn\u011b, mohli jsme z\u00edskat <b>atomov\u00e9 nasazen\u00ed<\/b>. Nasazen\u00ed, kter\u00e9 pro u\u017eivatele prob\u00edh\u00e1 okam\u017eit\u011b, bez zjevn\u00e9ho p\u0159ep\u00edn\u00e1n\u00ed mezi starou a novou verz\u00ed. <\/li>\n<\/ol>\n<p>\nAle v tom v\u0161em jsme tak\u00e9 vid\u011bli n\u011bkolik nev\u00fdhod: <\/p>\n<ol>\n<li>Krom\u011b produk\u010dn\u00edho prost\u0159ed\u00ed, v\u00fdvojov\u00e9ho prost\u0159ed\u00ed, existuj\u00ed i dal\u0161\u00ed prost\u0159ed\u00ed. Nap\u0159\u00edklad QA a p\u0159edprodukce. V tu chv\u00edli jsme m\u011bli hodn\u011b server\u016f a kolem 60 slu\u017eeb. Z tohoto d\u016fvodu bylo nutn\u00e9 <b>udr\u017eovat aktu\u00e1ln\u00ed verzi virtu\u00e1ln\u00edho stroje pro ka\u017edou slu\u017ebu. A pokud chcete aktualizovat knihovny nebo nainstalovat nov\u00e9 z\u00e1vislosti, mus\u00edte to ud\u011blat ve v\u0161ech prost\u0159ed\u00edch. Tak\u00e9 bylo pot\u0159eba synchronizovat \u010das, kdy chcete nasadit dal\u0161\u00ed novou verzi va\u0161\u00ed aplikace, s \u010dasem, kdy devops provede pot\u0159ebn\u00e1 nastaven\u00ed prost\u0159ed\u00ed. V takov\u00e9m p\u0159\u00edpad\u011b je snadn\u00e9 dostat se do situace, kdy se na\u0161e prost\u0159ed\u00ed bude v n\u011bkolika okam\u017eic\u00edch li\u0161it ve v\u0161ech prost\u0159ed\u00edch. Nap\u0159\u00edklad v QA prost\u0159ed\u00ed budou jedny verze knihoven, zat\u00edmco v produk\u010dn\u00edm budou jin\u00e9, co\u017e povede k probl\u00e9m\u016fm. <\/b>Slo\u017eitost p\u0159i aktualizaci z\u00e1vislost\u00ed <\/li>\n<li><b>va\u0161\u00ed aplikace. To nez\u00e1vis\u00ed na v\u00e1s, ale na jin\u00e9m t\u00fdmu. A to konkr\u00e9tn\u011b na t\u00fdmu devops, kter\u00fd udr\u017euje servery. Mus\u00edte pro n\u011b stanovit odpov\u00eddaj\u00edc\u00ed \u00fakol a poskytnout popis toho, co chcete ud\u011blat.<\/b> va\u0161eho aplikace. To nez\u00e1vis\u00ed na v\u00e1s, ale na jin\u00e9m t\u00fdmu. A sice na t\u00fdmu devops, kter\u00fd spravuje servery. Mus\u00edte jim poskytnout odpov\u00eddaj\u00edc\u00ed \u00fakol a popsat, co chcete ud\u011blat.<\/li>\n<li>V t\u00e9 dob\u011b jsme tak\u00e9 cht\u011bli rozd\u011blit na\u0161e velk\u00e9 monolity na jednotliv\u00e9 mal\u00e9 slu\u017eby, jeliko\u017e jsme ch\u00e1pali, \u017ee jich bude st\u00e1le p\u0159ib\u00fdvat. U\u017e jsme jich m\u011bli v\u00edce ne\u017e 100. Bylo t\u0159eba pro ka\u017edou novou slu\u017ebu vytvo\u0159it novou virtu\u00e1ln\u00ed stroj, kter\u00fd je pot\u0159eba spravovat a nasazovat. K tomu v\u0161emu je pot\u0159eba nejen jedna ma\u0161ina, ale minim\u00e1ln\u011b dv\u011b. Na to se je\u0161t\u011b vztahuje QA prost\u0159ed\u00ed. To zp\u016fsobuje probl\u00e9my a \u010din\u00ed pro v\u00e1s vytv\u00e1\u0159en\u00ed a spou\u0161t\u011bn\u00ed nov\u00fdch syst\u00e9m\u016f slo\u017eit\u011bj\u0161\u00edm, n\u00e1kladn\u011bj\u0161\u00edm a \u010dasov\u011b n\u00e1ro\u010dn\u011bj\u0161\u00edm procesem. <b>Slo\u017eit\u011bj\u0161\u00edm, n\u00e1kladn\u011bj\u0161\u00edm a \u010dasov\u011b n\u00e1ro\u010dn\u011bj\u0161\u00edm procesem.<\/b><\/li>\n<\/ol>\n<p>\nProto jsme se rozhodli, \u017ee bude pohodln\u011bj\u0161\u00ed p\u0159ej\u00edt od nasazov\u00e1n\u00ed oby\u010dejn\u00fdch virtu\u00e1ln\u00edch stroj\u016f k nasazov\u00e1n\u00ed na\u0161ich aplikac\u00ed v kontejnerech Docker. Kdy\u017e m\u00e1te Docker, pot\u0159ebujete syst\u00e9m, kter\u00fd dok\u00e1\u017ee spustit aplikaci v klastru, proto\u017ee nem\u016f\u017eete jen tak zvednout kontejner. Obvykle je pot\u0159eba sledovat, kolik kontejner\u016f je aktivn\u00edch, aby se spou\u0161t\u011bly automaticky. Z tohoto d\u016fvodu bylo pot\u0159eba vybrat syst\u00e9m spr\u00e1vy. <\/p>\n<p>Dlouho jsme p\u0159em\u00fd\u0161leli nad t\u00edm, kter\u00fd z nich bychom mohli zvolit. Faktem je, \u017ee v t\u00e9 dob\u011b byl n\u00e1\u0161 nasazovac\u00ed stack na oby\u010dejn\u00e9 virtu\u00e1ln\u00ed servery pon\u011bkud zastaral\u00fd, nebo\u0165 tam byly verze opera\u010dn\u00edch syst\u00e9m\u016f, kter\u00e9 nebyly zrovna nejnov\u011bj\u0161\u00ed. V ur\u010dit\u00fd moment tam dokonce b\u011b\u017eel FreeBSD, kter\u00e9 se nebylo p\u0159\u00edli\u0161 pohodln\u00e9 spravovat. Ch\u00e1pali jsme, \u017ee je pot\u0159eba co nejrychleji migrovat na Docker. Na\u0161i devops se pod\u00edvali na sv\u00e9 dosavadn\u00ed zku\u0161enosti s r\u016fzn\u00fdmi \u0159e\u0161en\u00edmi a vybrali si syst\u00e9m jako je Nomad. <\/p>\n<h1>P\u0159echod na Nomad<\/h1>\n<p>\nNomad je produkt spole\u010dnosti HashiCorp. Jsou zn\u00e1m\u00ed tak\u00e9 sv\u00fdmi dal\u0161\u00edmi \u0159e\u0161en\u00edmi:<\/p>\n<p><img decoding=\"async\" alt=\"Nasazen\u00ed aplikac\u00ed na VM, Nomad a Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/25dfbfe20b92f6e6865bdd8a2f15d8fa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>\u201eConsul\u201c<\/b> \u2014 n\u00e1stroj pro objavov\u00e1n\u00ed slu\u017eeb.<\/p>\n<p><b>\u201eTerraform\u201c<\/b> \u2014 syst\u00e9m pro spr\u00e1vu server\u016f, kter\u00fd v\u00e1m umo\u017e\u0148uje je konfigurovat prost\u0159ednictv\u00edm konfigurace, tzv. infrastruktura jako k\u00f3d.<\/p>\n<p><b>\u201eVagrant\u201c<\/b> umo\u017e\u0148uje roz\u0161i\u0159ovat virtu\u00e1ln\u00ed stroje lok\u00e1ln\u011b nebo v cloudu pomoc\u00ed specifick\u00fdch konfigura\u010dn\u00edch soubor\u016f. <\/p>\n<p>Nomad se tehdy jevil jako dostate\u010dn\u011b jednoduch\u00e9 \u0159e\u0161en\u00ed, na kter\u00e9 lze rychle p\u0159ej\u00edt bez zm\u011bny cel\u00e9 infrastruktury. Nav\u00edc je dost snadno ovladateln\u00fd. Proto jsme ho vybrali jako syst\u00e9m filtrace na\u0161eho kontejneru. <\/p>\n<p>Co pot\u0159ebujete k tomu, abyste v\u016fbec mohli nasadit sv\u016fj syst\u00e9m v Nomadu? <\/p>\n<ol>\n<li>P\u0159edev\u0161\u00edm pot\u0159ebujete <b>docker image<\/b> aplikace. Je nutn\u00e9 ji zkompilovat a um\u00edstit do \u00falo\u017ei\u0161t\u011b obraz\u016f docker. V na\u0161em p\u0159\u00edpad\u011b je to artifactory \u2013 syst\u00e9m, kter\u00fd umo\u017e\u0148uje nahr\u00e1vat do n\u011bj r\u016fzn\u00e9 artefakty r\u016fzn\u00fdch typ\u016f. Um\u00ed uchov\u00e1vat archivy, docker obrazy, PHP composer bal\u00ed\u010dky, NPM bal\u00ed\u010dky a tak d\u00e1le. <\/li>\n<li>D\u00e1le je pot\u0159eba<b> konfigura\u010dn\u00ed soubor<\/b>, kter\u00fd \u0159ekne Nomadu, co, kam a v jak\u00e9m mno\u017estv\u00ed chcete nasadit. <\/li>\n<\/ol>\n<p>\nKdy\u017e mluv\u00edme o Nomadu, jako form\u00e1t informa\u010dn\u00edho souboru vyu\u017e\u00edv\u00e1 jazyk HCL, co\u017e je zkratka pro <i>HashiCorp Configuration Language<\/i>. Je to takov\u00e9 nadmno\u017estv\u00ed nad Yaml, kter\u00e9 v\u00e1m umo\u017e\u0148uje popsat va\u0161i slu\u017ebu v term\u00ednech Nomadu. <\/p>\n<p><img decoding=\"async\" alt=\"Nasazen\u00ed aplikac\u00ed na VM, Nomad a Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/bee3d1feedd52249c4325d8a3984a766.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUmo\u017e\u0148uje specifikovat, kolik kontejner\u016f chcete nasadit, z jak\u00fdch obraz\u016f jim p\u0159edat r\u016fzn\u00e9 parametry p\u0159i nasazen\u00ed. Takto tento soubor p\u0159ed\u00e1te Nomadu a on podle n\u011bj spou\u0161t\u00ed kontejnery v produk\u010dn\u00edm prost\u0159ed\u00ed. <\/p>\n<p>V na\u0161em p\u0159\u00edpad\u011b jsme zjistili, \u017ee ps\u00e1t naprosto stejn\u00e9, identick\u00e9 HCL soubory pro ka\u017edou slu\u017ebu by nebylo moc pohodln\u00e9, proto\u017ee slu\u017eeb je hodn\u011b a ob\u010das je chceme aktualizovat. N\u011bkdy je jeden servis nasazen v n\u011bkolika exempl\u00e1\u0159\u00edch, nap\u0159\u00edklad jeden z na\u0161ich syst\u00e9m\u016f v produkci m\u00e1 v\u00edce ne\u017e 100 instanc\u00ed. Spou\u0161t\u00ed se ze stejn\u00fdch obraz\u016f, ale li\u0161\u00ed se konfigura\u010dn\u00edmi nastaven\u00edmi a konfigura\u010dn\u00edmi soubory. <\/p>\n<p>Proto jsme se rozhodli, \u017ee bude pohodln\u00e9 ukl\u00e1dat v\u0161echny na\u0161e konfigura\u010dn\u00ed soubory pro nasazen\u00ed v jednom spole\u010dn\u00e9m repozit\u00e1\u0159i. Takto byly p\u0159ehledn\u00e9: bylo snadn\u00e9 je udr\u017eovat a vid\u011bt, jak\u00e9 syst\u00e9my m\u00e1me. V p\u0159\u00edpad\u011b pot\u0159eby tak\u00e9 nebylo slo\u017eit\u00e9 n\u011bco aktualizovat nebo zm\u011bnit. P\u0159idat nov\u00fd syst\u00e9m nen\u00ed tak\u00e9 t\u011b\u017ek\u00e9 \u2013 sta\u010d\u00ed vytvo\u0159it konfigura\u010dn\u00ed soubor uvnit\u0159 nov\u00e9 slo\u017eky. Uvnit\u0159 n\u00ed le\u017e\u00ed soubory: service.hcl, kter\u00fd obsahuje popis na\u0161\u00ed slu\u017eby, a n\u011bkter\u00e9 env soubory, kter\u00e9 umo\u017e\u0148uj\u00ed tuto slu\u017ebu, kdy\u017e je nasazena v produkci, nastavit. <\/p>\n<p><img decoding=\"async\" alt=\"Nasazen\u00ed aplikac\u00ed na VM, Nomad a Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/c0b0bdb763d3c3bb84fbc9e5dfecff82.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNicm\u00e9n\u011b n\u011bkter\u00e9 na\u0161e syst\u00e9my nejsou nasazeny v produkci jen v jednom exempl\u00e1\u0159i, ale v n\u011bkolika najednou. Proto jsme se rozhodli, \u017ee bude pohodln\u00e9 uchov\u00e1vat ne \u010dist\u00e9 konfigurace, ale jejich \u0161ablonizovanou podobu. A jako jazyk \u0161ablonizace jsme zvolili <i>jinja 2<\/i>V tomto form\u00e1tu uchov\u00e1v\u00e1me jak konfigurace samotn\u00e9 slu\u017eby, tak i env soubory pot\u0159ebn\u00e9 pro jej\u00ed provoz. <\/p>\n<p>Krom\u011b toho jsme do repozit\u00e1\u0159e um\u00edstili skript pro nasazen\u00ed, kter\u00fd je spole\u010dn\u00fd pro v\u0161echny projekty a kter\u00fd umo\u017e\u0148uje spustit a nasadit va\u0161i slu\u017ebu do produk\u010dn\u00edho prost\u0159ed\u00ed, do po\u017eadovan\u00e9ho prost\u0159ed\u00ed a c\u00edle. V p\u0159\u00edpad\u011b, \u017ee jsme n\u00e1\u0161 HCL konfiguraci p\u0159evedli na \u0161ablonu, tak HCL soubor, kter\u00fd byl d\u0159\u00edve oby\u010dejnou konfigurac\u00ed Nomad, nyn\u00ed vypad\u00e1 trochu jinak.<\/p>\n<p><img decoding=\"async\" alt=\"Nasazen\u00ed aplikac\u00ed na VM, Nomad a Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/202472f109ba09798d592418b1774a29.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTo znamen\u00e1, \u017ee jsme nahradili n\u011bkter\u00e9 prom\u011bnn\u00e9 v konfiguraci prom\u011bnn\u00fdmi, kter\u00e9 se berou z env soubor\u016f nebo z jin\u00fdch zdroj\u016f. Krom\u011b toho jsme z\u00edskali mo\u017enost dynamicky sestavovat HCL soubory, tedy m\u016f\u017eeme pou\u017e\u00edt nejen oby\u010dejn\u00e9 prom\u011bnn\u00e9. Vzhledem k tomu, \u017ee jinja podporuje smy\u010dky a podm\u00ednky, lze do toho tak\u00e9 zahrnout konfigura\u010dn\u00ed soubory, kter\u00e9 se m\u011bn\u00ed v z\u00e1vislosti na tom, kam p\u0159esn\u011b nasazujete sv\u00e9 aplikace. <\/p>\n<p>Nap\u0159\u00edklad chcete nasadit svou slu\u017ebu do p\u0159edproduk\u010dn\u00edho a produk\u010dn\u00edho prost\u0159ed\u00ed. A nap\u0159\u00edklad v p\u0159edproduk\u010dn\u00edm prost\u0159ed\u00ed nechcete spou\u0161t\u011bt cron skripty, ale chcete jen vid\u011bt slu\u017ebu na samostatn\u00e9 dom\u00e9n\u011b, abyste se ujistili, \u017ee funguje. Pro ka\u017ed\u00e9ho, kdo nasazuje slu\u017ebu, je proces velmi jednoduch\u00fd a p\u0159ehledn\u00fd. Sta\u010d\u00ed spustit soubor deploy.sh, uv\u00e9st, kterou slu\u017ebu chcete nasadit a do jak\u00e9ho c\u00edle. Nap\u0159\u00edklad chcete nasadit n\u011bjak\u00fd syst\u00e9m do Ruska, do B\u011bloruska nebo Kazachst\u00e1nu. K tomu sta\u010d\u00ed zm\u011bnit jeden z parametr\u016f a spr\u00e1vn\u00fd konfigura\u010dn\u00ed soubor se automaticky vygeneruje. <\/p>\n<p>Po nasazen\u00ed slu\u017eby Nomad do va\u0161eho clusteru vypad\u00e1 n\u00e1sleduj\u00edc\u00edm zp\u016fsobem.<\/p>\n<p><img decoding=\"async\" alt=\"Nasazen\u00ed aplikac\u00ed na VM, Nomad a Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/60e2e2b5502936809d643d73c6d853e2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNejprve pot\u0159ebujete n\u011bjak\u00fd extern\u00ed vyva\u017eova\u010d zat\u00ed\u017een\u00ed, kter\u00fd p\u0159ijme ve\u0161ker\u00fd u\u017eivatelsk\u00fd provoz. Bude spolupracovat s Consul a zept\u00e1 se ho, kde, na kter\u00e9 uzlu, na jak\u00e9m <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/cs\/lir\/ipv4\/\"   title=\"IP adresu\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"585\">IP adresu<\/a> se nach\u00e1z\u00ed konkr\u00e9tn\u00ed slu\u017eba, kter\u00e1 odpov\u00edd\u00e1 dan\u00e9mu dom\u00e9nov\u00e9mu jm\u00e9nu. Slu\u017eby v Consul se objevuj\u00ed p\u0159\u00edmo z Nomad. Jeliko\u017e jsou to produkty t\u00e9\u017ee spole\u010dnosti, jsou mezi sebou dob\u0159e propojeny. D\u00e1 se \u0159\u00edci, \u017ee Nomad nativn\u011b um\u00ed registrovat v\u0161echny slu\u017eby, kter\u00e9 v n\u011bm b\u011b\u017e\u00ed, uvnit\u0159 Consul. <\/p>\n<p>Jakmile v\u00e1\u0161 extern\u00ed vyv\u00e1\u017ee\u010d zat\u00ed\u017een\u00ed zjist\u00ed, kter\u00e9mu servisu m\u00e1 poslat provoz, p\u0159esm\u011bruje ho na odpov\u00eddaj\u00edc\u00ed kontejner nebo na n\u011bkolik kontejner\u016f odpov\u00eddaj\u00edc\u00edch va\u0161\u00ed aplikaci. Samoz\u0159ejm\u011b je nutn\u00e9 myslet tak\u00e9 na bezpe\u010dnost. I kdy\u017e se v\u0161echny slu\u017eby spou\u0161t\u011bj\u00ed na stejn\u00fdch virtu\u00e1ln\u00edch stroj\u00edch v kontejnerech, obvykle je pot\u0159eba zak\u00e1zat voln\u00fd p\u0159\u00edstup jak\u00e9koli slu\u017eb\u011b k jak\u00e9koli jin\u00e9. Toho jsme dosahovali segmentac\u00ed. Ka\u017ed\u00e1 slu\u017eba byla spu\u0161t\u011bna ve sv\u00e9 vlastn\u00ed virtu\u00e1ln\u00ed s\u00edti, na kter\u00e9 byla nastavena pravidla sm\u011brov\u00e1n\u00ed a pravidla povolen\u00ed\/z\u00e1kazu p\u0159\u00edstupu k dal\u0161\u00edm syst\u00e9m\u016fm a slu\u017eb\u00e1m. Ty mohly b\u00fdt jak uvnit\u0159 tohoto clusteru, tak i mimo n\u011bj. Nap\u0159\u00edklad pokud chcete zak\u00e1zat slu\u017eb\u011b p\u0159ipojit se k ur\u010dit\u00e9 datab\u00e1zi, lze to ud\u011blat pomoc\u00ed segmentace na \u00farovni s\u00edt\u011b. To znamen\u00e1, \u017ee ani omylem se nem\u016f\u017eete n\u00e1hodn\u011b p\u0159ipojit z testovac\u00edho prost\u0159ed\u00ed k va\u0161\u00ed produk\u010dn\u00ed datab\u00e1zi.<\/p>\n<p>Kolik n\u00e1m proces p\u0159echodu p\u0159inesl v oblasti lidsk\u00fdch zdroj\u016f? <\/p>\n<p>P\u0159echod cel\u00e9 spole\u010dnosti na Nomad trval p\u0159ibli\u017en\u011b 5-6 m\u011bs\u00edc\u016f. P\u0159ech\u00e1zeli jsme po jednotliv\u00fdch slu\u017eb\u00e1ch, ale dost rychl\u00fdm tempem. Ka\u017ed\u00fd t\u00fdm m\u011bl vytvo\u0159it vlastn\u00ed kontejnery pro slu\u017eby. <\/p>\n<p>M\u00e1me p\u0159ijat\u00fd p\u0159\u00edstup, \u017ee ka\u017ed\u00fd t\u00fdm se s\u00e1m star\u00e1 o docker obrazce sv\u00fdch syst\u00e9m\u016f. DevOps poskytuj\u00ed spole\u010dnou infrastrukturu pot\u0159ebnou pro nasazen\u00ed, tedy podporu samotn\u00e9ho clusteru, podporu CI syst\u00e9mu a tak d\u00e1le. V t\u00e9 dob\u011b se k n\u00e1m v\u00edce ne\u017e 60 syst\u00e9m\u016f p\u0159est\u011bhovalo na Nomad, co\u017e zahrnovalo p\u0159ibli\u017en\u011b 2000 kontejner\u016f. <\/p>\n<p>DevOps odpov\u00eddaj\u00ed za celkovou infrastrukturu v\u0161eho, co souvis\u00ed s nasazen\u00edm a servery. A ka\u017ed\u00fd v\u00fdvojov\u00fd t\u00fdm na druh\u00e9 stran\u011b odpov\u00edd\u00e1 za implementaci kontejner\u016f pro sv\u016fj konkr\u00e9tn\u00ed syst\u00e9m, proto\u017ee to je pr\u00e1v\u011b t\u00fdm, kter\u00fd v\u00ed, co pot\u0159ebuje v tom kter\u00e9m kontejneru.<\/p>\n<h1>D\u016fvody pro opu\u0161t\u011bn\u00ed Nomad<\/h1>\n<p>\nJak\u00e9 v\u00fdhody jsme z\u00edskali p\u0159echodem na nasazen\u00ed pomoc\u00ed Nomad a Dockeru?<\/p>\n<ol>\n<li>Jsme<b> zajistili jsme stejn\u00e9 podm\u00ednky<\/b> pro v\u0161echny prost\u0159ed\u00ed. V developmente, QA prost\u0159ed\u00ed, preprodukci a produkci se pou\u017e\u00edvaj\u00ed stejn\u00e9 obrazy kontejner\u016f se stejn\u00fdmi z\u00e1vislostmi. T\u00edm p\u00e1dem prakticky nem\u00e1te \u0161anci, \u017ee do produkce p\u016fjde n\u011bco, co jste p\u0159edt\u00edm netestovali lok\u00e1ln\u011b nebo na testovac\u00edm prost\u0159ed\u00ed. <\/li>\n<li>Tak\u00e9 jsme zjistili, \u017ee sta\u010d\u00ed <b>snadno p\u0159idat novou slu\u017ebu<\/b>. Jak\u00e9koli nov\u00e9 syst\u00e9my z pohledu nasazen\u00ed se spou\u0161t\u00ed velmi jednodu\u0161e. Sta\u010d\u00ed j\u00edt do repozit\u00e1\u0159e, kter\u00fd obsahuje konfigurace, p\u0159idat tam dal\u0161\u00ed konfiguraci pro v\u00e1\u0161 syst\u00e9m a m\u00e1te v\u0161e p\u0159ipraven\u00e9. M\u016f\u017eete nasadit sv\u016fj syst\u00e9m do produkce bez dodate\u010dn\u00e9ho \u00fasil\u00ed od DevOps. <\/li>\n<li>V\u0161e <b>konfigura\u010dn\u00ed soubory<\/b> v jednom spole\u010dn\u00e9m repozit\u00e1\u0159i <b>se uk\u00e1zaly jako p\u0159ehledn\u00e9<\/b>. V okam\u017eiku, kdy jsme nasazovali na\u0161e syst\u00e9my pomoc\u00ed <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/cs\/vps\/\"   title=\"virtu\u00e1ln\u00edch server\u016f\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"791\">virtu\u00e1ln\u00edch server\u016f<\/a>, pou\u017e\u00edvali jsme Ansible, ve kter\u00e9m byly konfigurace ulo\u017eeny ve stejn\u00e9m repozit\u00e1\u0159i. Nicm\u00e9n\u011b pro v\u011bt\u0161inu v\u00fdvoj\u00e1\u0159\u016f bylo s t\u00edmto pracovat o n\u011bco slo\u017eit\u011bj\u0161\u00ed. Objem konfigurac\u00ed a k\u00f3du, kter\u00e9 mus\u00edte p\u0159idat, abyste nasadili slu\u017ebu, se v\u00fdrazn\u011b sn\u00ed\u017eil. Plus pro DevOps je velmi snadn\u00e9 to opravit nebo zm\u011bnit. P\u0159i p\u0159echodech, nap\u0159\u00edklad na novou verzi Nomad, mohou hromadn\u011b aktualizovat v\u0161echny opera\u010dn\u00ed soubory, kter\u00e9 jsou na stejn\u00e9m m\u00edst\u011b.<\/li>\n<\/ol>\n<p>\nAle z\u00e1rove\u0148 jsme se setkali i s n\u011bkolika nev\u00fdhodami: <\/p>\n<p>Uk\u00e1zalo se, \u017ee jsme <b>nedok\u00e1zali dos\u00e1hnout bezprobl\u00e9mov\u00e9ho nasazen\u00ed <\/b>v p\u0159\u00edpad\u011b Nomad. P\u0159i nasazov\u00e1n\u00ed kontejner\u016f z r\u016fzn\u00fdch podm\u00ednek se mohlo st\u00e1t, \u017ee byl spu\u0161t\u011bn a Nomad ho vn\u00edmal jako kontejner p\u0159ipraven\u00fd k p\u0159ijet\u00ed provozu. K tomu do\u0161lo je\u0161t\u011b p\u0159edt\u00edm, ne\u017e se aplikace uvnit\u0159 n\u011bho sta\u010dila spustit. Z tohoto d\u016fvodu syst\u00e9m na kr\u00e1tkou dobu za\u010dal vykazovat chyby 500, proto\u017ee provoz za\u010dal sm\u011b\u0159ovat na kontejner, kter\u00fd je\u0161t\u011b nebyl p\u0159ipraven ho p\u0159ijmout. <\/p>\n<p>Setkali jsme se s n\u011bkter\u00fdmi <b>chybami<\/b>. Nejv\u011bt\u0161\u00ed probl\u00e9m spo\u010d\u00edv\u00e1 v tom, \u017ee Nomad nepracuje dob\u0159e s velk\u00fdm klastrem, pokud m\u00e1te spoustu syst\u00e9m\u016f a kontejner\u016f. Kdy\u017e chcete odebrat jeden ze server\u016f ze spr\u00e1vy, kter\u00fd je sou\u010d\u00e1st\u00ed klastru Nomad, je pravd\u011bpodobn\u00e9, \u017ee se klastr za\u010dne chovat nestabiln\u011b a rozpadne se. N\u011bkter\u00e9 kontejnery mohou nap\u0159\u00edklad spadnout a neobnovit se, co\u017e v\u00e1m pozd\u011bji velmi podra\u017e\u00ed, pokud v\u0161echny va\u0161e syst\u00e9my produkce b\u011b\u017e\u00ed pr\u00e1v\u011b v klastru \u0159\u00edzen\u00e9m Nomadem. <\/p>\n<p>Proto jsme se rozhodli zv\u00e1\u017eit, kam j\u00edt d\u00e1l. V t\u00e9 dob\u011b jsme u\u017e l\u00e9pe ch\u00e1pali, \u010deho chceme dos\u00e1hnout. A sice: chceme spolehlivost, trochu v\u00edce funkc\u00ed, ne\u017e nab\u00edz\u00ed Nomad, a zralej\u0161\u00ed, stabiln\u011bj\u0161\u00ed syst\u00e9m. <\/p>\n<p>V tomto ohledu jsme se rozhodli pro Kubernetes jako nejpopul\u00e1rn\u011bj\u0161\u00ed platformu pro spu\u0161t\u011bn\u00ed klastr\u016f. Obzvl\u00e1\u0161t\u011b vzhledem k tomu, \u017ee velikost a po\u010det na\u0161ich kontejner\u016f byl dostate\u010dn\u011b velk\u00fd. Pro tyto \u00fa\u010dely se Kubernetes jevil jako nejvhodn\u011bj\u0161\u00ed syst\u00e9m z t\u011bch, kter\u00e9 jsme mohli zva\u017eovat. <\/p>\n<h1>P\u0159echod na Kubernetes<\/h1>\n<p>\nTrochu v\u00e1m p\u0159edstav\u00edm z\u00e1kladn\u00ed pojmy Kubernetes a \u010d\u00edm se li\u0161\u00ed od Nomadu. <\/p>\n<p><img decoding=\"async\" alt=\"Nasazen\u00ed aplikac\u00ed na VM, Nomad a Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/5723a69309f387e6cc6c5959b62ca18b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV prvn\u00ed \u0159ad\u011b je nejz\u00e1kladn\u011bj\u0161\u00edm pojmem v Kubernetes pojem pod. <b>Pod<\/b> \u2014 to je skupina jednoho nebo v\u00edce kontejner\u016f, kter\u00e9 v\u017edy b\u011b\u017e\u00ed spole\u010dn\u011b. A funguj\u00ed, jako by byly v\u017edy na jedn\u00e9 virtu\u00e1ln\u00ed ma\u0161in\u011b. Jsou si navz\u00e1jem dostupn\u00e9 p\u0159es IP adresu 127.0.0.1 na r\u016fzn\u00fdch portech. <\/p>\n<p>P\u0159edstavte si, \u017ee m\u00e1te PHP aplikaci, kter\u00e1 se skl\u00e1d\u00e1 z nginx a php-fpm \u2013 klasick\u00e1 sch\u00e9ma. Pravd\u011bpodobn\u011b byste cht\u011bli, aby kontejnery nginx a php-fpm byly v\u017edy spolu. Kubernetes to umo\u017e\u0148uje t\u00edm, \u017ee je pop\u00ed\u0161ete jako jeden spole\u010dn\u00fd pod. Toho jsme ale nebyli schopni dos\u00e1hnout s Nomadem.<\/p>\n<p>Druh\u00fdm pojmem je <b>deployment<\/b>. Pod je toti\u017e s\u00e1m o sob\u011b efem\u00e9rn\u00ed z\u00e1le\u017eitost\u00ed, spou\u0161t\u00ed se a miz\u00ed. Chcete-li nejprve zlikvidovat v\u0161echny va\u0161e p\u0159edchoz\u00ed kontejnery a pot\u00e9 spustit nov\u00e9 verze, nebo zda je chcete nasazovat postupn\u011b \u2013 p\u0159esn\u011b za tento proces odpov\u00edd\u00e1 pojem deployment. Ten popisuje, jak nasazujete sv\u00e9 pody, v jak\u00e9m mno\u017estv\u00ed a jak je aktualizovat. <\/p>\n<p>T\u0159et\u00edm pojmem je <b>service<\/b>V\u00e1\u0161 service je v podstat\u011b v\u00e1\u0161 syst\u00e9m, kter\u00fd p\u0159ij\u00edm\u00e1 ur\u010dit\u00fd provoz a pot\u00e9 jej sm\u011bruje na jeden nebo v\u00edce pod\u016f odpov\u00eddaj\u00edc\u00edch va\u0161emu servisu. To znamen\u00e1, \u017ee umo\u017e\u0148uje \u0159\u00edci, \u017ee ve\u0161ker\u00fd p\u0159\u00edchoz\u00ed provoz na tento konkr\u00e9tn\u00ed servis s t\u00edmto n\u00e1zvem mus\u00ed b\u00fdt posl\u00e1n na tyto konkr\u00e9tn\u00ed pody. A p\u0159itom zaji\u0161\u0165uje vyva\u017eov\u00e1n\u00ed provozu. M\u016f\u017eete spustit dva pody va\u0161\u00ed aplikace a ve\u0161ker\u00fd p\u0159\u00edchoz\u00ed provoz bude rovnom\u011brn\u011b vyv\u00e1\u017een mezi pody souvisej\u00edc\u00edmi s t\u00edmto servisem.<\/p>\n<p>A \u010dtvrt\u00fd z\u00e1kladn\u00ed pojem \u2014 <b>Ingress<\/b>je to slu\u017eba, kter\u00e1 se spou\u0161t\u00ed v klastru Kubernetes. P\u016fsob\u00ed jako extern\u00ed vyva\u017eova\u010d z\u00e1t\u011b\u017ee, kter\u00fd p\u0159eb\u00edr\u00e1 v\u0161echny po\u017eadavky. D\u00edky API Kubernetes Ingress m\u016f\u017ee ur\u010dovat, kam tyto po\u017eadavky poslat. A d\u011bl\u00e1 to velmi flexibiln\u011b. M\u016f\u017eete \u0159\u00edci, \u017ee v\u0161echny po\u017eadavky na tento host a takovou URL posiel\u00e1me na tuto slu\u017ebu. A tyto po\u017eadavky, kter\u00e9 p\u0159ich\u00e1zej\u00ed na tento host a na jinou URL, pos\u00edl\u00e1me na jinou slu\u017ebu. <\/p>\n<p>Nejlep\u0161\u00ed na tom, kdo vyv\u00edj\u00ed aplikaci, je to, \u017ee m\u016f\u017eete v\u0161emu \u0159\u00eddit sami. Nastaven\u00edm konfigurace Ingress m\u016f\u017eete ve\u0161ker\u00fd provoz, kter\u00fd p\u0159ich\u00e1z\u00ed na tuto API, pos\u00edlat na jednotliv\u00e9 kontejnery, nap\u0159\u00edklad ty napsan\u00e9 v Go. A tento provoz, kter\u00fd p\u0159ich\u00e1z\u00ed na stejnou dom\u00e9nu, ale na jinou URL, poslat na kontejnery napsan\u00e9 v PHP, kde je hodn\u011b logiky, ale nejsou p\u0159\u00edli\u0161 rychl\u00e9.<\/p>\n<p>Pokud porovn\u00e1me v\u0161echny tyto pojmy s Nomad, lze \u0159\u00edci, \u017ee prvn\u00edch t\u0159i pojmy jsou dohromady Servis. A posledn\u00ed pojem v samotn\u00e9m Nomadu chyb\u00ed. My jako jeho n\u00e1hradu pou\u017eili extern\u00ed vyva\u017eova\u010d: m\u016f\u017ee to b\u00fdt haproxy, nginx, nginx+ a tak d\u00e1le. V p\u0159\u00edpad\u011b kubernetes nemus\u00edte zav\u00e1d\u011bt tento dodate\u010dn\u00fd pojem zvl\u00e1\u0161\u0165. Nicm\u00e9n\u011b, pokud se pod\u00edv\u00e1te na Ingress uvnit\u0159, je to bu\u010f nginx, nebo haproxy, nebo traefik, ale jakoby zabudovan\u00e9 v Kubernetes. <\/p>\n<p>V\u0161echny pojmy, kter\u00e9 jsem popsal, jsou v podstat\u011b zdroje, kter\u00e9 existuj\u00ed uvnit\u0159 klastru Kubernetes. Pro jejich popis se v kubernetes pou\u017e\u00edv\u00e1 yaml form\u00e1t, kter\u00fd je \u010diteln\u011bj\u0161\u00ed a zn\u00e1m\u011bj\u0161\u00ed ne\u017e HCL soubory v p\u0159\u00edpad\u011b Nomad. Ale struktur\u00e1ln\u011b popisuj\u00ed nap\u0159\u00edklad pod stejn\u011b. \u0158\u00edkaj\u00ed \u2013 chci nasadit takov\u00e9to pody tam, s takov\u00fdmi imid\u017ei, v takov\u00e9m mno\u017estv\u00ed. <\/p>\n<p><img decoding=\"async\" alt=\"Nasazen\u00ed aplikac\u00ed na VM, Nomad a Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/13836e7474b377a5e6b05112a53bfedd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKrom\u011b toho jsme pochopili, \u017ee nechceme ru\u010dn\u011b vytv\u00e1\u0159et ka\u017ed\u00fd jednotliv\u00fd zdroj: nasazen\u00ed, slu\u017eby, Ingress a dal\u0161\u00ed. M\u00edsto toho jsme cht\u011bli p\u0159i nasazen\u00ed popisovat ka\u017edou na\u0161i syst\u00e9movou instanci pomoc\u00ed term\u00edn\u016f Kubernetes, abychom nemuseli ru\u010dn\u011b znovu vytv\u00e1\u0159et v\u0161echny pot\u0159ebn\u00e9 z\u00e1vislosti zdroj\u016f ve spr\u00e1vn\u00e9m po\u0159ad\u00ed. Jako takov\u00fd syst\u00e9m, kter\u00fd n\u00e1m to umo\u017enil, byl vybr\u00e1n Helm. <\/p>\n<h1>Z\u00e1kladn\u00ed pojmy v Helmu<\/h1>\n<p>\nHelm je <b>bal\u00ed\u010dkov\u00fd mana\u017eer<\/b> pro Kubernetes. Velmi p\u0159ipom\u00edn\u00e1 zp\u016fsob, jak\u00fdm funguj\u00ed spr\u00e1vci bal\u00ed\u010dk\u016f v programovac\u00edch jazyc\u00edch. Umo\u017e\u0148uje v\u00e1m uchov\u00e1vat slu\u017ebu, kter\u00e1 se skl\u00e1d\u00e1 nap\u0159\u00edklad z nasazen\u00ed nginx, nasazen\u00ed php-fpm, konfigurace pro Ingress, configmaps (to je entita, kter\u00e1 v\u00e1m umo\u017e\u0148uje nastavit env a dal\u0161\u00ed parametry pro v\u00e1\u0161 syst\u00e9m), ve form\u011b takzvan\u00fdch chart\u016f. Helm <b>pracuje nad Kubernetes.<\/b>. To znamen\u00e1, \u017ee to nen\u00ed n\u011bjak\u00fd syst\u00e9m stoj\u00edc\u00ed stranou, ale prost\u011b dal\u0161\u00ed slu\u017eba spu\u0161t\u011bn\u00e1 uvnit\u0159 klastru. Komunikujete s n\u00edm prost\u0159ednictv\u00edm jeho API pomoc\u00ed p\u0159\u00edkazov\u00e9ho \u0159\u00e1dku. Jeho pohodl\u00ed a kouzlo spo\u010d\u00edv\u00e1 v tom, \u017ee i kdy\u017e helm sel\u017ee nebo jej odstran\u00edte z klastru, va\u0161e slu\u017eby nezmiz\u00ed, proto\u017ee helm slou\u017e\u00ed v podstat\u011b pouze k spu\u0161t\u011bn\u00ed syst\u00e9mu. Za funk\u010dnost a stav slu\u017eeb n\u00e1sledn\u011b odpov\u00edd\u00e1 samotn\u00fd Kubernetes. <\/p>\n<p>Tak\u00e9 jsme pochopili, \u017ee <b>\u0161ablonov\u00e1n\u00ed<\/b>, kter\u00e9 jsme do t\u00e9 doby museli prov\u00e1d\u011bt sami prost\u0159ednictv\u00edm integrace jinja do na\u0161ich konfigurac\u00ed, je jednou z hlavn\u00edch funkc\u00ed helmu. V\u0161echny konfigurace, kter\u00e9 vytv\u00e1\u0159\u00edte pro sv\u00e9 syst\u00e9my, jsou v helm ulo\u017eeny ve form\u011b \u0161ablon, kter\u00e9 se trochu podobaly jinja, ale ve skute\u010dnosti pou\u017e\u00edvaj\u00ed \u0161ablonov\u00e1n\u00ed jazyka Go, ve kter\u00e9m je helm naps\u00e1n, stejn\u011b jako Kubernetes. <\/p>\n<p>Helm n\u00e1m p\u0159id\u00e1v\u00e1 je\u0161t\u011b n\u011bkolik dal\u0161\u00edch pojm\u016f. <\/p>\n<p><b>Chart<\/b> \u2014 to je popis va\u0161\u00ed slu\u017eby. V jin\u00fdch spr\u00e1vc\u00edch bal\u00ed\u010dk\u016f by tomu \u0159\u00edkali bal\u00ed\u010dek, bundle nebo n\u011bco podobn\u00e9ho. Tady se tomu \u0159\u00edk\u00e1 chart. <\/p>\n<p><b>Values <\/b>\u2013 to jsou prom\u011bnn\u00e9, kter\u00e9 chcete pou\u017e\u00edt k sestaven\u00ed sv\u00fdch konfigurac\u00ed z \u0161ablon. <\/p>\n<p><b>Release<\/b>Ka\u017ed\u00fd jednotliv\u00fd servis, kter\u00fd je nasazov\u00e1n pomoc\u00ed helm, z\u00edsk\u00e1v\u00e1 inkrement\u00e1ln\u00ed verzi vyd\u00e1n\u00ed. Helm si pamatuje, jak\u00e1 byla konfigurace servisu p\u0159i p\u0159edchoz\u00edm, p\u0159edp\u0159edchoz\u00edm vyd\u00e1n\u00ed a tak d\u00e1le. Proto sta\u010d\u00ed prov\u00e9st p\u0159\u00edkaz helm callback a uv\u00e9st mu p\u0159edchoz\u00ed verzi vyd\u00e1n\u00ed, pokud je t\u0159eba se vr\u00e1tit zp\u011bt. I kdy\u017e p\u0159i n\u00e1vratu nebude p\u0159\u00edslu\u0161n\u00e1 konfigurace dostupn\u00e1 ve va\u0161em repozit\u00e1\u0159i, helm si st\u00e1le pamatuje, jak\u00e1 byla, a vr\u00e1t\u00ed v\u00e1\u0161 syst\u00e9m do stavu, ve kter\u00e9m byl p\u0159i p\u0159edchoz\u00edm vyd\u00e1n\u00ed. <\/p>\n<p>V p\u0159\u00edpad\u011b, kdy pou\u017e\u00edv\u00e1me helm, se b\u011b\u017en\u00e9 konfigurace pro Kubernetes tak\u00e9 prom\u011b\u0148uj\u00ed na \u0161ablony, ve kter\u00fdch je mo\u017en\u00e9 pou\u017e\u00edt prom\u011bnn\u00e9, funkce a aplikovat podm\u00ednkov\u00e9 oper\u00e1tory. T\u00edmto zp\u016fsobem m\u016f\u017eete sestavit konfiguraci va\u0161eho servisu v z\u00e1vislosti na prost\u0159ed\u00ed.<\/p>\n<p><img decoding=\"async\" alt=\"Nasazen\u00ed aplikac\u00ed na VM, Nomad a Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/b70ba431211038eacf911ba3aee22363.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV praxi jsme se rozhodli postupovat trochu jinak, ne\u017e jsme to d\u011blali v p\u0159\u00edpad\u011b s Nomad. Pokud v Nomad byly v jednom repozit\u00e1\u0159i uchov\u00e1ny jak konfigurace pro nasazen\u00ed, tak i prom\u011bnn\u00e9 n, kter\u00e9 jsou pot\u0159eba k nasazen\u00ed na\u0161eho servisu, zde jsme se rozhodli je rozd\u011blit na dva samostatn\u00e9 repozit\u00e1\u0159e. V repozit\u00e1\u0159i \u201edeploy\u201c jsou uchov\u00e1v\u00e1ny pouze prom\u011bnn\u00e9 n pot\u0159ebn\u00e9 pro nasazen\u00ed, zat\u00edmco v repozit\u00e1\u0159i \u201ehelm\u201c jsou uchov\u00e1v\u00e1ny konfigurace nebo chart.<\/p>\n<p><img decoding=\"async\" alt=\"Nasazen\u00ed aplikac\u00ed na VM, Nomad a Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/4add11a8f9d9a9244127f0b07d027fa2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCo n\u00e1m to dalo? <\/p>\n<p>A\u010dkoliv v samotn\u00fdch konfigura\u010dn\u00edch souborech neuchov\u00e1v\u00e1me \u017e\u00e1dn\u00e9 skute\u010dn\u011b citliv\u00e9 \u00fadaje, nap\u0159\u00edklad hesla k datab\u00e1z\u00edm. Ta jsou uchov\u00e1v\u00e1na ve form\u011b tajemstv\u00ed v Kubernetes, p\u0159esto st\u00e1le existuj\u00ed ur\u010dit\u00e9 v\u011bci, k nim\u017e nechceme poskytovat p\u0159\u00edstup v\u0161em. Proto je p\u0159\u00edstup k repozit\u00e1\u0159i \u201edeploy\u201c omezen\u011bj\u0161\u00ed, zat\u00edmco repozit\u00e1\u0159 \u201ehelm\u201c obsahuje pouze popis servisu. Z tohoto d\u016fvodu do n\u011bj m\u016f\u017eeme bezpe\u010dn\u011b poskytnout p\u0159\u00edstup \u0161ir\u0161\u00edmu okruhu osob. <\/p>\n<p>Proto\u017ee m\u00e1me nejen produkci, ale i jin\u00e1 prost\u0159ed\u00ed, tak d\u00edky takov\u00e9mu rozd\u011blen\u00ed m\u016f\u017eeme znovu pou\u017e\u00edt na\u0161e helm chart pro nasazen\u00ed servis\u016f nejen v produkci, ale i nap\u0159\u00edklad v QA prost\u0159ed\u00ed. Dokonce i pro to, abychom je nasadili lok\u00e1ln\u011b, pou\u017e\u00edv\u00e1me <i>Minikube<\/i> \u2014 to je n\u00e1stroj pro lok\u00e1ln\u00ed spu\u0161t\u011bn\u00ed Kubernetes. <\/p>\n<p>V ka\u017ed\u00e9m repozit\u00e1\u0159i jsme ponechali rozd\u011blen\u00ed na jednotliv\u00e9 adres\u00e1\u0159e pro ka\u017edou slu\u017ebu. To znamen\u00e1, \u017ee uvnit\u0159 ka\u017ed\u00e9ho adres\u00e1\u0159e se nach\u00e1zej\u00ed \u0161ablony, kter\u00e9 se vztahuj\u00ed k p\u0159\u00edslu\u0161n\u00e9mu chartu a popisuj\u00ed zdroje, kter\u00e9 je t\u0159eba nasadit pro spu\u0161t\u011bn\u00ed na\u0161eho syst\u00e9mu. V repozit\u00e1\u0159i \u201edeploy\u201c jsme ponechali pouze env. V tomto p\u0159\u00edpad\u011b jsme se nerozhodli pou\u017e\u00edt \u0161ablonov\u00e1n\u00ed pomoc\u00ed jinja, proto\u017ee helm s\u00e1m poskytuje \u0161ablonov\u00e1n\u00ed ji\u017e z krabice \u2013 to je jedna z jeho hlavn\u00edch funkc\u00ed. <\/p>\n<p>Zanechali jsme skript pro nasazen\u00ed \u2013 deploy.sh, kter\u00fd zjednodu\u0161uje a standardizuje spu\u0161t\u011bn\u00ed pro nasazen\u00ed pomoc\u00ed helm. T\u00edmto zp\u016fsobem, pro ka\u017ed\u00e9ho, kdo chce nasadit, vypad\u00e1 rozhran\u00ed nasazen\u00ed p\u0159esn\u011b stejn\u011b, jako to bylo v p\u0159\u00edpad\u011b nasazen\u00ed p\u0159es Nomad. Stejn\u00fd deploy.sh, n\u00e1zev va\u0161\u00ed slu\u017eby a m\u00edsto, kam chcete slu\u017ebu nasadit. To vede k tomu, \u017ee v pozad\u00ed se spou\u0161t\u00ed helm. Ten pak shroma\u017e\u010fuje konfigurace ze \u0161ablon, nahrazuje pot\u0159ebn\u00e9 values soubory a pot\u00e9 prov\u00e1d\u00ed nasazen\u00ed do Kubernetes. <\/p>\n<h1>Z\u00e1v\u011bry<\/h1>\n<p>\nSlu\u017eba Kubernetes vypad\u00e1 slo\u017eit\u011bji ne\u017e Nomad. <\/p>\n<p><img decoding=\"async\" alt=\"Nasazen\u00ed aplikac\u00ed na VM, Nomad a Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/5a9b5636ab4721acde096fea986ba38b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZde odchoz\u00ed provoz p\u0159ich\u00e1z\u00ed do Ingress. To je pr\u00e1v\u011b frontov\u00fd kontrol\u00e9r, kter\u00fd p\u0159ij\u00edm\u00e1 v\u0161echny po\u017eadavky a n\u00e1sledn\u011b je pos\u00edl\u00e1 do odpov\u00eddaj\u00edc\u00edch slu\u017eeb podle dat po\u017eadavku. Tyto slu\u017eby jsou ur\u010deny na z\u00e1klad\u011b konfigurac\u00ed, kter\u00e9 jsou sou\u010d\u00e1st\u00ed popisu va\u0161\u00ed aplikace v helm a kter\u00e9 si v\u00fdvoj\u00e1\u0159i sami nastavuj\u00ed. Slu\u017eba pak pos\u00edl\u00e1 po\u017eadavky na sv\u00e9 pody, tedy konkr\u00e9tn\u00ed kontejnery, vyva\u017euj\u00edc\u00ed p\u0159ich\u00e1zej\u00edc\u00ed provoz mezi v\u0161emi kontejnery, kter\u00e9 se k dan\u00e9 slu\u017eb\u011b vztahuj\u00ed. A samoz\u0159ejm\u011b, nesm\u00edme zapom\u00ednat na to, \u017ee na \u00farovni s\u00edt\u011b mus\u00edme zajistit bezpe\u010dnost. Proto v Kubernetes clusteru funguje segmentace, kter\u00e1 je zalo\u017eena na tagov\u00e1n\u00ed. V\u0161echny slu\u017eby maj\u00ed ur\u010dit\u00e9 tagy, ke kter\u00fdm jsou p\u0159i\u0159azena pr\u00e1va p\u0159\u00edstupu slu\u017eeb k r\u016fzn\u00fdm extern\u00edm\/vnit\u0159n\u00edm zdroj\u016fm uvnit\u0159 \u010di vn\u011b clusteru. <\/p>\n<p>B\u011bhem p\u0159echodu jsme zjistili, \u017ee Kubernetes m\u00e1 v\u0161echny funkce, kter\u00e9 m\u011bl Nomad, kter\u00fd jsme d\u0159\u00edve pou\u017e\u00edvali, a nav\u00edc p\u0159id\u00e1v\u00e1 mnoho nov\u00e9ho. Lze ho roz\u0161i\u0159ovat pomoc\u00ed plugin\u016f, a to skute\u010dn\u011b pomoc\u00ed vlastn\u00edch typ\u016f zdroj\u016f. To znamen\u00e1, \u017ee m\u00e1te mo\u017enost ne pouze pou\u017e\u00edvat to, co je v Kubernetes k dispozici standardn\u011b, ale tak\u00e9 vytvo\u0159it sv\u016fj vlastn\u00ed zdroj a slu\u017ebu, kter\u00e1 bude tento zdroj \u010d\u00edst. To poskytuje dal\u0161\u00ed mo\u017enosti roz\u0161i\u0159ov\u00e1n\u00ed va\u0161eho syst\u00e9mu bez pot\u0159eby p\u0159einstalace Kubernetes a bez nutnosti jak\u00fdchkoliv zm\u011bn. <\/p>\n<p>P\u0159\u00edkladem takov\u00e9ho pou\u017eit\u00ed je Prometheus, kter\u00fd b\u011b\u017e\u00ed u n\u00e1s uvnit\u0159 Kubernetes clusteru. Aby za\u010dal sb\u00edrat metriky z n\u011bjak\u00e9 slu\u017eby, mus\u00edme do popisu slu\u017eby p\u0159idat dal\u0161\u00ed typ zdroje, takzvan\u00fd service monitor. Prometheus m\u00e1 schopnost \u010d\u00edst vlastn\u00ed typy zdroj\u016f, kdy\u017e je spu\u0161t\u011bn v Kubernetes, tak\u017ee automaticky za\u010d\u00edn\u00e1 sb\u00edrat metriky z nov\u00e9ho syst\u00e9mu. To je velmi praktick\u00e9. <\/p>\n<p>Prvn\u00ed nasazen\u00ed, kter\u00e9 jsme provedli v Kubernetes, prob\u011bhlo v b\u0159eznu 2018. A za tu dobu jsme nikdy nem\u011bli \u017e\u00e1dn\u00e9 probl\u00e9my. Funguje dostate\u010dn\u011b stabiln\u011b bez podstatn\u00fdch chyb. Nav\u00edc ho m\u016f\u017eeme d\u00e1le roz\u0161i\u0159ovat. V sou\u010dasnosti n\u00e1m sta\u010d\u00ed funkce, kter\u00e9 v n\u011bm jsou, a tempo v\u00fdvoje Kubernetes se n\u00e1m velmi l\u00edb\u00ed. V tuto chv\u00edli je v Kubernetes v\u00edce ne\u017e 3000 kontejner\u016f. Cluster se skl\u00e1d\u00e1 z n\u011bkolika uzl\u016f. Je p\u0159itom spravovan\u00fd, stabiln\u00ed a velmi kontrolovateln\u00fd.<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/lamoda\/blog\/451644\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u0410\u0433\u0430\u043b\u0435\u0446\u043a\u0438\u0439. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0442\u0438\u043c\u043b\u0438\u0434\u043e\u043c \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 Lamoda. \u0412 2018 \u0433\u043e\u0434\u0443 \u044f \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u043b \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 HighLoad++, \u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0445\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443 \u0441\u0432\u043e\u0435\u0433\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430. \u041c\u043e\u044f \u0442\u0435\u043c\u0430 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u043e\u043f\u044b\u0442\u0443 \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043f\u043e \u0434\u0435\u043f\u043b\u043e\u044e \u0441\u0438\u0441\u0442\u0435\u043c \u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u043d\u0430\u0448\u0438\u0445 \u0434\u043e\u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u0440\u0435\u043c\u0435\u043d, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u0435\u043f\u043b\u043e\u0438\u043b\u0438 \u0432\u0441\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":25343,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-33654","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=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u0410\u0433\u0430\u043b\u0435\u0446\u043a\u0438\u0439. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0442\u0438\u043c\u043b\u0438\u0434\u043e\u043c \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 Lamoda.\" \/>\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\/deploj-prilozhenij-v-vm-nomad-i-kubernetes\" \/>\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\u0414\u0435\u043f\u043b\u043e\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 VM, Nomad \u0438 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u0410\u0433\u0430\u043b\u0435\u0446\u043a\u0438\u0439. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0442\u0438\u043c\u043b\u0438\u0434\u043e\u043c \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 Lamoda.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/deploj-prilozhenij-v-vm-nomad-i-kubernetes\" \/>\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=\"2019-10-31T18:53:58+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:53:58+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\udd47Nasazen\u00ed aplikac\u00ed ve VM, Nomad a Kubernetes | ProHoster","description":"Ahoj v\u0161ichni! Jmenuji se Pavel Agaletsky. Pracuji jako t\u00fdmov\u00fd vedouc\u00ed v t\u00fdmu, kter\u00fd vyv\u00edj\u00ed doru\u010dovac\u00ed syst\u00e9m Lamoda.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/deploj-prilozhenij-v-vm-nomad-i-kubernetes","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\u0414\u0435\u043f\u043b\u043e\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 VM, Nomad \u0438 Kubernetes | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u0410\u0433\u0430\u043b\u0435\u0446\u043a\u0438\u0439. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0442\u0438\u043c\u043b\u0438\u0434\u043e\u043c \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 Lamoda.","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/deploj-prilozhenij-v-vm-nomad-i-kubernetes","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":"2019-10-31T18:53:58+00:00","article:modified_time":"2019-10-31T18:53:58+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"33654","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":"2026-02-08 20:38:40","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:36:34","updated":"2026-02-08 20:38:40","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\/33654","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=33654"}],"version-history":[{"count":2,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/33654\/revisions"}],"predecessor-version":[{"id":157982,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/33654\/revisions\/157982"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/25343"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=33654"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=33654"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=33654"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}