{"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\/de\/blog\/administrirovanie\/deploj-prilozhenij-v-vm-nomad-i-kubernetes","title":{"rendered":"Deployment von Anwendungen in VM, Nomad und Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo zusammen! Mein Name ist Pawel Agaletski. Ich arbeite als Teamleiter in dem Team, das das Liefersystem von Lamoda entwickelt. Im Jahr 2018 habe ich auf der Konferenz HighLoad++ gesprochen und heute m\u00f6chte ich die Aufzeichnung meines Vortrags vorstellen.<\/p>\n<p>Mein Thema befasst sich mit der Erfahrung unseres Unternehmens beim Deployment von Systemen und Services in verschiedene Umgebungen. Angefangen in unseren pr\u00e4historischen Zeiten, als wir alle Systeme auf regul\u00e4ren virtuellen Servern deployten, bis hin zum schrittweisen \u00dcbergang von Nomad zum Deployment in Kubernetes. Ich werde erz\u00e4hlen, warum wir das gemacht haben und welche Probleme wir dabei hatten.<\/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=\"Video abspielen\" 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>Deployment von Anwendungen auf VM<\/h1>\n<p>\nBeginnen wir damit, dass vor drei Jahren alle Systeme und Services des Unternehmens auf regul\u00e4ren virtuellen Servern deployed wurden. Technisch war es so organisiert, dass der gesamte Code unserer Systeme durch automatisierte Builds mit Jenkins erstellt wurde. \u00dcber Ansible wurde dieser Code aus unserem Versionskontrollsystem auf die virtuellen Server verteilt. Dabei wurde jedes System, das wir in unserem Unternehmen hatten, mindestens auf 2 Servern deployed: einer davon war der Head, der andere der Tail. Diese beiden Systeme waren in allen ihren Einstellungen, Leistung, Konfiguration und anderem absolut identisch. Der einzige Unterschied war, dass der Head den Benutzertraffic erhielt, w\u00e4hrend der Tail niemals Benutzertaffic erhielt. <\/p>\n<p>Warum wurde das gemacht? <\/p>\n<p>Als wir neue Releases unserer Anwendung deployten, wollten wir eine nahtlose Verteilung gew\u00e4hrleisten, das hei\u00dft, ohne sp\u00fcrbare Folgen f\u00fcr die Benutzer. Dies wurde dadurch erreicht, dass das neu compilierte Release mithilfe von Ansible auf den Tail ausgef\u00fchrt wurde. Dort konnten die Personen, die f\u00fcr das Deployment verantwortlich waren, \u00fcberpr\u00fcfen und sicherstellen, dass alles in Ordnung war: alle Metriken, Bereiche und Anwendungen funktionierten; die erforderlichen Skripte wurden gestartet. Erst nachdem sie sichergestellt hatten, dass alles in Ordnung war, wurde der Traffic umgeschaltet. Er begann auf denjenigen Server zu flie\u00dfen, der zuvor der Tail war. Und der Server, der zuvor der Head gewesen war, blieb ohne Benutzertraffic, behielt jedoch die vorherige Version unserer Anwendung auf ihm.<\/p>\n<p>So war es f\u00fcr die Nutzer nahtlos. Weil der Wechsel sofort erfolgt, da es einfach der Wechsel des Load Balancers ist. Man kann sehr leicht auf die vorherige Version zur\u00fcckrollen, indem man einfach den Load Balancer wieder zur\u00fcckschaltet. Au\u00dferdem konnten wir die Leistungsf\u00e4higkeit der Anwendung in der Produktion testen, noch bevor der Benutzerverkehr einsetzt, was sehr praktisch war. <\/p>\n<p>Welche Vorteile haben wir dabei gesehen?<\/p>\n<ol>\n<li>Zun\u00e4chst einmal, es funktioniert einfach <b>dann ist das klar.<\/b> Allen ist klar, wie ein solches Deployment-Schema funktioniert, weil die meisten Menschen irgendwann auf gew\u00f6hnliche virtuelle Server deployt haben.<\/li>\n<li>Es ist dann doch <b>zuverl\u00e4ssig<\/b>, da die Deployment-Technologie einfach ist und von Tausenden von Unternehmen erprobt wurde. Millionen von Servern werden genau so deployed. Es ist schwer, etwas kaputt zu machen. <\/li>\n<li>Und schlie\u00dflich konnten wir <b>atomare Deployments<\/b>realisieren. Deployments, die f\u00fcr die Nutzer gleichzeitig stattfinden, ohne einen sp\u00fcrbaren \u00dcbergang zwischen der alten und der neuen Version. <\/li>\n<\/ol>\n<p>\nAber dabei haben wir auch einige Nachteile festgestellt: <\/p>\n<ol>\n<li>Neben der Produktionsumgebung gibt es Entwicklungsumgebungen und andere Umgebungen. Zum Beispiel QA und Preproduction. Zu diesem Zeitpunkt hatten wir viele Server und etwa 60 Dienste. Aus diesem Grund mussten wir <b>f\u00fcr jeden Dienst die jeweils aktuelle Version <\/b>der virtuellen Maschine unterst\u00fctzen. Wenn Sie Bibliotheken aktualisieren oder neue Abh\u00e4ngigkeiten hinzuf\u00fcgen m\u00f6chten, m\u00fcssen Sie dies in allen Umgebungen tun. Au\u00dferdem musste die Zeit, wann Sie die n\u00e4chste neue Version Ihrer Anwendung deployen m\u00f6chten, mit dem Zeitpunkt synchronisiert werden, an dem DevOps die notwendigen Umgebungsanpassungen vornimmt. In einem solchen Fall kann man leicht in eine Situation geraten, in der die Umgebung in allen aufeinander folgenden Umgebungen leicht abweicht. Zum Beispiel k\u00f6nnten in der QA-Umgebung andere Bibliotheksversionen sein als in der Produktion, was zu Problemen f\u00fchren w\u00fcrde. <\/li>\n<li><b>Die Schwierigkeit bei der Aktualisierung von Abh\u00e4ngigkeiten<\/b> Ihrer Anwendung. Das h\u00e4ngt nicht von Ihnen ab, sondern von einem anderen Team. Genauer gesagt, vom DevOps-Team, das die Server betreut. Sie m\u00fcssen eine entsprechende Aufgabe f\u00fcr sie formulieren und eine Beschreibung dessen geben, was Sie erreichen m\u00f6chten.<\/li>\n<li>Zu diesem Zeitpunkt wollten wir auch unsere gro\u00dfen Monolithen in einzelne kleine Services aufteilen, da wir verstanden, dass es immer mehr werden w\u00fcrden. Zu diesem Zeitpunkt hatten wir bereits \u00fcber 100 davon. Es war erforderlich, f\u00fcr jeden neuen Service eine separate neue virtuelle Maschine zu erstellen, die ebenfalls gewartet und bereitgestellt werden musste. Dar\u00fcber hinaus ben\u00f6tigten wir nicht nur eine Maschine, sondern mindestens zwei. Hinzu kam noch eine QA-Umgebung. Das f\u00fchrt zu Problemen und macht die Erstellung und den Start neuer Systeme f\u00fcr Sie schwieriger. <b>Komplex, kostspielig und zeitaufw\u00e4ndig.<\/b><\/li>\n<\/ol>\n<p>\nDeshalb haben wir beschlossen, dass es bequemer w\u00e4re, vom Deployment traditioneller virtueller Maschinen auf das Deployment unserer Anwendungen in einem Docker-Container umzusteigen. Mit Docker ben\u00f6tigen Sie ein System, das die Anwendung im Cluster starten kann, da Sie einen Container nicht einfach so hochfahren k\u00f6nnen. Man m\u00f6chte normalerweise \u00fcberwachen, wie viele Container hochgefahren sind, damit sie automatisch hochgefahren werden. Aus diesem Grund mussten wir ein Verwaltungssystem ausw\u00e4hlen. <\/p>\n<p>Wir haben lange \u00fcberlegt, welches wir ausw\u00e4hlen sollten. Das Problem war, dass unser Deployment-Stack f\u00fcr herk\u00f6mmliche virtuelle Server zu diesem Zeitpunkt etwas veraltet war, da dort nicht die neuesten Versionen der Betriebssysteme verwendet wurden. Irgendwann war dort sogar FreeBSD installiert, was nicht sehr bequem zu warten war. Wir wussten, dass wir so schnell wie m\u00f6glich auf Docker migrieren m\u00fcssen. Unsere DevOps schauten auf ihre Erfahrungen mit verschiedenen L\u00f6sungen und w\u00e4hlten ein System wie Nomad. <\/p>\n<h1>Umstieg auf Nomad<\/h1>\n<p>\nNomad ist ein Produkt von HashiCorp. Sie sind auch bekannt f\u00fcr andere L\u00f6sungen:<\/p>\n<p><img decoding=\"async\" alt=\"Deployment von Anwendungen in VM, Nomad und Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/25dfbfe20b92f6e6865bdd8a2f15d8fa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>\u201eConsul\u201c<\/b> ist ein Tool f\u00fcr die Dienstentdeckung.<\/p>\n<p><b>\u201eTerraform\u201c<\/b> ist ein System zur Verwaltung von Servern, mit dem Sie diese \u00fcber Konfiguration, auch bekannt als infrastructure-as-code, einrichten k\u00f6nnen.<\/p>\n<p><b>\u201eVagrant\u201c<\/b> erm\u00f6glicht Ihnen das Bereitstellen von virtuellen Maschinen lokal oder in der Cloud durch bestimmte Konfigurationsdateien. <\/p>\n<p>Nomad erschien uns zu diesem Zeitpunkt als eine ausreichend einfache L\u00f6sung, auf die man schnell umsteigen kann, ohne die gesamte Infrastruktur ver\u00e4ndern zu m\u00fcssen. Au\u00dferdem ist es relativ einfach zu erlernen. Deshalb haben wir es als unser System zur Verwaltung unserer Container ausgew\u00e4hlt. <\/p>\n<p>Was brauchen Sie, um Ihr System \u00fcberhaupt in Nomad zu deployen? <\/p>\n<ol>\n<li>Vor allem ben\u00f6tigen Sie <b>ein Docker-Image.<\/b> Ihre Anwendung. Sie m\u00fcssen sie erstellen und in ein Docker-Image-Repository legen. In unserem Fall ist das Artifactory \u2013 ein solches System, das es erm\u00f6glicht, verschiedene Artefakte unterschiedlicher Art hochzuladen. Es kann Archive, Docker-Images, PHP Composer-Pakete, NPM-Pakete usw. speichern. <\/li>\n<li>Es wird auch ben\u00f6tigt<b> Konfigurationsdatei<\/b>, das Nomad sagt, was, wohin und in welcher Menge Sie bereitstellen m\u00f6chten. <\/li>\n<\/ol>\n<p>\nWenn wir von Nomad sprechen, verwendet es HCL, das f\u00fcr \"HashiCorp Configuration Language\" steht, als Format f\u00fcr die Informationsdatei. <i>HashiCorp Configuration Language<\/i>. Es handelt sich um eine Obermenge von YAML, die es Ihnen erm\u00f6glicht, Ihren Dienst in den Begriffen von Nomad zu beschreiben. <\/p>\n<p><img decoding=\"async\" alt=\"Deployment von Anwendungen in VM, Nomad und Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/bee3d1feedd52249c4325d8a3984a766.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEs erm\u00f6glicht Ihnen, anzugeben, wie viele Container Sie bereitstellen m\u00f6chten, aus welchen Images verschiedene Parameter beim Bereitstellen \u00fcbergeben werden. Dadurch geben Sie diese Datei an Nomad weiter, und es startet die Container in Produktion gem\u00e4\u00df dieser Datei. <\/p>\n<p>In unserem Fall haben wir festgestellt, dass es nicht sehr praktisch ist, f\u00fcr jeden Dienst absolut identische HCL-Dateien zu schreiben, da es viele Dienste gibt und man diese gelegentlich aktualisieren m\u00f6chte. Es kommt vor, dass ein Dienst nicht in einem, sondern in mehreren Instanzen bereitgestellt wird. Zum Beispiel hat eines der Systeme, das wir in Produktion haben, \u00fcber 100 Instanzen. Sie werden aus den gleichen Images gestartet, unterscheiden sich jedoch in den Konfigurationseinstellungen und Konfigurationsdateien. <\/p>\n<p>Deshalb haben wir beschlossen, dass es f\u00fcr uns praktisch ist, alle unsere Konfigurationsdateien f\u00fcr die Bereitstellung in einem gemeinsamen Repository zu speichern. Auf diese Weise sind sie \u00fcberschaubar: Sie lassen sich leicht warten und man kann sehen, welche Systeme wir haben. Bei Bedarf ist es auch nicht schwierig, etwas zu aktualisieren oder zu \u00e4ndern. Eine neue Anwendung hinzuzuf\u00fcgen ist ebenfalls einfach \u2013 es reicht, eine Konfigurationsdatei im Inneren eines neuen Verzeichnisses zu erstellen. Darin befinden sich Dateien: service.hcl, die die Beschreibung unseres Dienstes enth\u00e4lt, und einige env-Dateien, die es erm\u00f6glichen, diesen Dienst, wenn er in Produktion bereitgestellt wird, zu konfigurieren. <\/p>\n<p><img decoding=\"async\" alt=\"Deployment von Anwendungen in VM, Nomad und Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/c0b0bdb763d3c3bb84fbc9e5dfecff82.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEinige unserer Systeme sind jedoch in der Produktion nicht in einer, sondern in mehreren Instanzen bereitgestellt. Daher haben wir beschlossen, dass es uns praktisch ist, die Konfigurationen nicht im reinen Format zu speichern, sondern in einer templateisierten Form. Als Templatesprache haben wir <i>jinja 2<\/i>. In diesem Format speichern wir sowohl die Konfigurationen des Dienstes selbst als auch die erforderlichen env-Dateien. <\/p>\n<p>Dar\u00fcber hinaus haben wir ein allgemeines Skript zur Bereitstellung in das Repository eingef\u00fcgt, das es Ihnen erm\u00f6glicht, Ihren Dienst in der Produktionsumgebung, in der gew\u00fcnschten Umgebung und auf dem gew\u00fcnschten Ziel zu starten und bereitzustellen. Wenn wir unsere HCL-Konfiguration in eine Vorlage umgewandelt haben, sieht die HCL-Datei, die zuvor eine gew\u00f6hnliche Nomad-Konfiguration war, in diesem Fall etwas anders aus.<\/p>\n<p><img decoding=\"async\" alt=\"Deployment von Anwendungen in VM, Nomad und Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/202472f109ba09798d592418b1774a29.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDas bedeutet, dass wir einige Variablenplatzhalter in der Konfiguration durch Variableinf\u00fcgungen ersetzt haben, die aus env-Dateien oder anderen Quellen stammen. Dar\u00fcber hinaus haben wir die M\u00f6glichkeit erhalten, HCL-Dateien dynamisch zu erstellen, das hei\u00dft, wir k\u00f6nnen nicht nur gew\u00f6hnliche Variableinf\u00fcgungen verwenden. Da Jinja Schleifen und Bedingungen unterst\u00fctzt, k\u00f6nnen auch Konfigurationsdateien erstellt werden, die sich je nach Zielort Ihrer Anwendungen \u00e4ndern. <\/p>\n<p>Zum Beispiel m\u00f6chten Sie Ihren Dienst in der Pre-Production und in der Produktion bereitstellen. Angenommen, dass Sie in der Pre-Production keine Cron-Skripte ausf\u00fchren m\u00f6chten, sondern einfach den Dienst auf einer separaten Domain sehen m\u00f6chten, um sicherzustellen, dass er funktioniert. F\u00fcr jeden, der einen Dienst bereitstellt, sieht der Prozess sehr einfach und transparent aus. Es reicht aus, die Datei deploy.sh auszuf\u00fchren, anzugeben, welchen Dienst Sie bereitstellen m\u00f6chten und auf welches Ziel. Zum Beispiel m\u00f6chten Sie ein bestimmtes System nach Russland, Wei\u00dfrussland oder Kasachstan bereitstellen. Dazu m\u00fcssen Sie einfach einen der Parameter \u00e4ndern, und die richtige Konfigurationsdatei wird erstellt. <\/p>\n<p>Wenn der Nomad-Dienst bereits in Ihrem Cluster bereitgestellt ist, sieht er folgenderma\u00dfen aus.<\/p>\n<p><img decoding=\"async\" alt=\"Deployment von Anwendungen in VM, Nomad und Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/60e2e2b5502936809d643d73c6d853e2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZun\u00e4chst ben\u00f6tigen Sie einen externen Load-Balancer, der den gesamten Benutzerverkehr akzeptiert. Er wird zusammen mit Consul arbeiten und bei Consul abfragen, wo sich der spezifische Dienst befindet, auf welchem Knoten und nach welchem <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/de\/lir\/ipv4\/\"   title=\"IP-Adresse\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"585\">IP-Adresse<\/a> Domainnamen. Die Dienste erscheinen in Consul direkt aus Nomad. Da dies Produkte desselben Unternehmens sind, sind sie gut miteinander verbunden. Man kann sagen, dass Nomad standardm\u00e4\u00dfig alle in ihm gestarteten Dienste in Consul registrieren kann. <\/p>\n<p>Nachdem Ihr externer Load-Balancer wei\u00df, an welchen Dienst der Verkehr gesendet werden muss, leitet er ihn in den entsprechenden Container oder in mehrere Container, die zu Ihrer Anwendung geh\u00f6ren. Dabei muss man selbstverst\u00e4ndlich auch an die Sicherheit denken. Obwohl alle Dienste auf denselben virtuellen Maschinen in Containern betrieben werden, ist es in der Regel erforderlich, den freien Zugang von einem Dienst zu einem anderen zu unterbinden. Wir haben dies durch Segmentierung erreicht. Jeder Dienst wurde in seinem eigenen virtuellen Netzwerk betrieben, in dem Routing-Regeln und Regeln zur Erlaubnis\/Verweigerung des Zugriffs auf andere Systeme und Dienste festgelegt waren. Diese konnten sich sowohl innerhalb als auch au\u00dferhalb dieses Clusters befinden. Wenn Sie beispielsweise verhindern m\u00f6chten, dass ein Dienst eine Verbindung zu einer bestimmten Datenbank herstellt, k\u00f6nnen Sie dies durch Segmentierung auf Netzwerkebene tun. Das bedeutet, dass Sie selbst versehentlich nicht aus einer Testumgebung auf Ihre Produktionsdatenbank zugreifen k\u00f6nnen.<\/p>\n<p>Was hat uns der \u00dcbergangsprozess an personellen Ressourcen gekostet? <\/p>\n<p>Der \u00dcbergang des gesamten Unternehmens zu Nomad hat etwa 5-6 Monate gedauert. Wir haben dienstweise gewechselt, jedoch in einem recht schnellen Tempo. Jedes Team musste seine eigenen Container f\u00fcr die Dienste erstellen. <\/p>\n<p>Bei uns ist es \u00fcblich, dass jedes Team selbst f\u00fcr die Docker-Images seiner Systeme verantwortlich ist. Die DevOps bieten die erforderliche Infrastruktur f\u00fcr das Deployment an, also die Unterst\u00fctzung des Clusters selbst, die Unterst\u00fctzung des CI-Systems usw. Zu diesem Zeitpunkt waren \u00fcber 60 Systeme zu Nomad umgezogen, was etwa 2000 Container ausmachte. <\/p>\n<p>Die DevOps sind f\u00fcr die gesamte Infrastruktur aller mit dem Deployment verbundenen Server verantwortlich. Jedes Entwicklungsteam hingegen ist daf\u00fcr verantwortlich, Container f\u00fcr sein spezifisches System zu implementieren, da nur das Team wei\u00df, was es eigentlich in diesem oder jenem Container ben\u00f6tigt.<\/p>\n<h1>Gr\u00fcnde f\u00fcr den Verzicht auf Nomad<\/h1>\n<p>\nWelche Vorteile haben wir durch den Umstieg auf das Deployment mit Nomad und Docker erhalten?<\/p>\n<ol>\n<li>Wir<b> gleiche Bedingungen gew\u00e4hrleistet<\/b> F\u00fcr alle Umgebungen. In der Entwicklungs-, QA-Umgebung, in der Pre-Production und in der Produktion werden dieselben Container-Images mit denselben Abh\u00e4ngigkeiten verwendet. Dementsprechend haben Sie praktisch keine Chance, dass in der Produktion etwas landet, was Sie zuvor lokal oder in einer Testumgebung getestet haben. <\/li>\n<li>Wir haben auch festgestellt, dass es ausreichend <b>einfach ist, einen neuen Service<\/b>hinzuzuf\u00fcgen. Jede neue Systeme aus Sicht des Deployments wird sehr einfach gestartet. Es reicht, in das Repository zu gehen, das die Konfigurationen speichert, dort die entsprechende Konfiguration f\u00fcr Ihr System hinzuzuf\u00fcgen, und Sie sind bereit. Sie k\u00f6nnen Ihr System ohne zus\u00e4tzliche Anstrengungen von DevOps in die Produktion bringen. <\/li>\n<li>Alle <b>Konfigurationsdateien<\/b> in einem gemeinsamen Repository <b>waren einsehbar.<\/b>In dem Moment, als wir unsere Systeme mit Hilfe von <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/de\/vps\/\"   title=\"virtuellen Servern\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"791\">virtuellen Servern<\/a>deployten, verwendeten wir Ansible, in dem die Konfigurationen im selben Repository lagen. Dennoch war es f\u00fcr die meisten Entwickler etwas komplizierter, damit zu arbeiten. Hier wurde das Volumen an Konfigurationen und Code, den Sie hinzuf\u00fcgen m\u00fcssen, um einen Service zu deployen, deutlich kleiner. Au\u00dferdem ist es f\u00fcr DevOps sehr einfach, es zu \u00e4ndern oder zu aktualisieren. Im Fall von \u00dcberg\u00e4ngen, zum Beispiel bei einer neuen Version von Nomad, k\u00f6nnen sie einfach alle operativen Dateien, die an derselben Stelle liegen, massenhaft aktualisieren.<\/li>\n<\/ol>\n<p>\nAber wir sind auch auf einige Nachteile gesto\u00dfen: <\/p>\n<p>Es stellte sich heraus, dass wir <b>nicht nahtlose Deployments <\/b>im Fall von Nomad erreichen konnten. Beim Rollout von Containern aus unterschiedlichen Bedingungen konnte es passieren, dass dieser gestartet wurde und Nomad ihn als bereit f\u00fcr den Datenverkehr ansah. Dies geschah noch bevor die Anwendung darin gestartet wurde. Aus diesem Grund begann das System f\u00fcr kurze Zeit, 500-Fehler auszugeben, weil der Datenverkehr auf einen Container gelenkt wurde, der noch nicht bereit war, ihn zu akzeptieren. <\/p>\n<p>Wir stie\u00dfen auf einige <b>Bugs<\/b>. Der gravierendste Fehler besteht darin, dass Nomad gro\u00dfe Cluster nicht optimal verwaltet, wenn Sie viele Systeme und Container haben. Wenn Sie einen der Server, der zum Nomad-Cluster geh\u00f6rt, au\u00dfer Betrieb nehmen m\u00f6chten, besteht eine erhebliche Wahrscheinlichkeit, dass sich das Cluster schlecht verh\u00e4lt und auseinanderf\u00e4llt. Ein Teil der Container kann beispielsweise ausfallen und nicht wieder hochgefahren werden \u2014 das k\u00f6nnte Ihnen sp\u00e4ter erheblich kosten, insbesondere wenn sich all Ihre Systeme in der Produktion im Nomad-verwalteten Cluster befinden. <\/p>\n<p>Deshalb haben wir beschlossen, dar\u00fcber nachzudenken, wo wir als N\u00e4chstes hingehen wollen. Zu diesem Zeitpunkt hatten wir viel klarer erkannt, was wir erreichen m\u00f6chten. Und zwar: Wir w\u00fcnschen uns Zuverl\u00e4ssigkeit, ein paar mehr Funktionen als Nomad bietet, sowie ein reiferes und stabileres System. <\/p>\n<p>In dieser Hinsicht fiel unsere Wahl auf Kubernetes als die popul\u00e4rste Plattform zum Starten von Clustern. Besonders unter der Voraussetzung, dass die Gr\u00f6\u00dfe und Anzahl unserer Container recht gro\u00df war. F\u00fcr solche Zwecke erschien Kubernetes als das geeignetste System von denen, die wir uns angesehen hatten. <\/p>\n<h1>Der \u00dcbergang zu Kubernetes<\/h1>\n<p>\nIch werde ein wenig \u00fcber die grundlegenden Konzepte von Kubernetes erz\u00e4hlen und wie sie sich von Nomad unterscheiden. <\/p>\n<p><img decoding=\"async\" alt=\"Deployment von Anwendungen in VM, Nomad und Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/5723a69309f387e6cc6c5959b62ca18b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZun\u00e4chst ist das grundlegendste Konzept in Kubernetes das des Pods. <b>Pod<\/b> \u2014 es ist eine Gruppe von einem oder mehreren Containern, die immer zusammen gestartet werden. Sie arbeiten, als ob sie immer auf derselben virtuellen Maschine ausgef\u00fchrt werden. Sie sind \u00fcber die IP-Adresse 127.0.0.1 auf verschiedenen Ports miteinander erreichbar. <\/p>\n<p>Angenommen, Sie haben eine PHP-Anwendung, die aus Nginx und PHP-FPM besteht \u2014 ein klassisches Setup. Wahrscheinlich m\u00f6chten Sie, dass sowohl die Nginx- als auch die PHP-FPM-Container immer gemeinsam laufen. Kubernetes erm\u00f6glicht es, dies zu erreichen, indem man sie als einen gemeinsamen Pod beschreibt. Genau das konnten wir mit Nomad nicht erreichen.<\/p>\n<p>Das zweite Konzept ist <b>deployment<\/b>. Der Punkt ist, dass ein Pod f\u00fcr sich genommen eine fl\u00fcchtige Sache ist, die startet und verschwindet. Ob Sie zuerst alle Ihre vorherigen Container l\u00f6schen und dann sofort neue Versionen starten m\u00f6chten oder ob Sie sie schrittweise ausrollen wollen \u2014 genau f\u00fcr diesen Prozess ist das Konzept des Deployments verantwortlich. Es beschreibt, wie Sie Ihre Pods bereitstellen, in welcher Anzahl und wie Sie sie aktualisieren. <\/p>\n<p>Das dritte Konzept ist <b>service<\/b>. Ihr Service ist praktisch Ihr System, das einen bestimmten Datenverkehr aufnimmt und ihn dann an einen oder mehrere Pods weiterleitet, die Ihrem Service entsprechen. Das bedeutet, dass Sie sagen k\u00f6nnen, dass der gesamte eingehende Datenverkehr zu einem bestimmten Service mit einem bestimmten Namen an genau diese Pods gesendet werden soll. Gleichzeitig sorgt es f\u00fcr eine Lastverteilung des Datenverkehrs. Sie k\u00f6nnen also zwei Pods Ihrer Anwendung starten, und der gesamte eingehende Datenverkehr wird gleichm\u00e4\u00dfig auf die entsprechenden Pods dieses Services verteilt.<\/p>\n<p>Und das vierte grundlegende Konzept \u2014 <b>Ingress<\/b>. Dies ist ein Service, der in einem Kubernetes-Cluster gestartet wird. Er fungiert als externer Lastenausgleich, der alle Anfragen entgegennimmt. \u00dcber die API von Kubernetes kann Ingress bestimmen, wohin diese Anfragen gesendet werden m\u00fcssen. Dabei geschieht dies sehr flexibel. Sie k\u00f6nnen sagen, dass alle Anfragen an diesen Host und eine bestimmte URL an diesen Service gesendet werden. Und diese Anfragen, die an diesen Host und eine andere URL kommen, werden an einen anderen Service gesendet. <\/p>\n<p>Das Tolle aus Sicht des Entwicklers ist, dass Sie all dies selbst verwalten k\u00f6nnen. Indem Sie die Ingress-Konfiguration festlegen, k\u00f6nnen Sie den gesamten Datenverkehr, der an eine bestimmte API kommt, an separate Container weiterleiten, die beispielsweise in Go geschrieben sind. Der Datenverkehr, der an dieselbe Domain, aber an eine andere URL kommt, kann an Container weitergeleitet werden, die in PHP geschrieben sind, wo viel Logik enthalten ist, die jedoch nicht sehr schnell ist.<\/p>\n<p>Wenn man all diese Konzepte mit Nomad vergleicht, kann man sagen, dass die ersten drei Konzepte zusammen als Service betrachtet werden. Das letzte Konzept ist in Nomad nicht vorhanden. Wir haben an seiner Stelle einen externen Lastenausgleich verwendet: das kann haproxy, nginx, nginx+ usw. sein. Im Fall von Kubernetes brauchen Sie dieses zus\u00e4tzliche Konzept nicht separat einzuf\u00fchren. Wenn man jedoch Ingress n\u00e4her betrachtet, ist es entweder nginx, haproxy oder traefik, aber sozusagen in Kubernetes integriert. <\/p>\n<p>Alle von mir beschriebenen Konzepte sind im Wesentlichen Ressourcen, die innerhalb eines Kubernetes-Clusters existieren. Zur Beschreibung dieser Ressourcen wird im Cluster das yaml-Format verwendet, das lesbarer und vertrauter ist als HCL-Dateien im Fall von Nomad. Strukturell beschreiben sie jedoch beispielsweise bei Pods dasselbe. Sie sagen \u2013 ich m\u00f6chte solche Pods dorthin deployen, mit solchen Images, in einer bestimmten Anzahl. <\/p>\n<p><img decoding=\"async\" alt=\"Deployment von Anwendungen in VM, Nomad und Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/13836e7474b377a5e6b05112a53bfedd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNeben diesem haben wir verstanden, dass wir nicht manuell jede einzelne Ressource erstellen wollen: Deployment, Services, Ingress und so weiter. Stattdessen wollten wir bei der Bereitstellung jedes unserer Systeme in Begriffen von Kubernetes beschreiben, um nicht manuell alle notwendigen Ressourcenabh\u00e4ngigkeiten in der richtigen Reihenfolge neu erstellen zu m\u00fcssen. Als solches System, das uns dies erm\u00f6glicht hat, wurde Helm gew\u00e4hlt. <\/p>\n<h1>Grundlegende Konzepte in Helm<\/h1>\n<p>\nHelm ist ein <b>Paketmanager<\/b> f\u00fcr Kubernetes. Er funktioniert sehr \u00e4hnlich wie Paketmanager in Programmiersprachen. Sie erm\u00f6glichen es Ihnen, einen Service zu speichern, der beispielsweise aus dem Deployment von nginx, dem Deployment von php-fpm, einer Konfiguration f\u00fcr Ingress, ConfigMaps (dies ist ein Objekt, das es Ihnen erm\u00f6glicht, env und andere Parameter f\u00fcr Ihr System festzulegen) in Form von sogenannten Charts besteht. Dabei <b>arbeitet Helm \u00fcber Kubernetes<\/b>. Das bedeutet, dass es kein separates System ist, sondern einfach ein weiterer Service, der innerhalb des Clusters l\u00e4uft. Sie interagieren mit ihm \u00fcber seine API mittels eines Konsolenbefehls. Sein Komfort und seine Vorz\u00fcge liegen darin, dass selbst wenn Helm abst\u00fcrzt oder Sie ihn aus dem Cluster entfernen, Ihre Services nicht verschwinden, da Helm im Grunde nur dazu dient, das System zu starten. F\u00fcr die Funktionsf\u00e4higkeit und den Zustand der Services ist dann Kubernetes selbst verantwortlich. <\/p>\n<p>Au\u00dferdem haben wir erkannt, dass die <b>Vorlagenbildung<\/b>, die wir zuvor manuell durch die Integration von Jinja in unsere Konfigurationen durchf\u00fchren mussten, eine der Hauptfunktionen von Helm ist. Alle Konfigurationen, die Sie f\u00fcr Ihre Systeme erstellen, werden in Helm als Vorlagen gespeichert, die ein wenig wie Jinja, aber tats\u00e4chlich mit der Template-Sprache von Go, in der Helm geschrieben ist, verwendet werden, genau wie Kubernetes. <\/p>\n<p>Helm f\u00fcgt uns noch einige zus\u00e4tzliche Konzepte hinzu. <\/p>\n<p><b>Diagramm<\/b> \u2014 das ist die Beschreibung Ihres Services. In anderen Paketmanagern w\u00fcrde man es Paket, Bundle oder etwas \u00c4hnliches nennen. Hier hei\u00dft es Chart. <\/p>\n<p><b>Values <\/b>\u2013 das sind die Variablen, die Sie zur Erstellung Ihrer Konfigurationen aus den Vorlagen verwenden m\u00f6chten. <\/p>\n<p><b>Release<\/b>Jedes Mal erh\u00e4lt der Service, der mit Helm bereitgestellt wird, eine inkrementelle Version des Releases. Helm erinnert sich, wie die Konfiguration des Services bei der vorherigen, vorvorherigen Version usw. war. Daher reicht es aus, den Befehl 'helm callback' auszuf\u00fchren und die vorherige Version des Releases anzugeben, wenn ein Rollback erforderlich ist. Selbst wenn die entsprechende Konfiguration im Moment des Rollbacks nicht in Ihrem Repository verf\u00fcgbar ist, erinnert sich Helm trotzdem, wie sie war, und stellt Ihr System auf den Zustand zur\u00fcck, in dem es sich beim vorherigen Release befand. <\/p>\n<p>Im Fall von Helm werden auch die \u00fcblichen Konfigurationen f\u00fcr Kubernetes in Templates umgewandelt, die die M\u00f6glichkeit bieten, Variablen, Funktionen und bedingte Operatoren zu verwenden. Auf diese Weise k\u00f6nnen Sie die Konfiguration Ihres Services je nach Umgebung zusammenstellen.<\/p>\n<p><img decoding=\"async\" alt=\"Deployment von Anwendungen in VM, Nomad und Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/b70ba431211038eacf911ba3aee22363.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn der Praxis haben wir uns entschieden, etwas anders vorzugehen als bei Nomad. W\u00e4hrend in Nomad in einem Repository sowohl die Konfigurationen f\u00fcr das Deployment als auch die n-Variablen, die zum Deployen unseres Services erforderlich sind, gespeichert wurden, haben wir uns hier entschieden, sie in zwei separate Repositories zu unterteilen. Im Repository 'deploy' werden nur die n-Variablen gespeichert, die f\u00fcr das Deployment ben\u00f6tigt werden, w\u00e4hrend im Repository 'helm' die Konfigurationen oder Charts gespeichert werden.<\/p>\n<p><img decoding=\"async\" alt=\"Deployment von Anwendungen in VM, Nomad und Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/4add11a8f9d9a9244127f0b07d027fa2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWas hat uns das gebracht? <\/p>\n<p>Obwohl wir in den Konfigurationsdateien keine wirklich sensiblen Daten speichern. Zum Beispiel Passw\u00f6rter f\u00fcr Datenbanken werden als Secrets in Kubernetes gespeichert, dennoch gibt es dort immer noch bestimmte Dinge, auf die wir nicht allen Zugriff gew\u00e4hren m\u00f6chten. Daher ist der Zugang zum Repository 'deploy' strenger geregelt, w\u00e4hrend das Repository 'helm' einfach die Beschreibung des Services enth\u00e4lt. Aus diesem Grund kann dort sicher eine breitere Personengruppe Zugang erhalten. <\/p>\n<p>Da wir nicht nur eine Produktionsumgebung, sondern auch andere Umgebungen haben, k\u00f6nnen wir dank dieser Trennung unsere Helm-Charts wiederverwenden, um Services nicht nur in der Produktionsumgebung, sondern beispielsweise auch in der QA-Umgebung bereitzustellen. Sogar um sie lokal zu implementieren, unter Verwendung von <i>Minikube<\/i> \u2014 das ist ein Tool f\u00fcr den lokalen Betrieb von Kubernetes. <\/p>\n<p>In jedem Repository haben wir eine Trennung in separate Verzeichnisse f\u00fcr jeden Dienst gelassen. Das bedeutet, dass sich in jedem Verzeichnis Templates befinden, die zu dem entsprechenden Chart geh\u00f6ren und die Ressourcen beschreiben, die f\u00fcr den Start unseres Systems bereitgestellt werden m\u00fcssen. Im Repository \u201edeploy\u201c haben wir nur die Environments hinterlassen. In diesem Fall haben wir auf die Verwendung von Jinja-Templating verzichtet, da Helm selbst Templating out of the box bietet \u2013 das ist eine seiner Hauptfunktionen. <\/p>\n<p>Wir haben ein Skript f\u00fcr das Deployment \u2013 deploy.sh \u2013 hinterlassen, das den Start f\u00fcr das Deployment mit Helm vereinfacht und standardisiert. So sieht das Deployment-Interface f\u00fcr jeden, der ein Deployment durchf\u00fchren m\u00f6chte, genau so aus wie bei einem Deployment \u00fcber Nomad. Das gleiche deploy.sh, der Name Ihres Dienstes und wohin Sie ihn deployen m\u00f6chten. Dadurch wird Helm im Hintergrund gestartet. Es sammelt die Konfigurationen aus den Templates, setzt die erforderlichen Values-Dateien ein und deployt dann, indem es sie in Kubernetes \u00fcbergibt. <\/p>\n<h1>Das DBMS Tarantool ist ein attraktives, zukunftstr\u00e4chtiges Produkt zur Erstellung von hochbelasteten Anwendungen.<\/h1>\n<p>\nDer Kubernetes-Dienst erscheint komplexer als Nomad. <\/p>\n<p><img decoding=\"async\" alt=\"Deployment von Anwendungen in VM, Nomad und Kubernetes\" src=\"\/wp-content\/uploads\/2019\/05\/5a9b5636ab4721acde096fea986ba38b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHier kommt der ausgehende Datenverkehr in den Ingress. Dies ist genau der Front-Controller, der alle Anfragen entgegennimmt und sie anschlie\u00dfend an die entsprechenden Dienste weiterleitet. Er bestimmt diese auf der Grundlage von Konfigurationen, die Teil der Beschreibung Ihrer Anwendung in Helm sind und die die Entwickler selbst festlegen. Der Dienst sendet die Anfragen an seine Pods, also an bestimmte Container, und balanciert dabei den eingehenden Verkehr zwischen allen Containern, die zu diesem Dienst geh\u00f6ren. Und nat\u00fcrlich sollten wir nicht vergessen, dass wir auf Netzwerkebene nicht auf Sicherheit verzichten d\u00fcrfen. Daher arbeitet die Segmentierung im Kubernetes-Cluster, die auf Tagging basiert. Alle Dienste haben bestimmte Tags, an die die Zugriffsrechte der Dienste auf bestimmte externe\/intern Ressourcen innerhalb oder au\u00dferhalb des Clusters gebunden sind. <\/p>\n<p>Bei unserem Wechsel haben wir festgestellt, dass Kubernetes alle Funktionen von Nomad, das wir zuvor verwendet haben, bietet und zudem viele neue M\u00f6glichkeiten hinzuf\u00fcgt. Es l\u00e4sst sich durch Plugins erweitern und durch benutzerdefinierte Ressourcentypen anpassen. Das bedeutet, dass Sie nicht nur etwas verwenden k\u00f6nnen, was out-of-the-box in Kubernetes bereitgestellt wird, sondern auch Ihre eigenen Ressourcen und Dienste schaffen, die auf ihre Ressourcen zugreifen k\u00f6nnen. Dies bietet zus\u00e4tzliche M\u00f6glichkeiten, Ihr System zu erweitern, ohne Kubernetes neu installieren oder \u00c4nderungen vornehmen zu m\u00fcssen. <\/p>\n<p>Ein Beispiel f\u00fcr eine solche Verwendung ist Prometheus, der bei uns innerhalb des Kubernetes-Clusters l\u00e4uft. Um zu beginnen, Metriken von einem bestimmten Dienst zu sammeln, m\u00fcssen wir dem Dienstbeschreibung einen zus\u00e4tzlichen Ressourcentyp hinzuf\u00fcgen, den sogenannten Service-Monitor. Prometheus kann, weil er in Kubernetes l\u00e4uft, benutzerdefinierte Ressourcentypen lesen und beginnt automatisch, Metriken aus dem neuen System zu sammeln. Das ist sehr praktisch. <\/p>\n<p>Der erste Deployment, den wir in Kubernetes gemacht haben, war im M\u00e4rz 2018. Seit dieser Zeit haben wir nie Probleme damit gehabt. Es arbeitet stabil, ohne wesentliche Bugs. Au\u00dferdem k\u00f6nnen wir es weiter ausbauen. Heute reicht uns die Funktionalit\u00e4t, die es bietet, und wir m\u00f6gen das Entwicklungstempo von Kubernetes sehr. Zurzeit sind mehr als 3000 Container in Kubernetes. Der Cluster umfasst mehrere Nodes. Dabei ist er wartbar, stabil und sehr gut kontrollierbar.<br \/>\n<br \/>Quelle: <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.1.1 - 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\/de\/blog\/administrirovanie\/deploj-prilozhenij-v-vm-nomad-i-kubernetes\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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 von Anwendungen in VM, Nomad und Kubernetes | ProHoster","description":"Hallo zusammen! Ich bin Pavel Agaletzy. Ich arbeite als Teamleiter in dem Team, das das Liefersystem von Lamoda entwickelt.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/deploj-prilozhenij-v-vm-nomad-i-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/33654","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=33654"}],"version-history":[{"count":2,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/33654\/revisions"}],"predecessor-version":[{"id":157982,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/33654\/revisions\/157982"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/25343"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=33654"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=33654"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=33654"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}