{"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\/da\/blog\/administrirovanie\/deploj-prilozhenij-v-vm-nomad-i-kubernetes","title":{"rendered":"Udrift af applikationer i VM, Nomad og Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hej alle sammen! Mit navn er Pavel Agaletskiy. Jeg arbejder som teamleder i det hold, der udvikler Lamoda leveringssystem. I 2018 talte jeg p\u00e5 konferencen HighLoad++, og i dag vil jeg pr\u00e6sentere en gennemgang af mit opl\u00e6g.<\/p>\n<p>Mit emne handler om vores virksomheds erfaring med at deployere systemer og tjenester i forskellige milj\u00f8er. Fra vores pr\u00e6historiske tid, hvor vi deployerede alle systemer p\u00e5 almindelige virtuelle servere, til den gradvise overgang fra Nomad til deployment i Kubernetes. Jeg vil fort\u00e6lle om, hvorfor vi gjorde det, og hvilke problemer vi st\u00f8dte p\u00e5 i processen.<\/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=\"Afspil 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>Udrift af applikationer p\u00e5 VM<\/h1>\n<p>\nLad os starte med, at for 3 \u00e5r siden blev alle virksomhedens systemer og tjenester deployeret p\u00e5 almindelige virtuelle servere. Teknisk set var det organiseret s\u00e5dan, at al kode fra vores systemer blev gemt og samlet ved hj\u00e6lp af automatiske buildprocesser via Jenkins. Med Ansible blev det derefter rullet ud fra vores versionskontrolsystem til de virtuelle servere. Hver system, der var i vores virksomhed, blev deployeret p\u00e5 mindst 2 servere: en p\u00e5 head og den anden p\u00e5 tail. Disse to systemer var fuldst\u00e6ndig identiske i alle deres indstillinger, kapaciteter, konfigurationer osv. Forskellen mellem dem var kun, at head modtog brugertrafik, mens tail aldrig modtog brugertrafik. <\/p>\n<p>Hvorfor blev dette gjort? <\/p>\n<p>N\u00e5r vi deployerede nye versioner af vores applikation, \u00f8nskede vi at sikre en s\u00f8ml\u00f8s udrulning, det vil sige uden m\u00e6rkbare konsekvenser for brugerne. Dette blev opn\u00e5et ved, at den nyeste byggede version blev rullet ud til tail med Ansible. Her kunne folk, der arbejdede med deployment, kontrollere og sikre, at alt var i orden: alle metrics, sektioner og applikationer fungerede; de n\u00f8dvendige scripts blev startet. F\u00f8rst efter at de havde sikret sig, at alt var okay, blev trafikken skiftet. Den begyndte at g\u00e5 til den server, der tidligere var tail. Den, der tidligere var head, forblev uden brugertrafik, men med den tidligere version af vores applikation.<\/p>\n<p>Dermed var det s\u00f8ml\u00f8st for brugerne. Fordi skiftet er \u00f8jeblikkeligt, da det blot kr\u00e6ver en omskiftning af balanceringssystemet. Det er meget nemt at rulle tilbage til den tidligere version ved blot at skifte balanceringssystemet tilbage. Vi kunne ogs\u00e5 bekr\u00e6fte applikationens evne i produktion, inden brugertrafikken begyndte, hvilket var ganske praktisk. <\/p>\n<p>Hvilke fordele s\u00e5 vi i alt dette?<\/p>\n<ol>\n<li>F\u00f8rst og fremmest fungerer det ganske godt. <b>Det er tydeligt for alle, hvordan en s\u00e5dan deployeringsmodel fungerer, fordi de fleste mennesker har deployeret p\u00e5 almindelige virtuelle servere.<\/b> Det er ganske<\/li>\n<li>p\u00e5lideligt <b>, da deployeringsteknologien er enkel og er blevet testet af tusinder af virksomheder. Millioner af servere bliver deployeret p\u00e5 denne m\u00e5de. Det er sv\u00e6rt at \u00f8del\u00e6gge noget.<\/b>Og endelig kunne vi f\u00e5 <\/li>\n<li>atomiske deployment <b>. Deployeringer, der for brugerne finder sted \u00f8jeblikkeligt, uden m\u00e6rkbare skift mellem den gamle version og den nye.<\/b>Men vi s\u00e5 ogs\u00e5 nogle ulemper i alt dette: <\/li>\n<\/ol>\n<p>\nUdover produktionsmilj\u00f8et og udviklingsmilj\u00f8et er der ogs\u00e5 andre milj\u00f8er. For eksempel QA og pre-produktion. P\u00e5 det tidspunkt havde vi mange servere og omkring 60 tjenester. Af denne grund m\u00e5tte vi <\/p>\n<ol>\n<li>opretholde den relevante version <b>af den virtuelle maskine for hver tjeneste. Hvis du vil opdatere biblioteker eller installere nye afh\u00e6ngigheder, skal du g\u00f8re det i alle milj\u00f8er. Det var ogs\u00e5 n\u00f8dvendigt at synkronisere tidspunktet, n\u00e5r du planl\u00e6gger at deployere den n\u00e6ste nye version af din applikation, med tidspunktet, hvor DevOps udf\u00f8rer de n\u00f8dvendige indstillinger af milj\u00f8et. Dette kan nemt f\u00f8re til situationer, hvor vores milj\u00f8er adskiller sig merkbart fra hinanden i alle de efterf\u00f8lgende milj\u00f8er. For eksempel kan QA-milj\u00f8et have en version af bibliotekerne, mens produktionen har en anden, hvilket kan f\u00f8re til problemer. <\/b>Sv\u00e6rhedsgraden ved at opdatere afh\u00e6ngighederne <\/li>\n<li><b>af din applikation. Det afh\u00e6nger ikke af dig, men af et andet team. Nemlig DevOps-teamet, som underst\u00f8tter serverne. Du skal give dem den passende opgave og give en beskrivelse af, hvad du \u00f8nsker at g\u00f8re.<\/b> af din applikation. Dette afh\u00e6nger ikke af dig, men af et andet team. Mere pr\u00e6cist af devops-teamet, som underst\u00f8tter serverne. Du skal give dem den opgave, der er relevant, og give en beskrivelse af, hvad du \u00f8nsker at g\u00f8re.<\/li>\n<li>P\u00e5 det tidspunkt \u00f8nskede vi ogs\u00e5 at opdele vores store monolitter i separate, mindre services, da vi kunne se, at antallet ville stige. P\u00e5 det tidspunkt havde vi allerede mere end 100 af dem. Det var n\u00f8dvendigt at oprette en ny virtuel maskine for hver ny service, som ogs\u00e5 skulle vedligeholdes og deployeres. Derudover kr\u00e6vede det ikke bare \u00e9n maskine, men mindst to. Dertil kom ogs\u00e5 QA-milj\u00f8et. Dette skaber problemer og g\u00f8r opbygningen og lanceringen af nye systemer mere <b>kompliceret, kostbart og tidskr\u00e6vende.<\/b><\/li>\n<\/ol>\n<p>\nDerfor besluttede vi, at det ville v\u00e6re mere praktisk at g\u00e5 fra at deployere almindelige virtuelle maskiner til at deployere vores applikationer i Docker-containere. N\u00e5r man har Docker, er der behov for et system, der kan k\u00f8re applikationen i et cluster, fordi man ikke bare kan starte en container. Man vil normalt gerne overv\u00e5ge, hvor mange containere der er k\u00f8rende, s\u00e5 de kan starte automatisk. Derfor var vi n\u00f8dt til at v\u00e6lge et administrationssystem. <\/p>\n<p>Vi overvejede l\u00e6nge, hvilken en vi kunne v\u00e6lge. Problemet var, at p\u00e5 det tidspunkt var vores deploy-stack p\u00e5 almindelige virtuelle servere lidt for\u00e6ldet, da der var nogle ikke s\u00e5 opdaterede versioner af operativsystemerne. P\u00e5 et tidspunkt k\u00f8rte vi endda FreeBSD, som var lidt besv\u00e6rligt at vedligeholde. Vi inds\u00e5, at vi hurtigst muligt skulle migrere til Docker. Vores DevOps-team kiggede p\u00e5 deres eksisterende erfaring med forskellige l\u00f8sninger og valgte et system som Nomad. <\/p>\n<h1>Overgangen til Nomad<\/h1>\n<p>\nNomad er et produkt fra virksomheden \u201cHashiCorp\u201d. De er ogs\u00e5 kendt for deres andre l\u00f8sninger:<\/p>\n<p><img decoding=\"async\" alt=\"Udrift af applikationer i VM, Nomad og Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/25dfbfe20b92f6e6865bdd8a2f15d8fa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>\u00abConsul\u00bb<\/b> \u2014 et v\u00e6rkt\u00f8j til service discovery.<\/p>\n<p><b>\u00abTerraform\u00bb<\/b> \u2014 et system til serveradministration, der giver dig mulighed for at konfigurere dem via en konfiguration, s\u00e5kaldt infrastructure-as-code.<\/p>\n<p><b>\u00abVagrant\u00bb<\/b> giver dig mulighed for at deployere virtuelle maskiner lokalt eller i skyen ved hj\u00e6lp af specifikke konfigurationsfiler. <\/p>\n<p>Nomad virkede p\u00e5 det tidspunkt som en forholdsvis enkel l\u00f8sning, som man hurtigt kunne skifte til uden at \u00e6ndre hele infrastrukturen. Desuden er det let at l\u00e6re. Derfor valgte vi det som vores system til styring af containere. <\/p>\n<p>Hvad skal der til for overhovedet at deployere dit system i Nomad? <\/p>\n<ol>\n<li>F\u00f8rst og fremmest har du brug for en <b>docker image<\/b> din applikation. Du skal samle den og placere den i et Docker-billedlager. I vores tilf\u00e6lde er det Artifactory \u2013 et system, der giver mulighed for at pushe forskellige typer artefakter ind i det. Den kan gemme arkiver, Docker-billeder, PHP Composer-pakker, NPM-pakker og s\u00e5 videre. <\/li>\n<li>Det er ogs\u00e5 n\u00f8dvendigt<b> konfigurationsfilen<\/b>, som vil fort\u00e6lle Nomad hvad, hvor hen, og i hvilken m\u00e6ngde du \u00f8nsker at deployere. <\/li>\n<\/ol>\n<p>\nN\u00e5r vi taler om Nomad, bruger den HCL-sprog (HashiCorp Configuration Language) som formatet for konfigurationsfilen, hvilket st\u00e5r for <i>HashiCorp Configuration Language<\/i>. Det er et superset af YAML, som g\u00f8r det muligt at beskrive din service i Nomads termer. <\/p>\n<p><img decoding=\"async\" alt=\"Udrift af applikationer i VM, Nomad og Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/bee3d1feedd52249c4325d8a3984a766.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet lader dig angive, hvor mange containere du vil deployere, fra hvilke billeder der skal sendes forskellige parametre ved deployering. P\u00e5 den m\u00e5de fodrer du denne Nomad-fil ind, og den starter containerne i produktionen i overensstemmelse med den. <\/p>\n<p>I vores tilf\u00e6lde inds\u00e5 vi, at det ville v\u00e6re upraktisk at skrive fuldst\u00e6ndig ens HCL-filer til hver service, fordi der er mange services, og nogle gange \u00f8nsker man at opdatere dem. Der er tilf\u00e6lde, hvor en service ikke er deployeret i \u00e9t eksemplar, men i forskellige. For eksempel har et af systemerne, vi har i produktion, mere end 100 instanser i produktionen. De bliver startet fra de samme billeder, men adskiller sig med hensyn til konfigurationsindstillinger og konfigurationsfiler. <\/p>\n<p>Derfor besluttede vi, at det ville v\u00e6re praktisk at opbevare alle vores konfigurationsfiler til deployment i et f\u00e6lles repository. P\u00e5 den m\u00e5de blev de gennemskuelige: det var nemt at vedligeholde dem, og man kunne se, hvilke systemer vi har. I tilf\u00e6lde af behov var det heller ikke sv\u00e6rt at opdatere eller \u00e6ndre noget. At tilf\u00f8je et nyt system ville heller ikke v\u00e6re sv\u00e6rt \u2013 det var nok bare at oprette en konfigurationsfil inden for en ny mappe. Inde i den ligger filerne: service.hcl, som indeholder beskrivelsen af vores service, og nogle env-filer, som giver mulighed for at konfigurere denne service, n\u00e5r den er deployeret i produktionen. <\/p>\n<p><img decoding=\"async\" alt=\"Udrift af applikationer i VM, Nomad og Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/c0b0bdb763d3c3bb84fbc9e5dfecff82.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMen nogle af vores systemer er ikke deployeret i produktionen i \u00e9t eksemplar, men i flere p\u00e5 \u00e9n gang. Derfor besluttede vi, at det ville v\u00e6re praktisk for os at opbevare ikke konfigurationerne i ren form, men i deres skabelonform. Og som skabelonsprog valgte vi <i>jinja 2<\/i>. I dette format gemmer vi b\u00e5de konfigurationsfilerne til selve tjenesten samt de n\u00f8dvendige env-filer. <\/p>\n<p>Derudover har vi lagt et f\u00e6lles deploy-script i repository'et for alle projekter, som g\u00f8r det muligt at starte og deployere din tjeneste i produktion, i den \u00f8nskede milj\u00f8 og til det \u00f8nskede m\u00e5l. N\u00e5r vi har gjort vores HCL-konfig til en skabelon, ser den HCL-fil, der tidligere var en almindelig Nomad-konfiguration, anderledes ud.<\/p>\n<p><img decoding=\"async\" alt=\"Udrift af applikationer i VM, Nomad og Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/202472f109ba09798d592418b1774a29.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet vil sige, at vi har erstattet nogle variabelpladser i konfigurationen med inds\u00e6tninger af variabler, der hentes fra env-filer eller andre kilder. Derudover har vi f\u00e5et mulighed for at samle HCL-filer dynamisk, hvilket betyder, at vi ikke kun kan anvende almindelige variabelinds\u00e6tninger. Da jinja underst\u00f8tter l\u00f8kker og betingelser, kan der ogs\u00e5 laves konfigurationsfiler, der \u00e6ndrer sig afh\u00e6ngigt af, hvor du deployerer dine applikationer. <\/p>\n<p>For eksempel vil du deployere din tjeneste i pre-production og i produktion. Antag, at du ikke \u00f8nsker at k\u00f8re cron-scripts i pre-production, men blot \u00f8nsker at se tjenesten p\u00e5 et separat dom\u00e6ne for at sikre dig, at den fungerer. For alle, der deployerer en tjeneste, er processen meget simpel og gennemsigtig. Du skal blot udf\u00f8re filen deploy.sh, angive hvilken tjeneste du vil deployere, og til hvilket m\u00e5l. For eksempel, hvis du vil deploye et system til Rusland, Hviderusland eller Kasakhstan. Det er tilstr\u00e6kkeligt at \u00e6ndre en af parametrene, og du f\u00e5r den korrekte konfigurationsfil samlet. <\/p>\n<p>N\u00e5r Nomad-tjenesten allerede er deployeret til dit cluster, ser den s\u00e5dan ud.<\/p>\n<p><img decoding=\"async\" alt=\"Udrift af applikationer i VM, Nomad og Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/60e2e2b5502936809d643d73c6d853e2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFor det f\u00f8rste har du brug for en eller anden extern balancer, som vil modtage al brugertrafik. Den vil arbejde sammen med Consul og finde ud af, hvor, p\u00e5 hvilken node, der ligger en specifik tjeneste, som svarer til et bestemt dom\u00e6nenavn. Tjenester i Consul dukker op fra selve Nomad. Da disse produkter kommer fra samme virksomhed, er de godt integreret med hinanden. Man kan sige, at Nomad fra starten er i stand til at registrere alle tjenester, der k\u00f8res i det, i Consul. <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/da\/lir\/ipv4\/\"   title=\"IP-adressen\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"585\">IP-adressen<\/a> for som n\u00e6vnt tidligere. <\/p>\n<p>N\u00e5r din eksterne load balancer har fundet ud af, hvilken service den skal sende trafikken til, omdirigerer den den til den relevante container eller flere containere, der svarer til din applikation. Det er selvf\u00f8lgelig n\u00f8dvendigt ogs\u00e5 at t\u00e6nke p\u00e5 sikkerheden. Selvom alle services k\u00f8rer p\u00e5 de samme virtuelle maskiner i containere, er det typisk n\u00f8dvendigt at forhindre fri adgang fra en service til en anden. Vi har opn\u00e5et dette gennem segmentering. Hver service blev k\u00f8rt i sit eget virtuelle netv\u00e6rk, hvor der var fastlagt routingregler samt regler for tilladelse\/afvisning af adgang til andre systemer og services. De kunne v\u00e6re b\u00e5de inden for denne klynge og uden for den. For eksempel, hvis du \u00f8nsker at forbyde en service at oprette forbindelse til en bestemt database, kan dette g\u00f8res ved at segmentere p\u00e5 netv\u00e6rksniveau. S\u00e5ledes kan du ikke ved en fejltagelse forbinde fra testmilj\u00f8et til din produktionsdatabase.<\/p>\n<p>Hvad kostede overgangen i form af menneskelige ressourcer? <\/p>\n<p>Overgangen af hele virksomheden til Nomad tog cirka 5-6 m\u00e5neder. Vi overgik service for service, men i et ret hurtigt tempo. Hver team skulle oprette sine egne containere til services. <\/p>\n<p>Vi har en tilgang, hvor hvert team selv er ansvarlig for docker images af deres systemer. DevOps leverer den f\u00e6lles infrastruktur, der er n\u00f8dvendig for deployment, dvs. support til selve klyngen, support til CI-systemet osv. P\u00e5 det tidspunkt var mere end 60 systemer flyttet til Nomad, og vi havde omkring 2000 containere. <\/p>\n<p>DevOps er ansvarlige for den f\u00e6lles infrastruktur vedr\u00f8rende deployment og servere. Hver udviklingsteam er derimod ansvarlig for implementeringen af containere til deres specifikke system, da det er teamet, der ved, hvad de rent faktisk har brug for i den eller den container.<\/p>\n<h1>\u00c5rsager til at sige nej til Nomad<\/h1>\n<p>\nHvilken fordel har vi opn\u00e5et ved at skifte til deployment gennem Nomad og Docker?<\/p>\n<ol>\n<li>Vi<b> ensartede betingelser<\/b> til alle milj\u00f8er. I udvikling, QA-milj\u00f8et, pre-production og produktion anvendes de samme containerbilleder med de samme afh\u00e6ngigheder. Derfor har du praktisk talt ingen chance for, at det, der kommer i produktion, ikke er det, du tidligere har testet lokalt eller i et testmilj\u00f8. <\/li>\n<li>Vi har ogs\u00e5 fundet ud af, at det er tilstr\u00e6kkeligt <b>let at tilf\u00f8je en ny service<\/b>. Enhver ny system kan deployeres meget enkelt. Det er nok at g\u00e5 til det repository, der opbevarer konfigurationer, tilf\u00f8je en ny konfig til dit system, og s\u00e5 er du klar. Du kan deploye dit system i produktion uden yderligere anstrengelser fra devops. <\/li>\n<li>Alle <b>konfigurationsfiler<\/b> i et f\u00e6lles repository <b>blev gennemg\u00e5et<\/b>. P\u00e5 det tidspunkt, hvor vi deployede vores systemer med <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/da\/vps\/\"   title=\"virtuele servere\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"791\">virtuele servere<\/a>, brugte vi Ansible, hvor konfigurationerne l\u00e5 i det samme repository. Men for de fleste udviklere var det lidt sv\u00e6rere at arbejde med. M\u00e6ngden af konfigurationer og kode, du skal tilf\u00f8je for at deploye en service, blev meget mindre. Derudover var det meget nemt for devops at rette eller \u00e6ndre den. I tilf\u00e6lde af overgange, for eksempel til en ny version af Nomad, kunne de massivt opdatere alle operationsfiler, der l\u00e5 p\u00e5 det samme sted.<\/li>\n<\/ol>\n<p>\nMen vi st\u00f8dte ogs\u00e5 p\u00e5 nogle ulemper: <\/p>\n<p>Det viste sig, at vi <b>ikke kunne opn\u00e5 glidende deployment <\/b>i tilf\u00e6lde af Nomad. Ved udrulningen af containere fra forskellige milj\u00f8er kunne det ske, at den blev startet, og Nomad opfattede den som klar til at modtage trafik. Dette skete, f\u00f8r applikationen indeni n\u00e5ede at starte op. Af denne grund begyndte systemet i en kort periode at give 500-fejl, fordi trafikken begyndte at g\u00e5 til en container, der endnu ikke var klar til at modtage den. <\/p>\n<p>Vi st\u00f8dte p\u00e5 nogle <b>fejl<\/b>. Den mest v\u00e6sentlige bug er, at Nomad ikke h\u00e5ndterer store klynger s\u00e6rligt godt, hvis du har mange systemer og containere. N\u00e5r du \u00f8nsker at s\u00e6tte \u00e9n af serverne i vedligeholdelse, som er inkluderet i Nomad-klyngen, er der en betydelig risiko for, at klyngen ikke fungerer optimalt og falder fra hinanden. En del containere kan for eksempel falde ned og ikke komme op igen \u2014 dette vil koste dig meget, hvis alle dine systemer i produktion pr\u00e6cist er i klyngen, der styres af Nomad. <\/p>\n<p>Derfor besluttede vi at overveje, hvilken retning vi skulle g\u00e5 i fremover. P\u00e5 det tidspunkt blev vi meget bedre til at forst\u00e5, hvad vi \u00f8nskede at opn\u00e5. Nemlig: vi \u00f8nsker p\u00e5lidelighed, lidt flere funktioner end hvad Nomad tilbyder, og et mere modent, mere stabilt system. <\/p>\n<p>I denne henseende valgte vi Kubernetes som den mest popul\u00e6re platform til at k\u00f8re klynger. Is\u00e6r givet at st\u00f8rrelsen og antallet af vores containere var ret store. Til s\u00e5danne form\u00e5l syntes Kubernetes at v\u00e6re det mest passende system blandt dem, vi kunne se p\u00e5. <\/p>\n<h1>Overgangen til Kubernetes<\/h1>\n<p>\nLad mig kort fort\u00e6lle om de grundl\u00e6ggende begreber i Kubernetes og hvordan de adskiller sig fra Nomad. <\/p>\n<p><img decoding=\"async\" alt=\"Udrift af applikationer i VM, Nomad og Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/5723a69309f387e6cc6c5959b62ca18b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nF\u00f8rst og fremmest er det mest basale begreb i Kubernetes begrebet pod. <b>Pod<\/b> \u2014 det er en gruppe af en eller flere containere, der altid k\u00f8rer sammen. Og de fungerer som om, de altid strengt k\u00f8rer p\u00e5 \u00e9n virtuel maskine. De kan tilg\u00e5 hinanden via IP-adressen 127.0.0.1 p\u00e5 forskellige porte. <\/p>\n<p>Lad os antage, at du har en PHP-applikation, der best\u00e5r af nginx og php-fpm \u2013 en klassisk ops\u00e6tning. Du vil sandsynligvis have, at b\u00e5de nginx og php-fpm containere altid skal v\u00e6re sammen. Kubernetes g\u00f8r det muligt at opn\u00e5 dette ved at beskrive dem som en f\u00e6lles pod. Det var netop dette, vi ikke kunne opn\u00e5 med Nomad.<\/p>\n<p>Det n\u00e6ste begreb er <b>deployment<\/b>. Faktisk er pod'en i sig selv en efem\u00e6r ting, den starter og forsvinder. Vil du f\u00f8rst dr\u00e6be alle dine tidligere containere og derefter starte nye versioner med det samme, eller vil du udrulle dem gradvist \u2013 dette er pr\u00e6cist det, som begrebet deployment ansvarer for. Det beskriver, hvordan du implementerer dine pods, i hvilken m\u00e6ngde, og hvordan de opdateres. <\/p>\n<p>Det tredje begreb er <b>service<\/b>. Din service er faktisk dit system, som modtager en vis trafik og derefter sender det til en eller flere pods, der svarer til din service. Det betyder, at det tillader at angive, at al indg\u00e5ende trafik til en given service med et bestemt navn skal sendes til netop disse pods. Og samtidig sikrer det, at du f\u00e5r trafikbalance. Det vil sige, at du kan k\u00f8re to pods af din applikation, og al indg\u00e5ende trafik vil blive j\u00e6vnt fordelt mellem de relevante pods til denne service.<\/p>\n<p>Og det fjerde grundl\u00e6ggende begreb \u2014 <b>Ingress<\/b>. Det er en service, der k\u00f8rer i Kubernetes-klusteret. Den fungerer som en ekstern belastningsfordeler, der modtager alle foresp\u00f8rgsler. Gennem Kubernetes API kan Ingress bestemme, hvor disse foresp\u00f8rgsler skal sendes. Desuden g\u00f8r den dette meget fleksibelt. Du kan sige, at alle foresp\u00f8rgsler til denne v\u00e6rt og den p\u00e5g\u00e6ldende URL skal sendes til denne service. Og disse foresp\u00f8rgsler, der kommer til denne v\u00e6rt og en anden URL, skal sendes til en anden service. <\/p>\n<p>Det mest fantastiske for den, der udvikler applikationen, er, at du har mulighed for at styre det hele selv. Ved at angive Ingress-konfigurationen kan du sende al trafik, der kommer til en bestemt API, til separate containere, der f.eks. er skrevet i Go. Og denne trafik, der kommer til den samme dom\u00e6ne, men til en anden URL, kan sendes til containere, der er skrevet i PHP, hvor der er meget logik, men de er ikke s\u00e5 hurtige.<\/p>\n<p>Hvis man sammenligner alle disse begreber med Nomad, kan man sige, at de f\u00f8rste tre begreber er samlet i en Service. Det sidste begreb findes ikke i Nomad. Vi brugte en ekstern belastningsfordeler til dette form\u00e5l: det kan v\u00e6re haproxy, nginx, nginx+ osv. I tilf\u00e6ldet med Kubernetes beh\u00f8ver du ikke at introducere dette begreb separat. Men hvis du ser p\u00e5 Ingress indeni, s\u00e5 er det enten nginx, haproxy eller traefik, men som ombygget inden for Kubernetes. <\/p>\n<p>Alle de begreber, jeg har beskrevet, er i realiteten ressourcer, der eksisterer inden for Kubernetes-klusteret. For at beskrive dem i Kubernetes bruges yaml-formatet, som er mere l\u00e6sbart og velkendt end HCL-filer i tilf\u00e6lde af Nomad. Men strukturelt beskriver de f.eks. pods det samme. De siger \u2013 jeg \u00f8nsker at implementere s\u00e5danne pods derhen, med s\u00e5danne billeder, i s\u00e5danne m\u00e6ngder. <\/p>\n<p><img decoding=\"async\" alt=\"Udrift af applikationer i VM, Nomad og Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/13836e7474b377a5e6b05112a53bfedd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDerudover inds\u00e5 vi, at vi ikke \u00f8nskede at oprette hver enkelt ressource manuelt: deployment, tjenester, Ingress og mere. I stedet \u00f8nskede vi at beskrive hvert system, vi har, i form af Kubernetes, s\u00e5 vi ikke skulle oprette alle n\u00f8dvendige ressourceafh\u00e6ngigheder manuelt i den rigtige r\u00e6kkef\u00f8lge. Som et s\u00e5dant system, der gjorde dette muligt, blev Helm valgt. <\/p>\n<h1>Grundl\u00e6ggende begreber i Helm<\/h1>\n<p>\nHelm er <b>pakkeh\u00e5ndtering<\/b> til Kubernetes. Det ligner, hvordan package managers fungerer i programmeringssprog. De giver dig mulighed for at gemme en service, der best\u00e5r f.eks. af deployment nginx, deployment php-fpm, konfiguration for Ingress, configmaps (dette er en enhed, der g\u00f8r det muligt at definere env og andre parametre for dit system) i form af s\u00e5kaldte charts. Samtidig fungerer Helm <b>ovenfor Kubernetes<\/b>. S\u00e5 det er ikke et system, der st\u00e5r uafh\u00e6ngigt, men blot en anden service, der k\u00f8rer inden for klynge. Du interagerer med det gennem dets API ved hj\u00e6lp af kommandolinje. Dets bekvemmelighed og sk\u00f8nhed ligger i, at selvom Helm skulle g\u00e5 ned, eller du sletter det fra klyngen, s\u00e5 forsvinder dine tjenester ikke, da Helm i bund og grund kun fungerer som en opstart af systemet. Det er Kubernetes, der herefter st\u00e5r for driften og tilstanden af tjenesterne. <\/p>\n<p>Vi inds\u00e5 ogs\u00e5, at <b>skabelonbehandling<\/b>, som vi tidligere var n\u00f8dt til at implementere manuelt ved at integrere jinja i vores konfigurationer, er en af Helm's grundl\u00e6ggende funktioner. Alle konfigurationer, du laver til dine systemer, gemmes i Helm som skabeloner, der ligner en smule p\u00e5 jinja, men som i virkeligheden bruger skabelonbehandling af sproget Go, som Helm er skrevet i, ligesom Kubernetes. <\/p>\n<p>Helm tilf\u00f8jer os endnu et par yderligere begreber. <\/p>\n<p><b>Chart<\/b> \u2014 er beskrivelsen af din service. I andre package managers ville det blive kaldt et package, bundle eller noget lignende. Her kaldes det chart. <\/p>\n<p><b>Values <\/b>\u2013 er de variabler, som du \u00f8nsker at bruge til at samle dine konfigurationer fra skabeloner. <\/p>\n<p><b>Release<\/b>Hver gang en service, der deployeres med helm, modtager en inkrementel version af udgivelsen. Helm husker, hvordan konfigurationen af servicen var ved den tidligere, forrige udgivelse og s\u00e5 videre. Derfor er det nok at udf\u00f8re kommandoen helm rollback med den tidligere version af udgivelsen. Selv hvis den tilsvarende konfiguration ikke er tilg\u00e6ngelig i dit repository p\u00e5 tidspunktet for rollback, husker helm stadig, hvordan den var, og vil gendanne dit system til den tilstand, det var i ved den tidligere udgivelse. <\/p>\n<p>N\u00e5r vi bruger helm, bliver de almindelige konfigurationer for Kubernetes ogs\u00e5 til skabeloner, hvor der er mulighed for at anvende variabler, funktioner og betingede operatorer. P\u00e5 den m\u00e5de kan du samle konfigurationen af din service afh\u00e6ngigt af milj\u00f8et.<\/p>\n<p><img decoding=\"async\" alt=\"Udrift af applikationer i VM, Nomad og Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/b70ba431211038eacf911ba3aee22363.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI praksis besluttede vi at h\u00e5ndtere det lidt anderledes, end vi gjorde med Nomad. Mens Nomad opbevarede b\u00e5de konfigurationer til deployment og n-variabler i et enkelt repository, valgte vi her at opdele dem i to separate repositories. I \"deploy\"-repositoryet opbevares kun n-variablerne, der er n\u00f8dvendige for deployment, mens konfigurationer eller charts opbevares i \"helm\"-repositoryet.<\/p>\n<p><img decoding=\"async\" alt=\"Udrift af applikationer i VM, Nomad og Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/4add11a8f9d9a9244127f0b07d027fa2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHvad har dette givet os? <\/p>\n<p>Selvom vi ikke opbevarer nogen virkelig f\u00f8lsomme data i selve konfigurationsfilerne, s\u00e5som adgangskoder til databaser, da de opbevares som secrets i Kubernetes, er der stadig enkelte ting, som vi ikke \u00f8nsker at give adgang til for alle. Derfor er adgangen til \"deploy\"-repositoryet mere begr\u00e6nset, mens \"helm\"-repositoryet indeholder blot beskrivelsen af servicen. Af denne grund kan adgangen til det gives p\u00e5 en sikker m\u00e5de til et bredere publikum. <\/p>\n<p>Da vi har ikke kun produktion, men ogs\u00e5 andre milj\u00f8er, kan vi med denne opdeling genbruge vores helm-charts til at deployere tjenester ikke bare i produktionen, men ogs\u00e5 for eksempel i QA-milj\u00f8et. Selv for at kunne udvikle dem lokalt ved at bruge <i>Minikube<\/i> \u2014 det er en ting til lokal k\u00f8rsel af Kubernetes. <\/p>\n<p>Inden for hver repository har vi opdelt i separate mapper for hver tjeneste. Det vil sige, at der inden for hver mappe findes skabeloner, der relaterer sig til den p\u00e5g\u00e6ldende chart og beskriver de ressourcer, der skal implementeres for at starte vores system. I repository'et 'deploy' har vi kun efterladt milj\u00f8variabler. I dette tilf\u00e6lde valgte vi ikke at bruge skabelonisering med jinja, fordi helm selv tilbyder skabelonisering som standard \u2013 det er en af dens prim\u00e6re funktioner. <\/p>\n<p>Vi har efterladt et script til implementering \u2013 deploy.sh, som forenkler og standardiserer opstarten til implementering med helm. Dermed ser deploy-gr\u00e6nsefladen for alle, der \u00f8nsker at implementere, n\u00f8jagtig ud som den gjorde i tilf\u00e6lde af implementering via Nomad. Den samme deploy.sh, navnet p\u00e5 din tjeneste, og hvor du \u00f8nsker at implementere den. Dette medf\u00f8rer, at helm k\u00f8rer indeni. Det indsamler konfigurationer fra skabeloner, erstatter dem med de n\u00f8dvendige v\u00e6rdifiler, og derefter implementerer det ved at kaste dem ind i Kubernetes. <\/p>\n<h1>Konklusioner<\/h1>\n<p>\nKubernetes-tjenesten ser mere kompleks ud end Nomad. <\/p>\n<p><img decoding=\"async\" alt=\"Udrift af applikationer i VM, Nomad og Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/5a9b5636ab4721acde096fea986ba38b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHer kommer den udg\u00e5ende trafik til Ingress. Det er netop frontcontrolleren, der modtager alle foresp\u00f8rgsler og derefter sender dem til de relevante tjenester i henhold til foresp\u00f8rgslen. Den bestemmer dem baseret p\u00e5 konfigurationer, som er en del af beskrivelsen af din applikation i helm, og som udviklerne selv angiver. Tjenesten sender foresp\u00f8rgsler til sine pods, det vil sige specifikke containere, og balancerer den indg\u00e5ende trafik mellem alle de containere, der h\u00f8rer til den p\u00e5g\u00e6ldende tjeneste. Og selvf\u00f8lgelig skal vi ikke glemme, at vi ikke b\u00f8r g\u00e5 p\u00e5 kompromis med sikkerheden p\u00e5 netv\u00e6rksniveau. Derfor fungerer segmenteringen i Kubernetes-klyngen, som er baseret p\u00e5 tagging. Alle tjenester har bestemte tags, som er knyttet til adgangen til bestemte eksterne\/intern ressourcer inden for eller uden for klyngen. <\/p>\n<p>Ved overgangen opdagede vi, at Kubernetes har alle funktioner, som Nomad, som vi tidligere brugte, og tilf\u00f8jer mange nye muligheder. Det kan udvides gennem plugins, og faktisk gennem brugerdefinerede ressourcearter. Det vil sige, at du ikke kun kan bruge de standardressourcer, der f\u00f8lger med Kubernetes, men ogs\u00e5 skabe dine egne ressourcer og tjenester, der kan l\u00e6se dem. Dette giver ekstra muligheder for at udvide dit system uden behov for at geninstallere Kubernetes og uden n\u00f8dvendigheden af \u00e6ndringer. <\/p>\n<p>Et eksempel p\u00e5 en s\u00e5dan anvendelse er Prometheus, som k\u00f8rer inde i vores Kubernetes-kluster. For at det kan begynde at samle metrics fra en given tjeneste, skal vi tilf\u00f8je en ekstra ressourcetype i tjenestens beskrivelse, s\u00e5kaldt service-monitor. Takket v\u00e6re Prometheus' evne til at l\u00e6se brugerdefinerede ressourcearter, n\u00e5r det k\u00f8rer i Kubernetes, begynder det automatisk at indsamle metrics fra det nye system. Det er bastante praktisk. <\/p>\n<p>Den f\u00f8rste deployment, vi lavede i Kubernetes, var i marts 2018. Og i denne periode har vi aldrig haft problemer med det. Det fungerer stabilt uden betydelige fejl. Derudover kan vi udvide det yderligere. I dag er de tilg\u00e6ngelige funktioner tilstr\u00e6kkelige til vores behov, og vi er meget tilfredse med udviklingshastigheden i Kubernetes. I \u00f8jeblikket er der mere end 3000 containere i Kubernetes. Klustret str\u00e6kker sig over flere noder. Det er servicevenligt, stabilt og let at kontrollere.<br \/>\n<br \/>Kilde: <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\/da\/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=\"da_DK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\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\/da\/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\udd47Deployment af applikationer i VM, Nomad og Kubernetes | ProHoster","description":"Hej alle sammen! Jeg hedder Pavel Agaletsky. Jeg arbejder som teamleder i det team, der udvikler Lamodas leveringssystem.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/deploj-prilozhenij-v-vm-nomad-i-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/33654","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=33654"}],"version-history":[{"count":2,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/33654\/revisions"}],"predecessor-version":[{"id":157982,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/33654\/revisions\/157982"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/25343"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=33654"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=33654"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=33654"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}