Es ist kaum falsch zu sagen, dass die besten Leute
Freude durch Leiden gewinnen.
Ludwig van Beethoven

Ich bin Sergey und arbeite bei Yandex.Money in einem Performance-Forschungsteam. Ich möchte Ihnen den Beginn einer Geschichte über unseren Weg zur Verwendung von Orchestrierung erzählen - wie wir Instrumente ausgewählt haben und was wir berücksichtigt haben. Alle Ereignisse aus dem Artikel finden in Echtzeit statt, sodass Sie, liebe Leser, die Entwicklung der Situation fast live verfolgen können.
Warum brauchen wir einen Dirigenten im Team?
Wer ist Dirigent? Von fr. diriger - managen, leiten, führen - in der Welt der Musik - das ist eine Person, die das Lernen und Aufführen von Ensemblemusik anführt. In unserem Fall wird dieser Ort von Orchestrierungs- und Automatisierungssystemen belegt.
Ihre Rolle unterscheidet sich nicht von der des Dirigenten in der Musik - sie werden benötigt, um dem Team zu helfen, sein Spiel zu leiten und zu organisieren.
In der Regel verfügt ein Team über bestimmte Kapazitäten. Nennen wir sie Server, auf denen sie ihre Projekte implementieren.
Der Ansatz zum Erhalt und Betrieb dieser Server ist vielfältig. Einige Beispiele:
- Das Team fordert beispielsweise die Operationsgruppe auf, ihnen Ressourcen mit bestimmten Parametern bereitzustellen.
- Die Betriebsgruppe stellt ihnen die erforderliche Menge zur Verfügung - Cloud oder Bare Metal („Bare Metal“) - und verpflichtet sich, sie gemäß SLA in gutem Zustand zu halten. Die Anpassung wird auch vom Betriebsteam durchgeführt.
- Das Team erhält nur Cloud- oder Bare-Metal-Ressourcen von der Betriebsgruppe und nimmt seine eigenen Einstellungen vor.
- Das Team selbst „kauft“ Ressourcen und unterstützt / konfiguriert sie völlig unabhängig.
Unser Team verwendet Server, die unterstützt werden müssen - aktualisieren Sie das Betriebssystem, installieren Sie neue Pakete usw.
Für uns haben wir sie in zwei Haupttypen unterschieden:
Die Panzergruppe besteht aus Hosts mit Yandex.Tank.
Die Servicegruppe umfasst alles, was mit Wartung zu tun hat. Hierbei handelt es sich um verschiedene Services, die den Freigabezyklus unterstützen, automatische Berichte erstellen usw.
Irgendwann wurde es unpraktisch, dies alles manuell zu verwalten, und wir überlegten, den gesamten Prozess zu automatisieren, angefangen beim „Laden“ der Server bis hin zur Entwicklung, dem Layout und dem Start unseres internen Dienstes.
Warum wird ein Dirigent benötigt, auch wenn das Orchester selbst spielen kann?
Zunächst haben wir Ansible gemeistert und begonnen, unsere Bare-Metal-Server so zu „gießen“, dass sie weniger von Systemadministratoren abhängig sind. Jeder gewinnt hier, wir erwerben neue Fähigkeiten und entlasten Administratoren von dem Teil der Arbeit, den sie immer ohne uns haben. Wir bemühen uns, unser Team so weit wie möglich außerhalb unserer Spezialität und Autonomie zu entwickeln.
Das Unternehmen arbeitet bereits seit langer Zeit mit Ansible zusammen, das bereits eingerichtet und reguliert wurde. Daher haben wir unsere Lösung problemlos in diesen Prozess integriert.
Das Hosting besteht jetzt aus drei Ansible-Rollen:
- Die erste Rolle installiert das Betriebssystem.
- Die zweite Option enthält die Grundeinstellungen für den Host, z. B. die LDAP-Autorisierung.
- und der dritte installiert Yandex.Tank und verwandte Abhängigkeiten im Docker-Container.
Kommen wir zu den Diensten, die wir im Team nutzen.
Für unsere Aufgaben verwenden wir gleichermaßen Kotlin und Python und etwas mehr Golang. Um die Entwicklung und Bereitstellung unserer Dienste zu vereinheitlichen, haben wir beschlossen, sie in Docker-Container zu verpacken. Dies gibt die Freiheit, eine Programmiersprache zu wählen, und regelt gleichzeitig das einheitliche Übermittlungsformat ihrer Anwendung.
Einige der Dienste, mit denen wir interagieren, sind nur über IPv6 verfügbar, daher musste ich herausfinden, wie IPv6 für Container erstellt werden kann.
Gemäß der Dokumentation für ipv6 auf der offiziellen Docker-Website wird ipv6 durch Hinzufügen von Parametern zu daemon.json aktiviert:
{ "ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64" }
In diesem Fall sollte der Anbieter das IPv6-Subnetz ausgeben, das Sie in fixed-cidr-v6.
Wir haben uns jedoch für eine andere Option entschieden - ipv6 NAT, und hier ist der Grund dafür:
- Jetzt kann Docker nicht nur mit IPv6 verwendet werden.
- Das Vorhandensein einer global routbaren Adresse in jedem Container bedeutet, dass alle Ports (auch unveröffentlichte) für alle verfügbar sind, wenn keine zusätzliche Filterung durchgeführt wird.
- Userland-Proxy zum Veröffentlichen von Ports, iptables nur für ipv4 .
ipv6 NAT ist ein Docker-Container , der die Regeln in ip6tables selbst verwaltet und bearbeitet, wenn ein neuer Container hinzugefügt wird.
Damit diese Lösung ordnungsgemäß funktioniert, mussten einige Manipulationen durchgeführt werden. Stellen Sie sicher, dass Sie ip6table_nat auf dem System initialisieren. Das Vorhandensein eines im System installierten Moduls garantiert nicht, dass das Modul beim Start in den Kernel geladen wird. Wir sind darauf gestoßen, als wir diesen Fehler beim Starten eines Containers mit NAT auf einem neuen Host erhalten haben:
2019/01/22 14:59:54 running [/sbin/ip6tables -t filter -N DOCKER --wait]: exit status 3: modprobe: can't change directory to '/lib/modules': No such file or directory ip6tables v1.6.2: can't initialize ip6tables table `filter': Table does not exist (do you need to insmod?)
Das Problem wurde behoben, nachdem die Initialisierung mithilfe des Modprobe-Moduls zur Ansible-Rolle hinzugefügt und beim Start mit lineinfile geladen wurde:
- name: Add ip6table_nat module modprobe: name: ip6table_nat state: present - name: Add ip6table_nat to boot lineinfile: path: /etc/modules line: 'ip6table_nat'
Übrigens gibt es einen guten Artikel über den Haber, der kurz und klar die Vor- und Nachteile einer bestimmten Methode für ipv6 in Docker beschreibt.
Aber zurück zu unserer am Anfang gestellten Frage:
Warum wird ein Dirigent benötigt, auch wenn das Orchester selbst spielen kann?
Jetzt weiß jeder, wie man in unserem Team spielt:
- der Prozess des "Füllens" der Server wird erstellt,
- Entwicklung und Bereitstellung von Diensten sind vereinheitlicht.
Es stellt sich die vernünftige Frage, wie unsere Dienste in Docker-Containern effizient und so automatisiert wie möglich bereitgestellt, aktualisiert und gesteuert werden können.
Trotz der Tatsache, dass jedes Orchestermitglied seinen eigenen Teil kennt, kann er sich verirren und von der ursprünglichen Idee abweichen. Hier kommen wir zu der Tatsache, dass unser Orchester ohne Dirigenten nicht effektiv proben und harmonisch spielen kann. Der Dirigent ist für alle Leistungsparameter verantwortlich, um sicherzustellen, dass alles in einem einzigen Tempo und einer einzigen Stimmung vereint ist.
Wie bekomme ich einen guten Dirigenten mit minimalen Investitionen?
Das Thema Orchestrierung ist auf dem Markt gut entwickelt. Aber zuerst sprechen wir über unterstützende Werkzeuge, die dem Dirigenten helfen können.
Consul ist ein System, das zwei Hauptfunktionen bietet:
- Serviceerkennung
- verteilter Schlüsselwertspeicher.
In unserem Orchester ist der Konsul für die Registrierung der Dienste und die Speicherung ihrer Konfigurationen verantwortlich. Es gibt zwei Registrierungsoptionen:
- Aktiv - In diesem Fall registriert sich der Dienst selbst über die HTTP-API.
- Passiv - Der Dienst muss manuell registriert werden.
Vault ist ein Repository, das den sicheren Speicher standardisiert und vereinheitlicht und mit Geheimnissen arbeitet - Passwörtern, Zertifikaten.
Hier sind die Vorteile, die wir mit diesem Tool erhalten:
- Ein einziges Zentrum zum Erstellen und Aufbewahren von Geheimnissen und zum Verwalten ihres Lebenszyklus über die HTTP-API.
- Transit Secrets Engine - Verschlüsselung-Entschlüsselung von Daten ohne Speicherung. Die Fähigkeit, Daten in verschlüsselter Form über ungesicherte Kommunikationskanäle zu übertragen.
- Greifen Sie auf Richtlinien zu, die bequem zu konfigurieren sind.
- Überprüfen Sie den Zugriff auf Geheimnisse.
- Möglichkeit, eine eigene Zertifizierungsstelle (Certificate Authority) für die Verwaltung selbstsignierter Zertifikate in Ihrer Infrastruktur zu erstellen.
In Anbetracht all unserer Anforderungen passten zwei Optionen zur Rolle des Dirigenten - Kubernetes und Nomad.
Kubernetes
Wie viele Artikel und Bücher bereits über ihn geschrieben wurden (zum Beispiel dieser), wurde berichtet, dass ich kurz schreiben werde - dies ist ein universeller Prozessor, der fast alles kann. Es ist nicht immer einfach, einen Cluster auf Kubernetes einzurichten und zu unterstützen.
Nomad
Das Tool stammt von HashiCorp, einem Unternehmen, das für den oben genannten Konsul und das Tresor bekannt ist.
Nomad schien uns eher einfach zu installieren und zu konfigurieren als Kubernetes. Eine Binärdatei funktioniert sowohl im Server- als auch im Client-Modus. Gleichzeitig deckt Nomad die gesamte Liste der Aufgaben ab, die gelöst werden sollen: Clusterverwaltung, schneller Scheduler, Unterstützung für mehrere Zentren. Wenn wir Konsul und Tresor verwenden, erhalten wir außerdem eine engere Integration, um unsere Dienste zu koordinieren.
Was ist jetzt in Arbeit:
- bereitete die Server für die Bereitstellung von Consul vor,
- Die Konfiguration des Nomadenclusters wird in Consul eingegeben, mit dem Nomaden automatisch bereitgestellt werden sollen.
- Parallel dazu werden wir Vault installieren, um Geheimnisse zu bewahren.
Die Frage im Saal ist, ob es sich lohnt, einen Dirigenten für solche Aufgaben zu haben, oder ob ein Orchester ohne ihn gut ist. Sagen Sie uns in den Kommentaren, was Sie darüber denken.
Abonnieren Sie unseren Blog und bleiben Sie in Kontakt - wir werden Ihnen bald mitteilen, was am Ende passiert ist und ob wir den Nomadencluster so konfiguriert haben, wie wir es wollten.
Besuchen Sie unseren gemütlichen Telegramm-Chatroom, in dem Sie jederzeit um Rat fragen, Kollegen helfen und einfach über Leistungsforschung und mehr sprechen können.