Innovative Anwendungstechnologie für Clouds
Neue IT- und Netzwerktechnologien haben zu einem wichtigen Paradigmenwechsel in der Softwareindustrie geführt. Die Software ist eine zentrale Komponente jedes komplexen Systems. Die Softwarequalität zeichnet sich nicht nur durch den Funktionsumfang und die implementierten Features aus, sondern liegt primär in der Softwarearchitektur. Neue Kommunikationstechnologien wie eCommerce, mobiles Internet und Cloud-Technologien stellen zusätzliche Anforderungen an die Interoperabilität, Flexibilität, Skalierbarkeit, Wartbarkeit und Sicherheit von implementierten Softwarelösungen. Um den wachsenden Markt- und Kundenanforderungen gerecht zu werden, sind neue Lösungsansätze bei Softwareentwicklung und in Softwarearchitekturen unumgänglich.
Das Problem
Die Softwarekomponenten eines komplexen Systems müssen miteinander kommunizieren. Ein verteiltes System kann Hunderte Services und Tausende Service-Instanzen als Komponenten beinhalten. Die Kommunikationswege der Komponenten und deren Transaktionen (Requests, Responses) sind nicht immer fest definierbar und nicht im Voraus vorhersagbar. Auch die Komplexität von einzelnen Komponenten ist groß. Moderne Softwarekomponenten (Apps) müssen über eine ausreichende Intelligenzfähigkeit verfügen, um eine optimale Entscheidung in jeder möglichen Situation zu treffen. Dabei geht es nicht nur um eine optimale lokale Datenverarbeitung im klassischen Sinne, sondern um eine optimale und sichere Kommunikation der Softwarekomponenten miteinander. Einzelne Aufgaben einer Applikationen werden als Services implementiert. Um die Kommunikationsaufgaben wahrzunehmen, sind diese Services mit entsprechenden Schnittstellen (Interfaces, APIs) ausgestattet. Trotzdem müssen Anwendungskomponenten weiter aufgeteilt, spezialisiert und strukturiert werden.
Definition Service Mesh
Das Komplexitätsproblem kann am besten mit Hilfe von den in der Software implementierten speziellen Microservices, Control Planes und Software-Proxys gelöst werden – einem sogenannten Service Mesh. Ein Service Mesh realisiert das aus dem Network Engineering bekannte Schichtenmodell, in dem jede Schicht (Layer) als ein eigenständiger Service funktioniert und seine spezifischen Aufgaben löst. Mit dem Schichtenmodell ermöglicht das es einen Service-basierten Ansatz in der Softwarearchitektur. Die typischen Aufgaben sind Service Discovery, Load Balancing, Health Checks (Self-Checking) und Access Control (Authentication, Policies, Security). Mit dem Konzept Service Mesh sind Service-basierte Architekturen (Service-oriented Architecture, SOA), SaaS (Software-as-a-Service) Technologien, Container-Technologien (Microservices) und SDN-Netzwerke (Software-defined Networking) eng verbunden beziehungsweise verwandt.
Service Mesh ermöglicht eine sichere, schnelle und zuverlässige Interaktion zwischen autorisierten Microservices und wird als eine dedizierte Infrastrukturschicht realisiert. Im Unterschied zu einzelnen Microservices und Containern baut ein es eine Art Microservices-Infrastruktur auf und übernimmt die Aufgaben einer sicheren und optimalen Kommunikation der teilnehmenden Microservices. Das Service Mesh benutzt dabei standardisierte Schnittstellen und Protokolle. Jedem berechtigten Microservice stellt es die erforderlichen Ressourcen und Dienste effizient und sicher zur Verfügung. Die Stärke des Service-Mesh-Modells liegt in seiner Infrastrukturfähigkeit.
Wann ist ein Service Mesh sinnvoll?
Einsatz ist für komplexe, anspruchsvolle und sicherheitskritische verteilte Anwendungen sinnvoll, wenn die Anzahl der Microservice-Instanzen zu groß ist und erhöhte Anforderungen an Interoperabilität, Flexibilität, Skalierbarkeit, Konfigurierbarkeit, Wartbarkeit und Sicherheit gestellt werden. Das Service Mesh trennt die Kommunikations-, Transaktions- und Sicherheitsaufgaben einer verteilten Anwendung von der Datenverarbeitung und Präsentation. Seine Aufgaben realisiert das es als Services, die es jedem autorisierten Microservice zur Verfügung stellt. Die Kommunikation jedes einzelnen Microservice mit der Außenwelt erfolgt durch einen eingebetteten Software-Proxy, der die Kommunikations- und Sicherheitsaufgaben übernimmt und die erforderlichen Daten und Transaktionen über die standardisierten Schnittstellen weiterleitet. Ein Service Mesh macht komplexe verteilte Anwendungen agil, flexibel, transparent und sicher.
Dabei ist es noch keine ausgereifte und verbreitete Softwaretechnologie. Obwohl die Technologie strategisch richtig ist und direkt zur Industrie 4.0 führt, sind ihre betrieblichen Einsätze noch vereinzelt und isoliert. Man kann noch keine Best-Practice-Erfahrungen nachweisen, um die Entwicklung mit dieser Technologie zu beschleunigen und mögliche Implementierungsfehler und -schwierigkeiten zu vermeiden. Trotzdem eignet sich dieser technologischer Weg für ambitionierte innovative Großunternehmen, die mit der herkömmlichen Microservices-Technologie schnell an ihre Grenzen stoßen und mehr Flexibilität, Agilität und Transparenz erreichen wollen.
Service Mesh ist verantwortlich für eine zuverlässige Übermittlung von Anfragen (Requests) und Zustellung von Antworten (Responses) über eine Cloud-Topologie. Für die Anwendungsservices stellt Service Mesh eine anwendungseigene Infrastruktur und die Infrastrukturdienste zur Verfügung, die eine moderne Anwendung zum Funktionieren in der Cloud braucht. Es ist für neue anspruchsvolle und sicherheitskritische Anwendungen am besten geeignet, die speziell für Cloud-Netzwerke entwickelt werden.
Wie funktioniert ein Service Mesh und was unterscheidet ihn von Microservices?
Ein Service Mesh löst die Aufgaben der Control Plane und kontrolliert die komplette Datenkommunikation im Auftrag der Microservices. Es baut für die Microservices eine Software-gestützte virtualisierte Netzwerkinfrastruktur auf und stellt den Microservices zahlreiche Infrastruktur-Services zur Verfügung. Zu typischen Services gehören Service Discovery, Authentifizierung, Verschlüsselung (mTLS u.a.), Load Balancing und Access Control.
Dabei verwendet es dynamische Routing-Regeln, um den Empfänger der Anfrage (des Requests) zu bestimmen. Nachdem der gewünschte Empfänger gefunden wurde, fordert er den entsprechenden Pool von Instanzen vom Discovery-Service des entsprechenden Endpunkts an. Wenn diese erhaltene Information mit der eigenen Information nicht übereinstimmt, entscheidet es, welcher Informationsquelle zu vertrauen. Basierend auf einer Reihe von Faktoren wie z.B. Verzögerungen der letzten Anforderungen wählt das Service Mesh die Instanz aus, die eine wahrscheinlich schnelle Antwort (Response) zurückgibt. Wenn die Zielinstanz ständig Fehler zurückgibt, entfernt es sie aus dem Load-Balancing-Pool und überprüft sie in Zukunft regelmäßig (die Störung kann kurzfristig sein). Wenn das für den Request vorgesehene Timeout auftritt, gibt es einen kritischen Anforderungsfehler zurück und versucht nicht, dieselbe fehlgeschlagene Transaktion zu wiederholen. Das Service Mesh protokolliert das beobachtete Kommunikationsverhalten in Form von Metriken und Tracking und sendet diese Daten an ein zentrales Metriksystem.
Um eine bessere Strukturierung zu schaffen, wird die Anwendungsschicht einer Komponente in mehrere kleinere Dienste unterteilt. Diese sind als Microservices bekannt. Von einem Microservice unterscheidet sich das Service Mesh darin, dass jeder Microservice-Instanz ein eigener (sprich “persönlicher”) eingebetteter Layer7-Proxy zur Verfügung steht. Das Paar aus einem Microservice und einem zuständigen Service-Mesh-Proxy befindet sich in einem demselben Container. Der Service-Mesh-Proxy vereint die Funktionalitäten eines Proxy-Servers und eines Reverse-Proxy-Servers, führt alle Kommunikationen und Transaktionen im Auftrag des Microservice aus sowie leitet ankommende externe Anfragen an den Microservice weiter. Als die Außenwelt kennt der Microservice nur seinen Service-Mesh-Proxy und kommuniziert ausschließlich mit dem Proxy, nicht mit der Cloud. Somit sind die Data Plane (Datenebene) und die Control Plane (Steuerungsebene) in einem Service-Mesh-Container effektiv voneinander getrennt. Zu den zusätzlichen Infrastrukturaufgaben eines Service Mesh gehören Tracing, Traffic Control und Erfassung von Metriken.
In einem Service Mesh sind die Infrastruktur-Funktionen an Control Plane verlagert. Durch diese funktionale Entlastung wird jeder Microservice schlanker und weniger komplex. Ohne Unterstützung von Service Mesh mussten Microservice-Monolithen die Infrastruktur-Funktionen (Sicherheit, Networking) selbst implementieren und ausführen.
Eigenschaften und Besonderheiten eines Service Mesh
Das Zusammenspiel von Microservices zu organisieren und zu orchestrieren ist nicht nur ein komplexer Prozess, sondern auch eine fundamentale Eigenschaft eines Service Mesh. Während das TCP-Protokoll (Layer 4) einzelne Transportfehler der Kommunikation behandelt, muss das Service Mesh auch Netzwerkausfälle behandeln, um die Zuverlässigkeit der Anwendungsfunktionen aufrechtzuerhalten und mögliche Kommunikationsprobleme in Echtzeit zu lösen.
Eine Besonderheit von Service Mesh ist es, dass es als ein Netzwerkmodell komplett auf der Protokollschicht 7 (Application Layer des ISO/OSI-Schichtenmodells) untergebracht und realisiert ist. Jede Service-Mesh-Instanz funktioniert als ein eingebetteter Layer7-Proxy und bedient seine Microservice-Instanz, für die es zuständig ist und mit der es paarweise auf einem Host zusammenarbeitet.
Während traditionelle Netzwerkanwendungen wie Client-Server-Applications eine externe Netzwerkinfrastruktur sowie die Sicherheit und Zuverlässigkeit dieser Infrastruktur einfach voraussetzen, stellt das Service Mesh der Anwendung eine virtualisierte Netzwerkinfrastruktur zur Verfügung und liefert zusätzliche Sicherheitsfunktionen wie Load Balancing, Access Control, Authentication und Datenverschlüsselung. Das Service Mesh ist auf einer separaten Infrastruktur-Service-Schicht derselben Anwendung realisiert und verfügt über die erforderlichen standardisierten Schnittstellen. Die eine Schnittstelle dient für die Kommunikation mit der Anwendungsinstanz und die andere für die Kommunikation mit dem Cloud-Netzwerk im Auftrag der Anwendungsinstanz.
Das Service Mesh ist von der Anwendungsschicht separiert und übernimmt alle netzwerkrelevanten Funktionen, die die Komponenten der verteilten Anwendung für eine sichere und zuverlässige Kommunikation in Clouds brauchen. Das Service Mesh löst jedes aufgetretene Netzwerkproblem (einen Protokollfehler, einen Ausfall) und findet intelligent und in Echtzeit eine optimale Lösung. Solange Alternativlösungen existieren und möglich sind, funktioniert die Anwendung ungestört weiter und bekommt von den aufgetretenen Kommunikationsstörungen nichts mit, als ob nichts passiert wäre.
Die Kombination aus Komplexität und Kritikalität einer verteilten Anwendung führt dazu, dass eine dedizierte Schicht für die Interaktion zwischen den Microservices erforderlich ist. Diese Schicht, die als ein spezieller Kommunikationsservice auf demselben Host implementiert ist, ist vom Anwendungscode getrennt und heißt Service Mesh.
Wie kann man Service Mesh beim Entwickeln nutzen und implementieren?
Bei Umsetzung eines Service Mesh liegt die Hauptaufgabe eines Entwicklers in der Konzeption, Topologie und dem Konfigurationsmodell, jedoch nicht im Coding. Es sind mehrere Service-Mesh-Werkzeuge zur Umsetzung und zum Management eines Service Mesh verfügbar. Die bekanntesten Vertreter dieser Werkzeuge sind:
- Istio (von Google, IBM, Lyft)
- Linkerd (Linkerd 1 und 2 von Buoyant; Open-Source Projekt; unter der Apache-2.0-Lizenz verfügbar; Linkerd 2 beschränkt sich auf Kubernetes)
- Consul Service Mesh (von HashiCorp)
- Red Hat OpenShift Service Mesh (Istio + Jaeger als Tracing-System + Kiali zur Visualisierung)
Die Topologie, Policies und ACL-Regeln sind mit diesen Tools definierbar und konfigurierbar, sodass kein Programmieraufwand für Dich entsteht. Für spezielle Aufgaben gibt es zusätzliche Tools wie Prometheus (Monitoring) und Zipkin (Tracing). Die Service-Mesh-Topologie kannst Du mit einem Tool wie Kiali visualisieren.
Mit Linkerd kannst Du ein schlankes Service-Mesh schnell und ohne großen Aufwand entwickeln. Die Implementierung verfügt über eine minimale Konfiguration und bietet sofort Mehrwert. Das ist sehr wichtig, weil erhöhte Komplexität der Konfiguration eine bekannte Schwachstelle von Service-Mesh-Lösungen ist.
Microsoft, HashiCorp, Buoyant und Solo.io haben gemeinsam eine API-Spezifikation für Service-Mesh entwickelt – das Service Mesh Interface (SMI). Das SMI wird von Istio und Linkerd unterstützt. Zum Schnelleinstieg und zur Implementierung eines Service Mesh helfen Dir am besten die offiziellen Tutorials von Istio und Linkerd.
Fazit
Auf dem Weg von monolithischen Apps durch Container und Microservices zu einem Service Mesh werden die Flexibilität, Strukturierbarkeit und Wartbarkeit von verteilten Anwendungen deutlich verbessert und das Architekturniveau erhöht. Das Service-Mesh-Modell trägt zur Erhöhung der Stabilität, Verwaltbarkeit, Kommunikationssicherheit und Ausfallsicherheit bei. Verteilte Anwendungen, die nach dem Konzept von Service Mesh aufgebaut und implementiert sind, verzichten generell auf ein traditionelles Client-Server-Modell und sind für Cloud-Umgebungen am besten geeignet.
Cloud-basierte Netzwerktechnologien und Service-Mesh-Anwendungen passen ideal zusammen und werden ihre Weiterentwicklung und ihren Erfolgskurs gemeinsam fortsetzen. Obwohl die Service-Mesh-Technologie noch in den Kinderschuhen steckt und für einen breiten Markteinsatz noch nicht ausgereift ist, hat das Cloud Mesh die besten Chancen, das Client-Server-Modell auf dem Cloud-Marktsegment abzulösen, den Markt in der nahen Zukunft zu erobern und zu einer führenden Anwendungstechnologie für Clouds zu werden.
Damit ein Service Mesh die Erwartungen erfüllt und seine Orchestrierungsaufgaben reibungslos, fehlerfrei und transparent ausführen kann, müssen die Infrastruktur-Services, die API-Schnittstellen und die verwendeten Protokolle in allen beteiligten App-Komponenten (Microservices, Proxys) einheitlich, konsistent und standardkonform implementiert sein. Um die Zukunft dieser zukunftsorientierten Technologie zu sichern, sollte sich das Service Mesh als Vorreiter der Cloud-Technologie etablieren und sich selbst zu einem industriellen Standard für verteilte Cloud-basierte Anwendungen entwickeln.