Es wÀre kaum falsch zu sagen, dass die besten Menschen
Freude durch Leiden finden.
Ludwig van Beethoven

Ich bin Sergey, arbeite bei Yandex.Money im Team fĂŒr Leistungsforschung. Ich möchte Ihnen den Anfang einer Geschichte ĂŒber unseren Weg zur Nutzung von Orchestrierung erzĂ€hlen â wie wir die Werkzeuge ausgewĂ€hlt haben und was dabei zu berĂŒcksichtigen war. Alle Ereignisse in dem Artikel geschehen in Echtzeit, daher können Sie, liebe Leser, die Entwicklung der Situation fast live verfolgen.
Warum brauchen wir einen Dirigenten im Team?
Was ist ein Dirigent? Von frz. diriger â leiten, anweisen, fĂŒhren â in der Musikwelt ist es eine Person, die das Einstudieren und AuffĂŒhren von Ensemblemusik leitet. In unserem Fall werden diese Aufgaben von Orchestrierungs- und Automatisierungssystemen ĂŒbernommen.
Ihre Rolle unterscheidet sich nicht von der Rolle eines Dirigenten in der Musik â sie sind notwendig, um das Team zu unterstĂŒtzen, zu leiten und sein Spiel zu organisieren.
In der Regel verfĂŒgt das Team ĂŒber einen bestimmten Satz an KapazitĂ€ten â nennen wir sie Server, auf denen sie ihre Projekte umsetzen.
Der Ansatz zur Beschaffung und Nutzung dieser Server ist vielfÀltig. Hier sind einige Beispiele:
- Das Team stellt eine Anfrage, beispielsweise an die Betriebsgruppe, um ihnen Ressourcen mit bestimmten Parametern bereitzustellen.
- Die Betriebsgruppe stellt ihnen die erforderliche Menge zur VerfĂŒgung â Cloud oder Bare Metal (ânackte Hardwareâ) â und verpflichtet sich, diese gemÀà SLA in gutem Zustand zu halten. Die Einrichtung erfolgt ebenfalls durch die Betriebsgruppe.
- Das Team erhÀlt nur Cloud- oder Bare-Metal-Ressourcen von der Betriebsgruppe, die Einrichtung erfolgt selbst durch das Team.
- Das Team "erwirbt" die Ressourcen selbst und betreut/einrichtet diese vollstÀndig eigenstÀndig.
In unserem Team werden Server genutzt, die in Stand gehalten werden mĂŒssen â Betriebssysteme aktualisieren, neue Pakete installieren usw.
Wir haben sie in zwei Haupttypen unterteilt:
- Tankgruppe,
- Servicegruppe.
Die Tankgruppe besteht aus Hosts mit Yandex.Tank.
Die Servicegruppe umfasst alles, was mit Wartung zu tun hat â verschiedene Dienste zur UnterstĂŒtzung des Release-Zyklus, zur Erstellung automatischer Berichte usw.
Eines Tages wurde es unpraktisch, all dies manuell zu verwalten, und wir dachten ĂŒber die Automatisierung des gesamten Prozesses nach, angefangen bei der "BefĂŒllung" der Server bis hin zur Entwicklung, Bereitstellung und dem Start unseres internen Dienstes.
Warum ist ein Dirigent notwendig, selbst wenn das Orchester selbst spielen kann?
ZunĂ€chst haben wir Ansible erlernt und begonnen, unsere Bare-Metal-Server zu "befĂŒllen", um weniger abhĂ€ngig von Systemadministratoren zu sein â alle profitieren davon, wir erwerben neue FĂ€higkeiten und entlasten die Administratoren von einem Teil der Arbeit, die sie auch ohne uns immer genug haben. Wir streben danach, uns auĂerhalb unserer Spezialisierung weiterzuentwickeln und die Autonomie des Teams so weit wie möglich zu fördern.
In der Firma ist die Arbeit mit Ansible bereits seit lÀngerer Zeit eingerichtet und reglementiert, daher haben wir unsere Lösung problemlos in diesen Prozess integriert.
Derzeit besteht die BefĂŒllung der Hosts aus drei Ansible-Rollen:
- Die erste Rolle installiert das Betriebssystem,
- die zweite wendet grundlegende Einstellungen fĂŒr den Host an, beispielsweise LDAP-Authentifizierung,
- und die dritte installiert Yandex.Tank und die zugehörigen AbhÀngigkeiten in einem Docker-Container.
Kommen wir zu den Diensten, die wir im Team verwenden.
FĂŒr unsere Aufgaben nutzen wir gleichermaĂen Kotlin und Python, und auch ein wenig Golang. Um die Entwicklung und Bereitstellung unserer Dienste zu vereinheitlichen, haben wir beschlossen, sie in Docker-Container zu verpacken. Das ermöglicht uns die Freiheit, die Programmiersprache zu wĂ€hlen und reguliert gleichzeitig ein einheitliches Format fĂŒr die Lieferung unserer Anwendungen.
Eine kleine Anmerkung zu IPv6 in Docker
Ein Teil der Dienste, mit denen wir interagieren, ist nur ĂŒber IPv6 erreichbar, deshalb mussten wir herausfinden, wie man IPv6 fĂŒr Container einrichtet.
Laut der IPv6-Dokumentation auf der offiziellen Docker-Website wird IPv6 aktiviert, indem man Parameter zu daemon.json hinzufĂŒgt:
{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
}Dabei muss der Anbieter ein IPv6-Subnetz bereitstellen, das Sie in fixed-cidr-v6 eintragen.
Wir haben jedoch eine andere Variante gewĂ€hlt â IPv6 NAT, und das aus folgenden GrĂŒnden:
- Derzeit kann Docker Das Vorhandensein einer global routierbaren Adresse in jedem Container bedeutet, dass alle Ports (auch nicht veröffentlichte) fĂŒr alle zugĂ€nglich sind, es sei denn, eine zusĂ€tzliche Filterung erfolgt.
- Userland-Proxy zur Veröffentlichung von Ports,
- iptables nur fĂŒr IPv4 .
Docker-Container , der selbst die Regeln in ip6tables verwaltet und sie beim HinzufĂŒgen eines neuen Containers Ă€ndert.
Um diese Lösung korrekt zum Laufen zu bringen, waren einige weitere Manipulationen erforderlich. Es ist unbedingt notwendig, ip6table_nat im System zu initialisieren. Das Vorhandensein des Moduls im System garantiert nicht, dass es beim Start geladen wird. Wir sind auf dieses Problem gestoĂen, als wir beim Starten eines Containers mit NAT auf einem neuen Host folgenden Fehler erhielten:
2019/01/22 14:59:54 ausfĂŒhren [/sbin/ip6tables -t filter -N DOCKER --wait]: Exit-Status 3: modprobe: Kann das Verzeichnis nicht Ă€ndern zu '/lib/modules': Datei oder Verzeichnis nicht gefunden
ip6tables v1.6.2: kann die ip6tables-Tabelle `filter` nicht initialisieren: Tabelle existiert nicht (mĂŒssen Sie insmod verwenden?)Das Problem wurde behoben, nachdem wir die Initialisierung in die Ansible-Rolle mit dem Modifikationsmodul modprobe und dem Laden beim OS-Start mit lineinfile hinzugefĂŒgt hatten:
- name: ip6table_nat-Modul hinzufĂŒgen
modprobe:
name: ip6table_nat
state: present
- name: ip6table_nat zum Booten hinzufĂŒgen
lineinfile:
path: /etc/modules
line: 'ip6table_nat'Ăbrigens gibt es auf Habr eine gute , die kurz und klar die Vor- und Nachteile der verschiedenen Methoden fĂŒr die Arbeit mit ipv6 in Docker beschreibt.
Aber lassen Sie uns zu unserer eingangs gestellten Frage zurĂŒckkehren:
Warum ist ein Dirigent notwendig, selbst wenn das Orchester selbst spielen kann?
Jetzt wissen alle, wie man in unserem Team spielt:
- der Prozess des âEinspielensâ von Servern wurde geschaffen,
- die Entwicklung und das Deployment von Diensten sind vereinheitlicht.
Es stellt sich die berechtigte Frage â wie können wir unsere Dienste in Docker-Containern effektiv und maximal automatisiert deployen, aktualisieren und ĂŒberwachen?
Obwohl jeder Teilnehmer des Orchesters seine Stimme kennt, kann er sich irren und von der ursprĂŒnglichen Idee abweichen. Hier kommen wir zu dem Punkt, dass unser Orchester ohne Dirigenten nicht effektiv proben und harmonisch spielen kann. Der Dirigent ist verantwortlich fĂŒr alle Parameter der AusfĂŒhrung, dafĂŒr, dass alles in einem einheitlichen Tempo und Stimmung vereint ist.
Wie erhÀlt man mit minimalen Investitionen einen guten Dirigenten?
Das Thema Orchestrierung ist auf dem Markt ziemlich gut entwickelt. Aber zuerst sprechen wir ĂŒber die Hilfsmittel, die dem Dirigenten helfen können.
â ein System, das zwei Hauptfunktionen bietet:
- Dienstentdeckung (service discovery),
- verteiltes SchlĂŒssel-Wert-Speicher.
In unserem Orchester wird Consul fĂŒr die Registrierung der Dienste und die Speicherung ihrer Konfigurationen zustĂ€ndig sein. Es gibt zwei Varianten der Registrierung:
- Aktiv â das ist, wenn sich der Dienst selbst mit HTTP API registriert;
- Passiv â der Dienst muss manuell eingetragen werden.
Vault ist ein Repository, das die sichere Speicherung und Verwaltung von Geheimnissen â Passwörter, Zertifikate â standardisiert und vereinfacht.
Hier sind die Vorteile, die wir durch die Verwendung dieses Tools erhalten:
- Zentrales Repository zur Erstellung und Speicherung von Geheimnissen, Verwaltung ihres Lebenszyklus ĂŒber eine HTTP-API.
- Transit Secrets Engine â VerschlĂŒsselung und EntschlĂŒsselung von Daten ohne deren Speicherung. Möglichkeit zur Ăbertragung von Daten in verschlĂŒsselter Form ĂŒber ungesicherte KommunikationskanĂ€le.
- Zugriffsrichtlinien, die einfach konfiguriert werden können.
- Zugriffsprotokollierung fĂŒr Geheimnisse.
- Möglichkeit zur Erstellung einer eigenen CA (Zertifizierungsstelle) zur Verwaltung von selbstsignierten Zertifikaten innerhalb der eigenen Infrastruktur.
Angesichts aller unserer Anforderungen kamen zwei Optionen fĂŒr die Rolle des Orchestrators in Betracht â Kubernetes und Nomad.
Kubernetes
Wie viele Artikel und BĂŒcher bereits darĂŒber geschrieben wurden (hier , beispielsweise), wie viele PrĂ€sentationen gehalten wurden, möchte ich kurz zusammenfassen â es ist eine universelle Lösung, die nahezu alles kann. Der Preis dafĂŒr sind nicht immer einfache Einstellungen und die Verwaltung des Clusters unter Kubernetes.
Nomad
von HashiCorp, einem Unternehmen, das fĂŒr die oben genannten Produkte Consul und Vault bekannt ist.
Nomad erschien uns einfacher in der Installation und Konfiguration als Kubernetes. Eine einzelne BinĂ€rdatei funktioniert sowohl im Server- als auch im Clientmodus. Dabei deckt Nomad die gesamte Liste von Aufgaben ab, die wir möchten, dass es löst: Clusterverwaltung, schneller Scheduler, UnterstĂŒtzung fĂŒr mehrere Datenzentren. AuĂerdem erhalten wir durch die Verwendung von Consul und Vault eine engere Integration zur Orchestrierung unserer Dienste.
Was derzeit in Arbeit ist:
- Server fĂŒr das Deployment von Consul vorbereitet,
- In Consul wird die Konfiguration des Nomad-Clusters eingetragen, mit der Nomad automatisch bereitgestellt werden soll,
- parallel werden wir Vault fĂŒr die Speicherung von Geheimnissen installieren.
Die Frage an den Saal â sollte man fĂŒr solche Aufgaben einen Orchestrator einsetzen oder funktioniert die Orchestrierung auch ohne ihn gut? Teilen Sie uns in den Kommentaren mit, was Sie darĂŒber denken.
Abonnieren Sie unseren Blog und bleiben Sie in Kontakt â bald erzĂ€hlen wir, was letztendlich herausgekommen ist und ob wir den Nomad-Cluster so eingerichtet haben, wie wir es wollten.
Besuchen Sie unseren gemĂŒtlichen , wo Sie immer um Rat fragen, Kollegen helfen und einfach ĂŒber Leistungstests und mehr plaudern können.
Quelle: habr.com
