Microservices, Container und CI/CD Toolchain – aber wie geht das denn nun?
Wie schon Christopher Little im DevOps Handbuch sagt: „DevOps is not about automation, just as astronomy is not about telescopes.” Während es also bei DevOps nicht nur um Automatisierung geht, sondern primär um Praktiken, die eine DevOps-Kultur etablieren ist die Automatisierung doch ein wesentlicher Erfolgsfaktor. Schliesslich nutzen wir Technologie, um Zeit für Verbesserungen und Innovationen frei zu bekommen.
Bei der Automatisierung gehen Cloud und DevOps dabei Hand in Hand – und sind viel stärker, wenn sie zusammen angewendet werden. DevOps macht beispielsweise von “Infrastructure as Code” Praktiken gebrauch. Cloud-Anbieter stellen dabei programmierbare Infrastruktur zur Verfügung und anstatt die Infrastruktur manuell zu konfigurieren werden die Konfigurationen vollständig in den Anwendungscode integrieren. Grundsätzlich empfiehlt es sich die Cloud- und DevOps-Transformation auf der Grundlage etablierter Engineering-Praktiken zu beschleunigen, anstatt DevOps neu zu erfinden. Nichtsdestotrotz bedarf es in der Regel die Modifizierung vorhandener Anwendungen für die Cloud, die Entwicklung neuer Cloud nativer Anwendungen und die Transformation der Architektur und Infrastruktur. Microservices-Architekturen sind dabei eine Herangehensweise an die Entwicklung von Software, mit der komplexe Applikationen in einzelne unabhängige Bausteine oder Services aufgeteilt werden. Diese modularen Services können individuell deployed und verwaltet werden, wodurch grosse Applikationen robuster gegenüber Veränderungen werden.
Im Gegensatz zu traditionellen (monolithischen) Architekturen, die darauf abzielen, Software als eine einzelne Einheit aufzubauen, verfolgen Microservices-Architekturen einen modularen Ansatz. Die Software wird also in unterschiedliche Komponenten aufgeschlüsselt, die aus unabhängig voneinander austauschbaren und erweiterbaren Services bestehen. Diese Services können als Prozesse definiert werden, die über ein Netzwerk unter Verwendung von technologieunabhängigen Protokollen (APIs) kommunizieren. Im besten Fall hat jeder Microservice seine eigene Datenbank, damit Verantwortung dezentralisiert und Updates individuell durchgeführt werden können.
Die Idee lose gekoppelter Services, die leicht in der Wartung sind und gleichzeitig einfach getestet werden können, klingt besonders für Unternehmen faszinierend, deren IT-Herausforderungen in zu komplexen Applikationen begründet liegen. Mit ständiger Bereitstellung und Integration, Containern und DevOps ist die Innovationsgeschwindigkeit im Web sehr stark angestiegen, deshalb ist das Microservices-Konzept heute wichtiger denn je. Doch bevor das bestehende System komplett überarbeitet wird, müssen Unternehmen zunächst verstehen, wie Microservices überhaupt funktionieren. Am Anfang steht das Design eines Microservices-Architekturdiagramm, dass für die Abbildung von Abhängigkeiten notwendig ist. Diese wichtige Phase im Design-Prozess stellt sicher, dass sich ein möglicher Systemfehler in einem einzelnen Service-Bereich nicht auf das gesamte System auswirkt.
Vorteile einer Microservice Architektur:
- Die Wartung, Fehlersuche und -Behandlung wird wesentlich einfacher und weniger aufwendig
- Somit erlaubt das Modell einen Modularitätsgrad, mit dem die einzelnen Dienste schneller zu entwickeln, einfacher zu verstehen (agiler) und einfacher zu pflegen sind
- Automatisierungstechniken wie kontinuierlichen Integration & Bereitstellung (CI/CD) wird möglich
- Die unabhängigen Komponenten können für andere Projekte/Services/Features wiederverwendet werden
- Codes und Applikationen sind zugänglicher für Mitarbeiter, die nicht Teil der Entwickler-Teams sind
- Jeder eingesetzte Service kann dupliziert werden (Skalierbarkeit und Resilienz)
- Einzelne Software-Komponenten lassen sich einfacher testen (automatisiertes Testen)
Für die Microservices Governance wird bspw. das Open-Source-Container-Orchestrierungssystem Kubernetes (K8s)eingesetzt, um die Microservices-Architektur zu hosten. Kubernetes bietet eine flexible Plattform sowie CI-Tools und wird gemäss unserer Idee vom PaaS Provider zur Verfügung gestellt.
Container dienen der Kapselung und Isolierung von Applikationen mit allen erforderlichen Systemkomponenten. Sie stellen alle für die Verarbeitung von Programmcode erforderlichen Ressourcen unabhängig von physischen Servern und deren Betriebssystemplattformen zur Verfügung und ermöglichen so einen einfacheren verteilten Einsatz sowie eine einfache und schnelle Portierbarkeit. Container (z.B. Docker) passen perfekt zu einem auf Microservices basierten Software-Architekturansatz und reduzieren den Provider-Lock-In da man seine Programme in den Containern schnell und meist ohne grössere Abhängigkeiten von A nach B verschieben kann. Wenngleich Container in der Linux- und Provider-Welt seit langem bekannt sind und auch benutzt hat sich Container-Virtualisierung erst mit dem Erscheinen von Docker flächendeckend durchgesetzt. Das gilt vor allem deshalb, weil Docker im DevOps-Umfeld, in dem sich Administratoren zwangsläufig mit unterschiedlichen Laufzeitumgebungen, Configuration-Management-Werkzeugen, Paketformaten und Deployment-Strategien auseinandersetzen müssen, für einheitliche Standards sorgt.
Ein wichtiger Punkt bei Microservices ist, dass jeder Microservice seine zugehörigen Daten besitzt und daher eine eigene Datenbank haben sollte. Datenbanken können bspw. auf regulären eigenständigen Servern in lokalen Clustern oder in PaaS-Diensten in der Cloud verwendet werden. Die Datenbanken können sich dabei an einem beliebigen Ort befinden. In diesem Fall befinden sie sich alle im selben Container, um den Arbeitsspeicherbedarf von Docker so gering wie möglich zu halten. Microsoft stellt bspw. seinen SQL-Server auch als Container-Image zur Verfügung, der dann in einer Containerumgebung auf Basis von Docker läuft. Diesen Punkt müssen wir sicher noch mit den Experten klären (SWOT).
Mit einer CI/CD-Pipeline (“Continuous Integration, Continuous Delivery und Continuous Deployment”) kombiniert, realisiert man in Container-Umgebungen fabrikähnliche Verfahren von der Software-Entwicklung, über das Testing bis hin zum automatisierten Deployment von Software (DevOps). Microservices und ihre Bündelung in Containern haben also nicht nur hohe Effizienzpotenziale. Sie helfen auch dabei, dass Ihr Euch nicht in Abhängigkeiten von (Cloud-) Anbietern begeben müsst. Alle Hyperscaler bieten PaaS-Lösungen.
Ich freue mich auf Eure Ergänzungen und Kommentare.
Liebe Grüsse Euer Ralf