Teil III
Tools und Techniken
In Teil III werden wir uns detailliert mit den Tools und Techniken befassen, die notwendig sind, um Cluster aus Docker-Containern sicher und zuverlässig laufen lassen zu können.
Wir beginnen mit Vernetzung und Service Discovery – eine Aufgabe, die schnell sehr wichtig wird, wenn wir mit Containern arbeiten, die sich auf mehr als einem Host befinden. Oder anders gesagt: Wie finden sich Ihre Container untereinander und wie verbinden Sie sie?
Dann schauen wir uns Softwarelösungen an, die dazu gedacht sind, beim Orchestrieren und Clustern von Containern zu helfen. Mit diesen Tools können Entwickler Probleme wie Load Balancing, Skalieren und Failover angehen, und Operations kann Container schedulen und die Ressourcen so gut wie möglich ausnutzen. Jede länger laufende Anwendung wird sich früher oder später diesen Problemen gegenübersehen – wenn Sie schon vorher wissen, was passieren kann und was für Möglichkeiten es gibt, ist das von entscheidendem Vorteil.
Das letzte Kapitel kümmert sich darum, wie die Sicherheit von Containern und Microservices-Deployments gewährleistet werden kann. Container bringen neue Sicherheitsanforderungen mit sich, bieten aber auch neue Tools und Techniken. Dieser Teil schließt das Buch zwar ab, aber nichtsdestotrotz handelt es sich um ein wichtiges Thema, das sich jeder, der mit Containern zu tun hat, genauer anschauen sollte.
11 Vernetzung und Service Discovery
In einem Containerumfeld kann die Grenze zwischen Service Discovery und Vernetzung erstaunlich unscharf sein. Service Discovery ist der Prozess, Clients1 eines Service mit Verbindungsinformationen (normalerweise IP-Adresse und Port) einer passenden2 Instanz davon zu versorgen. In einem statischen System auf einem Host ist das Problem einfach zu lösen, denn es gibt nur eine Instanz von allem. In einem verteilten System mit mehreren Instanzen von Services, die kommen und gehen, ist das aber viel komplizierter. Eine Möglichkeit ist, dass der Client einfach den Service über den Namen anfordert (zum Beispiel db oder api) und im Backend dann ein bisschen Magie geschieht, die dazu die passenden Daten liefert. Diese »Magie« kann in Form einfacher Ambassador-Container stattfinden, es kann sich um eine Service-Discovery-Lösung wie Consul handeln, eine Networking-Lösung wie Weave (die auch Service-Discovery-Features enthält) oder eine Kombination daraus.
Für unsere Zwecke kann Vernetzung als der Prozess des Verknüpfens von Containern betrachtet werden. Es geht nicht darum, reale Ethernet-Kabel einzustecken, auch wenn häufig ein Softwareäquivalent wie veth im Spiel ist. Containervernetzung beginnt mit der Annahme, dass es eine Route zwischen Hosts gibt – egal, ob diese Route über das öffentliche Internet läuft oder nur über einen schnellen lokalen Switch.
Mit dem Service Discovery können Clients also Instanzen finden, und die Vernetzung kümmert sich darum, die Verbindungen herzustellen. Vernetzungsund Service-Discovery-Lösungen haben häufig gemeinsame Funktionalität, da Service-Discovery-Lösungen auf Ziele im Netz verweisen und Vernetzungslösungen häufig auch Service-Discovery-Features enthalten (wie zum Beispiel Weave). Eine reine Service-Discovery-Lösung wie Consul wird sehr wahrscheinlich mehr Funktionalität in den Bereichen Health Checking, Failover und Load Balancing bieten. Vernetzungslösungen bieten andere Möglichkeiten zum Verbinden und Routen von Containern,3 aber auch Features wie die Verschlüsselung der übertragenen Daten und das Isolieren von Containergruppen.
Sehr häufig werden Sie sowohl eine Service-Discovery- als auch eine Vernetzungslösung einsetzen müssen (und Sie brauchen immer irgendeine Form von Vernetzung). Es hängt von Ihrer Situation ab, was genau benötigt wird, und die Best Practices sind immer noch in der Entwicklung. Die Vernetzung wird sehr wahrscheinlich zwischen Entwicklungs-, Test- und Produktivumgebung verschieden sein, aber beim Service Discovery werden die Entscheidungen meist auf Anwendungsebene getroffen und daher in allen Umgebungen gleich sein.
Dieses Kapitel versucht, die Vernetzungs- und Service-Discovery-Landschaft in allen Komplexitätsstufen vorzustellen, daher beginnen wir mit der einfachsten Cross-Host-Lösung – Ambassador-Containern –, bevor wir uns Lösungen zum Service Discovery anschauen (einschließlich etcd und Consul) und uns dann die Vernetzungsdetails bei Docker und Lösungen wie Weave, Flannel und Project Calico vornehmen.
11.1 Ambassadors
Eine Möglichkeit, Container über Hosts hinweg zu verbinden, ist der Einsatz von Ambassadors.4 Dabei handelt es sich um Proxy-Container, die für den echten Container (oder Service) zur Verfügung stehen und den Verkehr dorthin weiterleiten. Ambassadors bieten die Möglichkeit der Separation of Concerns, was sie in vielen Situationen nützlich macht, nicht nur beim Verbinden von Services zwischen Hosts.
Der größte Vorteil von Ambassador-Containern ist, dass sie es erlauben, die Netzwerkarchitektur im Produktivsystem von der im Entwicklungssystem zu unterscheiden, ohne dass der Code angepasst werden muss. Entwickler können lokale Versionen von Datenbanken und anderen Ressourcen einsetzen und wissen dabei, dass Ops die Anwendung so umkonfigurieren kann, dass ihre eigenen geclusterten Services oder Remote-Ressourcen genutzt werden, ohne etwas am Code ändern zu müssen. Ambassadors können auch während des Einsatzes umkonfiguriert werden, um einen anderen Service einzusetzen, während beim Einsatz von Links für die direkte Verbindung zum Service ein Neustart des Client-Containers notwendig wäre.
Der Nachteil von Ambassador-Containern ist, dass sie ebenfalls konfiguriert werden müssen, für zusätzlichen Overhead sorgen und eine weitere mögliche Fehlerquelle bedeuten. Sie können schnell sehr komplex werden und die Verwaltung erschweren, wenn mehrere Verbindungen erforderlich sind.
In Abbildung 11–1 sehen wir eine typische Entwicklungsumgebung, bei der der Entwickler den Anwendungscontainer mithilfe von Docker-Links direkt mit einem Datenbank-Container verbindet. Beides läuft lokal auf seinem Laptop. Das ist für schnelle Änderungen super, und man kann beim Entwickeln auch Teile wegwerfen und neu anfangen.
Abb. 11–1 Entwicklungsumgebung ohne Ambassadors
In Abbildung 11–2 ist ein übliches Produktiv-Setup zu sehen, bei dem Ops einen Ambassador einsetzt, um die Anwendung mit ihrem Produktivservice zu verbinden...