{"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":"Anwendungen in VM, Nomad und Kubernetes bereitstellen","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo zusammen! Mein Name ist Pawel Agaletzki. Ich bin Teamleiter in der Gruppe, die das Liefersystem von Lamoda entwickelt. 2018 habe ich auf der Konferenz HighLoad++ gesprochen, und heute m\u00f6chte ich die Zusammenfassung meines Vortrags vorstellen.<\/p>\n<p>Mein Thema befasst sich mit den Erfahrungen unseres Unternehmens beim Deployment von Systemen und Services in verschiedene Umgebungen. Angefangen von unseren archaischen Zeiten, als wir alle Systeme auf herk\u00f6mmlichen virtuellen Servern bereitstellten, bis hin zu unserem schrittweisen \u00dcbergang von Nomad zu Kubernetes. Ich werde erl\u00e4utern, warum wir das getan 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>Anwendungen auf VM bereitstellen<\/h1>\n<p>\nVor drei Jahren wurden alle Systeme und Dienste des Unternehmens auf regul\u00e4ren virtuellen Servern bereitgestellt. Technisch gesehen war es so organisiert, dass der gesamte Code unserer Systeme durch automatische Builds mit Jenkins verwaltet wurde. Mithilfe von Ansible wurde dieser Code aus unserem Versionskontrollsystem auf die virtuellen Server ausgerollt. Jede Systeminstanz in unserem Unternehmen wurde dabei auf mindestens zwei Servern bereitgestellt: einer davon als Head, der andere als Tail. Diese beiden Systeme waren in Bezug auf ihre Einstellungen, Leistung, Konfiguration und vieles mehr absolut identisch. Der einzige Unterschied war, dass der Head den BenutzertypTraffic empfing, w\u00e4hrend der Tail niemals BenutzertypTraffic erhielt. <\/p>\n<p>Warum wurde das so gemacht? <\/p>\n<p>Bei der Bereitstellung neuer Versionen unserer Anwendung wollten wir einen nahtlosen Rollout gew\u00e4hrleisten, ohne sp\u00fcrbare Auswirkungen f\u00fcr die Benutzer. Dies wurde erreicht, indem der neueste Release mithilfe von Ansible auf den Tail-Server ausgerollt wurde. Dort konnten die f\u00fcr das Deployment verantwortlichen Personen \u00fcberpr\u00fcfen und sicherstellen, dass alles in Ordnung war: alle Metriken, Abschnitte und Anwendungen funktionierten und die ben\u00f6tigten Skripte wurden gestartet. Erst nachdem sie sicher waren, dass alles in Ordnung war, wurde der Verkehr umgeschaltet. Er begann auf den Server zu laufen, der zuvor der Tail war. Der Server, der vorher der Head war, blieb ohne Benutzerverkehre, lief jedoch mit der vorherigen Version unserer Anwendung.<\/p>\n<p>So blieb es f\u00fcr die Benutzer nahtlos, da der Wechsel sofort erfolgt, da es sich lediglich um einen Wechsel des Lastverteilers handelt. Man kann sehr einfach auf die vorherige Version zur\u00fcckschalten, indem man einfach den Lastverteiler wieder zur\u00fcckschaltet. Au\u00dferdem konnten wir die Leistung der Anwendung im Live-Betrieb \u00fcberpr\u00fcfen, noch bevor der Benutzerverkehr darauf gerichtet wurde, was \u00e4u\u00dferst praktisch war. <\/p>\n<p>Was haben wir in all dem als Vorteile erkannt?<\/p>\n<ol>\n<li>Zun\u00e4chst einmal ist das ausreichend <b>es funktioniert einfach.<\/b> Jeder versteht, wie ein solches Deploymentschema funktioniert, da die meisten Menschen schon einmal auf herk\u00f6mmlichen virtuellen Servern deployed haben.<\/li>\n<li>Das ist ausreichend <b>zuverl\u00e4ssig<\/b>, da die Deployment-Technologie einfach ist und sich bereits tausendfach bew\u00e4hrt hat. Millionen von Servern werden genau so bereitgestellt. Es ist schwierig, etwas dabei kaputt zu machen. <\/li>\n<li>Und schlie\u00dflich konnten wir <b>atomare Deployments<\/b>erhalten. Deployments, die f\u00fcr die Benutzer gleichzeitig erfolgen, ohne einen merklichen Wechsel zwischen der alten und der neuen Version. <\/li>\n<\/ol>\n<p>\nAber dabei haben wir auch einige Nachteile gesehen: <\/p>\n<ol>\n<li>Neben der Produktionsumgebung und der Entwicklungsumgebung gibt es auch andere Umgebungen. Zum Beispiel QA und Pre-Production. 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 pflegen. <\/b>virtuellen Maschinen. Und wenn Sie Bibliotheken aktualisieren oder neue Abh\u00e4ngigkeiten installieren m\u00f6chten, m\u00fcssen Sie das in allen Umgebungen tun. Auch die Synchronisation der Zeit, zu der Sie die n\u00e4chste Version Ihrer Anwendung bereitstellen m\u00f6chten, mit dem Zeitpunkt, zu dem DevOps die notwendigen Umgebungen konfiguriert, ist wichtig. In diesem Fall kann es leicht passieren, dass sich die Umgebungen in den verschiedenen Instanzen unterscheiden. Beispielsweise k\u00f6nnen in der QA-Umgebung andere Bibliotheksversionen verwendet werden als in der Produktionsumgebung, was zu Problemen f\u00fchrt. <\/li>\n<li><b>Die Herausforderung 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 unterst\u00fctzt. Sie sollten ihnen die entsprechende Aufgabe zuteilen und eine Beschreibung dessen geben, was Sie vorhaben.<\/li>\n<li>Zu diesem Zeitpunkt wollten wir auch unsere gro\u00dfen Monolithen in kleinere Dienste aufteilen, weil uns bewusst war, dass die Anzahl weiter wachsen w\u00fcrde. Bereits zu diesem Zeitpunkt hatten wir \u00fcber 100 davon. F\u00fcr jeden neuen Dienst musste eine separate virtuelle Maschine erstellt werden, die ebenfalls gewartet und bereitgestellt werden musste. Dar\u00fcber hinaus ben\u00f6tigten wir nicht nur eine Maschine, sondern mindestens zwei. Hinzu kam auch eine QA-Umgebung. Dies f\u00fchrt zu Problemen und macht die Erstellung und den Start neuer Systeme f\u00fcr Sie komplizierter. <b>teurer und zeitaufw\u00e4ndiger.<\/b><\/li>\n<\/ol>\n<p>\nDeshalb haben wir uns entschieden, dass es sinnvoller w\u00e4re, von der Bereitstellung herk\u00f6mmlicher virtueller Maschinen auf die Bereitstellung unserer Anwendungen in Docker-Containern umzusteigen. Bei der Verwendung von Docker ben\u00f6tigen wir ein System, das in der Lage ist, Anwendungen im Cluster auszuf\u00fchren, da Container nicht einfach so hochgefahren werden k\u00f6nnen. In der Regel m\u00f6chte man \u00fcberwachen, wie viele Container aktiv sind, damit sie automatisch gestartet werden. Aus diesem Grund mussten wir ein Management-System ausw\u00e4hlen. <\/p>\n<p>Wir haben lange dar\u00fcber nachgedacht, welche L\u00f6sung wir w\u00e4hlen sollten. Zu diesem Zeitpunkt war der Einsatz von traditionellen virtuellen Servern f\u00fcr unser Deployment etwas veraltet, da dort nicht die neuesten Versionen der Betriebssysteme verwendet wurden. Irgendwann lief dort sogar FreeBSD, was die Wartung nicht besonders einfach machte. Wir wussten, dass wir so schnell wie m\u00f6glich auf Docker migrieren mussten. Unser DevOps-Team hat seine Erfahrungen mit verschiedenen L\u00f6sungen betrachtet und sich f\u00fcr ein System wie Nomad entschieden. <\/p>\n<h1>\u00dcbergang zu Nomad<\/h1>\n<p>\nNomad ist ein Produkt von HashiCorp. Diese Firma ist auch f\u00fcr ihre anderen L\u00f6sungen bekannt:<\/p>\n<p><img decoding=\"async\" alt=\"Anwendungen in VM, Nomad und Kubernetes bereitstellen\" src=\"\/wp-content\/uploads\/2019\/05\/25dfbfe20b92f6e6865bdd8a2f15d8fa.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>\u201eConsul\u201c<\/b> \u2014 ein Tool zur Service-Entdeckung.<\/p>\n<p><b>\u201eTerraform\u201c<\/b> \u2014 ein System zur Verwaltung von Servern, das es Ihnen erm\u00f6glicht, diese \u00fcber Konfigurationen, das sogenannte Infrastructure-as-Code, einzurichten.<\/p>\n<p><b>\u201eVagrant\u201c<\/b> erm\u00f6glicht Ihnen das Bereitstellen von virtuellen Maschinen sowohl lokal als auch in der Cloud durch spezifische Konfigurationsdateien. <\/p>\n<p>Nomad erschien uns damals als eine recht einfache L\u00f6sung, auf die wir schnell umsteigen konnten, ohne die gesamte Infrastruktur zu ver\u00e4ndern. Au\u00dferdem ist es relativ leicht zu erlernen. Daher haben wir es als unser Filtersystem f\u00fcr den Container gew\u00e4hlt. <\/p>\n<p>Was ben\u00f6tigen Sie, um Ihr System \u00fcberhaupt in Nomad zu deployen? <\/p>\n<ol>\n<li>Zun\u00e4chst einmal brauchen Sie <b>ein Docker-Image<\/b> Ihrer Anwendung. Dieses muss erstellt und in ein Docker-Registry gespeichert werden. In unserem Fall ist das Artifactory \u2013 eine Plattform, die es erm\u00f6glicht, verschiedene Artefakte unterschiedlichster Art hochzuladen. Sie kann Archive, Docker-Images, PHP Composer-Pakete, NPM-Pakete und mehr speichern. <\/li>\n<li>Auch notwendig ist eine<b> Konfigurationsdatei<\/b>, die Nomad mitteilt, was, wohin und in welcher Menge Sie deployen m\u00f6chten. <\/li>\n<\/ol>\n<p>\nWenn wir von Nomad sprechen, verwendet es als Dateiformat die HCL-Sprache, was f\u00fcr <i>HashiCorp Configuration Language<\/i>steht. Dies ist ein \u00dcber-Set von YAML, das es Ihnen erm\u00f6glicht, Ihren Service in den Begriffen von Nomad zu beschreiben. <\/p>\n<p><img decoding=\"async\" alt=\"Anwendungen in VM, Nomad und Kubernetes bereitstellen\" 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 und aus welchen Images Sie ihnen verschiedene Parameter beim Deployment \u00fcbergeben. Auf diese Weise f\u00fcttern Sie dieses Nomad-Dokument, und es startet die Container gem\u00e4\u00df den Vorgaben in der Produktion. <\/p>\n<p>In unserem Fall haben wir erkannt, dass es nicht sehr praktisch ist, f\u00fcr jeden Dienst absolut identische HCL-Dateien zu schreiben, da es viele Dienste gibt und man diese manchmal aktualisieren m\u00f6chte. Es kann vorkommen, dass ein Dienst nicht nur einmal bereitgestellt wird, sondern in verschiedenen Instanzen. Zum Beispiel hat eines der Systeme, das wir in der Produktion haben, \u00fcber 100 Instanzen im Einsatz. Diese werden aus denselben Images gestartet, unterscheiden sich jedoch in den Konfigurationseinstellungen und Konfigurationsdateien. <\/p>\n<p>Deshalb haben wir uns entschieden, alle unsere Konfigurationsdateien f\u00fcr das Deployment in einem gemeinsamen Repository zu speichern. So sind sie zug\u00e4nglich, leicht zu warten und wir k\u00f6nnen sehen, welche Systeme wir haben. Bei Bedarf ist es auch einfach, etwas zu aktualisieren oder zu \u00e4ndern. Eine neue Systemkonfiguration hinzuzuf\u00fcgen, ist ebenfalls unkompliziert \u2013 man muss lediglich eine Konfigurationsdatei im neuen Verzeichnis anlegen. In diesem Verzeichnis befinden sich die Dateien: service.hcl, die unsere Dienstbeschreibung enth\u00e4lt, sowie einige env-Dateien, die es erm\u00f6glichen, diesen Dienst beim Deployment in der Produktion zu konfigurieren. <\/p>\n<p><img decoding=\"async\" alt=\"Anwendungen in VM, Nomad und Kubernetes bereitstellen\" src=\"\/wp-content\/uploads\/2019\/05\/c0b0bdb763d3c3bb84fbc9e5dfecff82.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEinige unserer Systeme sind jedoch nicht nur in einem Exemplar, sondern mehrfach in der Produktion bereitgestellt. Daher haben wir uns entschieden, nicht die Konfigurationen in reiner Form zu speichern, sondern deren templatebasierten Ansatz. Als Template-Sprache haben wir uns f\u00fcr <i>jinja 2<\/i>entschieden. In diesem Format werden sowohl die Konfigurationen des Dienstes als auch die ben\u00f6tigten env-Dateien gespeichert. <\/p>\n<p>Zus\u00e4tzlich haben wir ein gemeinsames Skript-Deployment in das Repository eingef\u00fcgt, das es Ihnen erm\u00f6glicht, Ihren Dienst in die Produktion zu starten und auf die gew\u00fcnschte Umgebung sowie das gew\u00fcnschte Ziel zu deployen. In dem Moment, als wir unsere HCL-Konfiguration in eine Vorlage umgewandelt haben, hat die HCL-Datei, die zuvor eine normale Nomad-Konfiguration war, ein etwas anderes Aussehen angenommen.<\/p>\n<p><img decoding=\"async\" alt=\"Anwendungen in VM, Nomad und Kubernetes bereitstellen\" src=\"\/wp-content\/uploads\/2019\/05\/202472f109ba09798d592418b1774a29.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDas hei\u00dft, wir haben einige Platzhalter in der Konfiguration durch Variablen ersetzt, die aus env-Dateien oder anderen Quellen stammen. Dar\u00fcber hinaus haben wir die M\u00f6glichkeit geschaffen, HCL-Dateien dynamisch zu generieren, das hei\u00dft, wir k\u00f6nnen nicht nur gew\u00f6hnliche Variablenersetzungen anwenden. Da Jinja Schleifen und Bedingungen unterst\u00fctzt, k\u00f6nnen auch Konfigurationsdateien erstellt werden, die sich je nach Zielort Ihrer Anwendungen \u00e4ndern. <\/p>\n<p>Angenommen, Sie m\u00f6chten Ihren Service in einer Pre-Production- und in einer Production-Umgebung bereitstellen. Nehmen wir an, dass Sie in der Pre-Production keine Cron-Skripte ausf\u00fchren m\u00f6chten, sondern einfach den Service unter einer separaten Domain sehen wollen, um sicherzustellen, dass er funktioniert. F\u00fcr alle, die einen Service bereitstellen, sieht der Prozess sehr einfach und transparent aus. Sie m\u00fcssen lediglich die Datei deploy.sh ausf\u00fchren, angeben, welchen Service Sie bereitstellen m\u00f6chten und in welches Ziel. Zum Beispiel, wenn Sie ein System nach Deutschland, in die Schweiz oder nach \u00d6sterreich bereitstellen m\u00f6chten. Daf\u00fcr m\u00fcssen Sie einfach einen der Parameter \u00e4ndern, und es wird die richtige Konfigurationsdatei generiert. <\/p>\n<p>Sobald der Nomad-Service in Ihrem Cluster bereitgestellt ist, sieht er folgenderma\u00dfen aus.<\/p>\n<p><img decoding=\"async\" alt=\"Anwendungen in VM, Nomad und Kubernetes bereitstellen\" 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 Benutzertypverkehr empf\u00e4ngt. Dieser wird zusammen mit Consul arbeiten und von ihm erfahren, wo, auf welchem Knoten, nach welchem... <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/de\/lir\/ipv4\/\"   title=\"die IP-Adresse gebunden sind\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"585\">die IP-Adresse gebunden sind<\/a> Hier befindet sich ein bestimmter Dienst, der zu einem bestimmten Domainnamen passt. Dienste in Consul entstehen direkt aus Nomad. Da es sich um Produkte desselben Unternehmens handelt, sind sie gut miteinander verbunden. Man kann sagen, dass Nomad von Haus aus alle darin gestarteten Dienste innerhalb von Consul registrieren kann. <\/p>\n<p>Nachdem Ihr externes Load-Balancer-System entschieden hat, an welchen Dienst der Traffic gesendet werden soll, leitet es diesen an den entsprechenden Container oder an mehrere Container weiter, die zu Ihrer Anwendung geh\u00f6ren. Dabei muss selbstverst\u00e4ndlich auch die Sicherheit ber\u00fccksichtigt werden. Obwohl alle Dienste auf denselben virtuellen Maschinen in Containern ausgef\u00fchrt werden, erfordert dies normalerweise, dass der ungehinderte Zugang von einem Dienst zu einem anderen eingeschr\u00e4nkt wird. Dies haben wir durch Segmentierung erreicht. Jeder Dienst wurde in seinem eigenen virtuellen Netzwerk betrieben, in dem Routing-Regeln sowie Regeln zur Gew\u00e4hrung oder Verweigerung des Zugangs zu anderen Systemen und Diensten festgelegt wurden. Diese konnten sich sowohl innerhalb als auch au\u00dferhalb dieses Clusters befinden. Wenn Sie beispielsweise einem Dienst den Zugriff auf eine bestimmte Datenbank verweigern m\u00f6chten, k\u00f6nnen Sie dies durch Segmentierung auf Netzwerkebene erreichen. Das bedeutet, dass Sie selbst bei einem Fehler nicht versehentlich von einer Testumgebung auf Ihre Produktionsdatenbank zugreifen k\u00f6nnen.<\/p>\n<p>Was hat uns der \u00dcbergangsprozess in Bezug auf personelle Ressourcen gekostet? <\/p>\n<p>Der \u00dcbergang des gesamten Unternehmens zu Nomad dauerte etwa 5-6 Monate. Wir haben schrittweise, aber in einem recht z\u00fcgigen Tempo migriert. Jedes Team musste seine eigenen Container f\u00fcr die jeweiligen Services erstellen. <\/p>\n<p>Wir verfolgen den Ansatz, dass jedes Team eigenverantwortlich f\u00fcr die Docker-Images seiner Systeme zust\u00e4ndig ist. Die DevOps-Abteilung stellt hingegen die notwendige Infrastruktur f\u00fcr das Deployment bereit, darunter die Unterst\u00fctzung des Clusters, der CI-Systeme und so weiter. Zu diesem Zeitpunkt waren \u00fcber 60 Systeme zu Nomad gewechselt, was etwa 2.000 Container ergab. <\/p>\n<p>Die DevOps-Abteilung ist f\u00fcr die allgemeine Infrastruktur im Zusammenhang mit Deployments und Servern verantwortlich. Jedes Entwicklungsteam hingegen k\u00fcmmert sich um die Implementierung der Container f\u00fcr sein spezifisches System, da nur das Team wei\u00df, was genau in jedem einzelnen Container ben\u00f6tigt wird.<\/p>\n<h1>Gr\u00fcnde f\u00fcr die Ablehnung von Nomad<\/h1>\n<p>\nWelche Vorteile haben wir durch die Migration zu Deployments mit Nomad und Docker erzielt?<\/p>\n<ol>\n<li>Wir<b> wir haben gleichwertige Bedingungen geschaffen<\/b> F\u00fcr alle Umgebungen. In der Entwicklung, QA-Umgebung, im Pre-Production und in der Produktion werden dieselben Container-Images mit denselben Abh\u00e4ngigkeiten verwendet. Somit haben Sie praktisch keine Chance, dass in der Produktion etwas landet, das Sie vorher nicht lokal oder in der Testumgebung getestet haben. <\/li>\n<li>Wir haben au\u00dferdem festgestellt, dass es durchaus <b>einfach ist, einen neuen Service<\/b>hinzuzuf\u00fcgen. Alle neuen Systeme lassen sich aus Sicht des Deployments sehr einfach starten. Es reicht, in das Repository zu gehen, das die Konfigurationen speichert, eine weitere Konfiguration f\u00fcr Ihr System hinzuzuf\u00fcgen, und schon ist alles bereit. Sie k\u00f6nnen Ihr System ohne zus\u00e4tzlichen Aufwand 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>, wir haben Ansible verwendet, bei dem die Konfigurationen im selben Repository gespeichert waren. F\u00fcr die meisten Entwickler war es jedoch etwas komplizierter, damit zu arbeiten. Hier ist das Volumen an Konfigurationen und Code, den Sie hinzuf\u00fcgen m\u00fcssen, um einen Service bereitzustellen, deutlich geringer geworden. Zudem ist es f\u00fcr DevOps sehr einfach, Anpassungen vorzunehmen oder \u00c4nderungen vorzunehmen. Im Falle von Updates, beispielsweise auf eine neue Version von Nomad, k\u00f6nnen sie alle Betriebsdateien, die sich am gleichen Speicherort befinden, 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 die nahtlosen Deployments erreichen konnten <\/b>bei Nomad. Beim Rollout von Containern aus unterschiedlichen Umgebungen konnte es passieren, dass der Container bereits gestartet war, und Nomad ihn als bereit empfand, Verkehr zu akzeptieren. Dies geschah, bevor die Anwendung in ihm wirklich gestartet war. Aus diesem Grund begann das System kurzfristig, 500er-Fehler auszugeben, da der Verkehr auf einen Container geleitet wurde, der noch nicht bereit war, ihn zu akzeptieren. <\/p>\n<p>Wir stie\u00dfen auf einige <b>Bugs<\/b>. Der wesentliche Fehler besteht darin, dass Nomad gro\u00dfe Cluster nicht gut verwalten kann, insbesondere wenn Sie viele Systeme und Container haben. Wenn Sie einen der Server, der Teil des Nomad-Clusters ist, au\u00dfer Betrieb nehmen m\u00f6chten, gibt es eine betr\u00e4chtliche Wahrscheinlichkeit, dass der Cluster nicht stabil bleibt und auseinanderf\u00e4llt. Einige Container k\u00f6nnen beispielsweise abst\u00fcrzen und sich nicht wiederherstellen lassen \u2013 das wird Ihnen teuer zu stehen kommen, wenn all Ihre Systeme im Produktionsumfeld tats\u00e4chlich im Nomad-Cluster verwaltet werden. <\/p>\n<p>Deshalb haben wir beschlossen, \u00fcber die n\u00e4chsten Schritte nachzudenken. Zu diesem Zeitpunkt wurde uns viel klarer, was wir erreichen m\u00f6chten. Insbesondere streben wir nach Verl\u00e4sslichkeit, zus\u00e4tzliche Funktionen im Vergleich zu Nomad und ein ausgereifteres, stabileres System. <\/p>\n<p>In diesem Zusammenhang fiel unsere Wahl auf Kubernetes, die beliebteste Plattform zur Bereitstellung von Clustern. Besonders angesichts der Tatsache, dass die Gr\u00f6\u00dfe und Anzahl unserer Container recht gro\u00df war. F\u00fcr diese Zwecke erschien uns Kubernetes als das passendste System von den M\u00f6glichkeiten, die wir in Betracht ziehen konnten. <\/p>\n<h1>Umstieg auf Kubernetes<\/h1>\n<p>\nIch m\u00f6chte Ihnen kurz die grundlegenden Konzepte von Kubernetes erkl\u00e4ren und wie sie sich von Nomad unterscheiden. <\/p>\n<p><img decoding=\"async\" alt=\"Anwendungen in VM, Nomad und Kubernetes bereitstellen\" src=\"\/wp-content\/uploads\/2019\/05\/5723a69309f387e6cc6c5959b62ca18b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZuallererst ist das grundlegendste Konzept in Kubernetes das Pod-Konzept. <b>Pod<\/b> ist eine Gruppe von einem oder mehreren Containern, die immer zusammen gestartet werden. Sie arbeiten, als ob sie immer auf einer einzigen virtuellen Maschine laufen. Sie sind \u00fcber die IP-Adresse 127.0.0.1 auf verschiedenen Ports miteinander verbunden. <\/p>\n<p>Nehmen wir an, Sie haben eine PHP-Anwendung, die aus nginx und php-fpm besteht \u2013 eine klassische Architektur. Wahrscheinlich m\u00f6chten Sie, dass die nginx- und php-fpm-Container immer zusammen vorhanden sind. Kubernetes erm\u00f6glicht dies, indem Sie sie als ein gemeinsames Pod beschreiben. Genau das konnten wir mit Nomad nicht erreichen.<\/p>\n<p>Das zweite Konzept ist <b>deployment<\/b>. Ein Pod ist an sich eine fl\u00fcchtige Entit\u00e4t, sie wird gestartet und verschwindet. M\u00f6chten Sie zuerst alle Ihre vorherigen Container vernichten und dann sofort neue Versionen starten, oder m\u00f6chten Sie diese schrittweise ausrollen? 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 im Grunde Ihr System, das bestimmten Datenverkehr annimmt und diesen dann an einen oder mehrere Pods weiterleitet, die zu Ihrem Service geh\u00f6ren. Das hei\u00dft, er erm\u00f6glicht es, zu definieren, dass der gesamte eingehende Datenverkehr f\u00fcr einen bestimmten Service mit einem bestimmten Namen auf genau diese Pods geleitet werden soll. Dabei sorgt er f\u00fcr eine effiziente Lastenverteilung. Das bedeutet, Sie k\u00f6nnen zwei Pods Ihrer Anwendung betreiben, und der gesamte eingehende Datenverkehr wird gleichm\u00e4\u00dfig auf die entsprechenden Pods verteilt.<\/p>\n<p>Und das vierte grundlegende Konzept \u2014 <b>Ingress<\/b>. Dies ist ein Service, der in einem Kubernetes-Cluster ausgef\u00fchrt wird. Er fungiert als externer Lastenausgleich, der alle Anfragen entgegennimmt. \u00dcber die API von Kubernetes kann Ingress flexibel bestimmen, wohin diese Anfragen geleitet werden sollen. Sie k\u00f6nnen beispielsweise festlegen, dass alle Anfragen an diesen Host und eine bestimmte URL an diesen Service gesendet werden. Und Anfragen, die an diesen Host und eine andere URL kommen, leiten wir an einen anderen Service weiter. <\/p>\n<p>Das Beste aus Sicht eines App-Entwicklers ist, dass Sie alles selbst verwalten k\u00f6nnen. Mit der Konfiguration von Ingress k\u00f6nnen Sie den gesamten Verkehr, der auf eine bestimmte API trifft, an separate Container weiterleiten, die zum Beispiel in Go geschrieben sind. Der Verkehr, der auf dieselbe Domain, aber auf eine andere URL trifft, kann an Container, die in PHP geschrieben sind und viel Logik enthalten, weitergeleitet werden, diese sind jedoch nicht sehr leistungsf\u00e4hig.<\/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 fehlt jedoch in Nomad. Stattdessen haben wir einen externen Lastenausgleich verwendet: Das kann haproxy, nginx, nginx+ usw. sein. Im Fall von Kubernetes ben\u00f6tigen Sie dieses zus\u00e4tzliche Konzept nicht. Wenn Sie sich jedoch Ingress von innen ansehen, handelt es sich entweder um nginx, haproxy oder traefik, aber integriert in Kubernetes. <\/p>\n<p>Alle von mir beschriebenen Konzepte sind im Grunde genommen Ressourcen, die innerhalb eines Kubernetes-Clusters existieren. Zur Beschreibung dieser Ressourcen wird im Kubernetes-Umfeld das YAML-Format verwendet, das leserlicher und vertrauter ist als die HCL-Dateien bei Nomad. Strukturtechnisch beschreiben sie im Fall eines Pods dasselbe. Sie geben an: Ich m\u00f6chte diese Pods dorthin bereitstellen, mit diesen Images, in dieser Anzahl. <\/p>\n<p><img decoding=\"async\" alt=\"Anwendungen in VM, Nomad und Kubernetes bereitstellen\" src=\"\/wp-content\/uploads\/2019\/05\/13836e7474b377a5e6b05112a53bfedd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDar\u00fcber hinaus haben wir erkannt, dass wir nicht manuell jede einzelne Ressource erstellen m\u00f6chten: Deployments, Services, Ingress und andere. Stattdessen wollten wir bei der Bereitstellung unser gesamtes System in den Begriffen von Kubernetes beschreiben, um nicht alle erforderlichen Ressourcenabh\u00e4ngigkeiten manuell in der richtigen Reihenfolge neu zu erstellen. Helm wurde als das System ausgew\u00e4hlt, das uns dies erm\u00f6glicht. <\/p>\n<h1>Wichtige Konzepte in Helm<\/h1>\n<p>\nHelm ist <b>von KISS ist in Shell geschrieben und umfasst etwa 500 Zeilen Code. Alle Pakete werden aus Quelltexten erstellt. Die Abh\u00e4ngigkeiten werden ber\u00fccksichtigt und zus\u00e4tzliche Patches k\u00f6nnen angewendet werden.<\/b> f\u00fcr Kubernetes. Es \u00e4hnelt der Funktionsweise von Paketmanagern in Programmiersprachen. Damit k\u00f6nnen Sie einen Service speichern, der beispielsweise aus einem nginx-Deployment, einem php-fpm-Deployment, einer Konfiguration f\u00fcr Ingress und ConfigMaps (dies ist ein Element, das es Ihnen erm\u00f6glicht, Umgebungsvariablen und andere Parameter f\u00fcr Ihr System festzulegen) besteht, in Form von sogenannten Charts. <b>l\u00e4uft auf Kubernetes<\/b>. Das hei\u00dft, es handelt sich nicht um ein separates System, sondern einfach um einen weiteren Service, der innerhalb des Clusters ausgef\u00fchrt wird. Sie interagieren \u00fcber die API mit ihm durch einen Konsolenbefehl. Der Vorteil und die Sch\u00f6nheit dabei ist, dass selbst wenn Helm abst\u00fcrzt oder Sie es aus dem Cluster entfernen, Ihre Services nicht verschwinden, da Helm im Grunde nur f\u00fcr den Start des Systems zust\u00e4ndig ist. F\u00fcr die Funktionsf\u00e4higkeit und den Zustand der Dienste ist dann Kubernetes selbst verantwortlich. <\/p>\n<p>Au\u00dferdem haben wir verstanden, dass <b>Templating<\/b>, das wir zuvor selbst durch die Integration von Jinja in unsere Konfigurationen durchf\u00fchren mussten, eine der Hauptfunktionen von Helm darstellt. Alle Konfigurationen, die Sie f\u00fcr Ihre Systeme erstellen, werden in Helm in Form von Vorlagen gespeichert, die ein wenig wie Jinja aussehen, tats\u00e4chlich jedoch die Templating-Sprache Go verwenden, auf der Helm, ebenso wie Kubernetes, geschrieben ist. <\/p>\n<p>Helm f\u00fcgt uns noch einige zus\u00e4tzliche Konzepte hinzu. <\/p>\n<p><b>Chart<\/b> \u2014 das ist die Beschreibung Ihres Services. In anderen Paketmanagern w\u00fcrde man es als Paket, Bundle oder etwas \u00c4hnliches bezeichnen. Hier wird es Chart genannt. <\/p>\n<p><b>Values <\/b>\u2013 das sind die Variablen, die Sie f\u00fcr den Zusammenbau Ihrer Konfigurationen aus den Vorlagen verwenden m\u00f6chten. <\/p>\n<p><b>Release<\/b>. Bei jedem Deployment \u00fcber Helm erh\u00e4lt der Service eine inkrementelle Versionsnummer. Helm merkt sich die Konfiguration des Services aus der vorherigen und der \u00fcbern\u00e4chsten Version und so weiter. Wenn ein Rollback erforderlich ist, gen\u00fcgt es, den Befehl helm rollback mit der Angabe der vorherigen Version auszuf\u00fchren. Selbst wenn die entsprechende Konfiguration in Ihrem Repository zum Zeitpunkt des Rollbacks nicht verf\u00fcgbar ist, beh\u00e4lt Helm trotzdem die Informationen und stellt Ihre Systemkonfiguration auf den Zustand des vorherigen Releases zur\u00fcck. <\/p>\n<p>Wenn wir Helm verwenden, verwandeln sich die \u00fcblichen Konfigurationen f\u00fcr Kubernetes ebenfalls in Templates, in denen Variablen, Funktionen und bedingte Operatoren verwendet werden k\u00f6nnen. So k\u00f6nnen Sie die Konfiguration Ihres Services je nach Umgebung erstellen.<\/p>\n<p><img decoding=\"async\" alt=\"Anwendungen in VM, Nomad und Kubernetes bereitstellen\" src=\"\/wp-content\/uploads\/2019\/05\/b70ba431211038eacf911ba3aee22363.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPraktisch haben wir uns entschieden, etwas anders vorzugehen als in unserem Fall mit Nomad. W\u00e4hrend in Nomad in einem Repository sowohl die Deploy-Konfigurationen als auch die n-Variablen, die ben\u00f6tigt werden, um unseren Service bereitzustellen, gespeichert wurden, haben wir hier entschieden, diese in zwei separate Repositories zu unterteilen. Im Repository \u201edeploy\u201c befinden sich nur die f\u00fcr das Deployment ben\u00f6tigten n-Variablen, w\u00e4hrend im Repository \u201ehelm\u201c die Konfigurationen oder Charts gespeichert werden.<\/p>\n<p><img decoding=\"async\" alt=\"Anwendungen in VM, Nomad und Kubernetes bereitstellen\" 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, wie zum Beispiel Datenbankpassw\u00f6rter, die als Secrets in Kubernetes gespeichert werden, gibt es dennoch einzelne Dinge, auf die wir nicht allen Zugriff gew\u00e4hren m\u00f6chten. Daher ist der Zugriff auf das Repository \u201edeploy\u201c st\u00e4rker eingeschr\u00e4nkt, w\u00e4hrend das Repository \u201ehelm\u201c lediglich die Beschreibung des Services enth\u00e4lt. Aus diesem Grund kann der Zugang zu diesem Repository sicher einem weiteren Personenkreis gew\u00e4hrt werden. <\/p>\n<p>Da wir nicht nur Produktionsumgebungen, sondern auch andere Umgebungen haben, k\u00f6nnen wir durch diese Trennung unsere Helm-Charts wiederverwenden, um Dienste nicht nur in der Produktion, sondern beispielsweise auch in der QA-Umgebung bereitzustellen. Sogar um sie lokal zu starten, verwenden wir <i>Minikube<\/i> \u2014 das ist ein Werkzeug f\u00fcr das lokale Erstellen von Kubernetes. <\/p>\n<p>Innerhalb jedes Repositories haben wir eine Trennung in separate Verzeichnisse f\u00fcr jeden Dienst belassen. Das hei\u00dft, in jedem Verzeichnis befinden sich die Vorlagen, die zu dem entsprechenden Chart geh\u00f6ren und die Ressourcen beschreiben, die ben\u00f6tigt werden, um unser System zu starten. Im Repository \u201edeploy\u201c haben wir nur die Umgebungsvariablen gelassen. In diesem Fall haben wir keine Jinja-Templates verwendet, weil Helm selbst von Haus aus eine Template-Engine bietet \u2013 das ist eine seiner Hauptfunktionen. <\/p>\n<p>Wir haben ein Skript f\u00fcr den Deployment-Prozess \u2013 deploy.sh \u2013 bereitgestellt, das das Starten von Deployments mit Helm vereinfacht und standardisiert. F\u00fcr jeden, der bereitstellen m\u00f6chte, sieht die Deploy-Oberfl\u00e4che genau gleich aus wie bei einem Deployment \u00fcber Nomad. Das gleiche deploy.sh, der Name Ihres Dienstes und das Ziel, wohin Sie es bereitstellen m\u00f6chten. Dadurch wird Helm im Hintergrund ausgef\u00fchrt. Dieses sammelt die Konfigurationsdateien aus den Vorlagen, setzt die erforderlichen Werte aus den values-Dateien ein und f\u00fchrt dann das Deployment in Kubernetes durch. <\/p>\n<h1>Fazit<\/h1>\n<p>\nDer Kubernetes-Dienst wirkt komplexer als Nomad. <\/p>\n<p><img decoding=\"async\" alt=\"Anwendungen in VM, Nomad und Kubernetes bereitstellen\" src=\"\/wp-content\/uploads\/2019\/05\/5a9b5636ab4721acde096fea986ba38b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHier kommt der ausgehende Datenverkehr im Ingress an. Das ist der Front-Controller, der alle Anfragen entgegennimmt und sie anschlie\u00dfend an die entsprechenden Services weiterleitet. Er bestimmt diese basierend auf den Konfigurationen, die Teil der Beschreibung Ihrer Anwendung in Helm sind und die von den Entwicklern festgelegt werden. Der Service sendet die Anfragen an seine Pods, also spezifische Container, und balanciert den eingehenden Datenverkehr zwischen allen Containern, die zu diesem Service geh\u00f6ren. Und nat\u00fcrlich sollten wir nicht vergessen, dass wir die Netzwerksicherheit nicht vernachl\u00e4ssigen sollten. Daher ist im Kubernetes-Cluster eine Segmentierung implementiert, die auf Tagging basiert. Alle Services haben bestimmte Tags, die die Zugriffsrechte der Services auf bestimmte externe\/internen Ressourcen innerhalb oder au\u00dferhalb des Clusters binden. <\/p>\n<p>Bei der Migration haben wir festgestellt, dass Kubernetes alle Funktionen von Nomad bietet, das wir zuvor verwendet haben, und dar\u00fcber hinaus viele neue M\u00f6glichkeiten hinzuf\u00fcgt. Es ist erweiterbar durch Plugins und durch benutzerdefinierte Ressourcenarten. Das bedeutet, dass Sie nicht nur etwas verwenden k\u00f6nnen, das standardm\u00e4\u00dfig mit Kubernetes geliefert wird, sondern auch Ihre eigenen Ressourcen und Dienste erstellen k\u00f6nnen, die diese Ressourcen abfragen. Dies er\u00f6ffnet zus\u00e4tzliche Erweiterungsm\u00f6glichkeiten f\u00fcr Ihr System, ohne dass eine Neuinstallation von Kubernetes erforderlich ist und ohne \u00c4nderungen notwendig sind. <\/p>\n<p>Ein Beispiel f\u00fcr eine solche Nutzung ist Prometheus, das innerhalb unseres Kubernetes-Clusters l\u00e4uft. Um mit dem Sammeln von Metriken eines bestimmten Dienstes zu beginnen, m\u00fcssen wir dem Dienst eine zus\u00e4tzliche Ressource hinzuf\u00fcgen, die als Service-Monitor bezeichnet wird. Da Prometheus in der Lage ist, benutzerdefinierte Ressourcentypen zu lesen, w\u00e4hrend es in Kubernetes l\u00e4uft, beginnt es automatisch, Metriken von neuen Systemen zu sammeln. Das ist sehr praktisch. <\/p>\n<p>Die erste Bereitstellung, die wir in Kubernetes durchgef\u00fchrt haben, fand im M\u00e4rz 2018 statt. Seitdem hatten wir nie Probleme damit. Es l\u00e4uft stabil ohne nennenswerte Fehler. Zudem k\u00f6nnen wir es weiter ausbauen. Aktuell reichen uns die M\u00f6glichkeiten, die es bietet, und wir sind sehr zufrieden mit den Entwicklungsgeschwindigkeiten von Kubernetes. Momentan befinden sich \u00fcber 3000 Container in Kubernetes. Der Cluster l\u00e4uft auf mehreren Nodes. Dabei ist er verwaltbar, stabil und sehr 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 4.9.10 - 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. \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\" \/>\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) 4.9.10\" \/>\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. \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\" \/>\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\udd47Bereitstellung von Anwendungen in VM, Nomad und Kubernetes | ProHoster","description":"Hallo zusammen! Ich bin Pawel Agaletski. Ich arbeite als Teamleiter in dem Team, das das Liefersystem von Lamoda entwickelt. Im Jahr 2018 habe ich auf der HighLoad++ Konferenz gesprochen und heute m\u00f6chte ich die Transkription meines Vortrags pr\u00e4sentieren. Mein Thema besch\u00e4ftigt sich mit den Erfahrungen unseres Unternehmens bei der Bereitstellung von Systemen und Dienstleistungen in verschiedene Umgebungen. Angefangen bei unseren urzeitlichen Zeiten, als wir alle Systeme bereitstellten.","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. \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","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"},"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}]}}