Über unsMediaKontaktImpressum
Michael Braam 05. Januar 2021

Containerisierung – Deployment von Softwarelösungen für agile IT-Entwicklungsumgebungen

Mit der Formel "Runs here, runs everywhere" lassen sich Flexibilität und dynamische Skalierbarkeit in der Bereitstellung sowie im laufenden Betrieb realisieren.

Implementation, Wartung und Updates von Applikationen und Services gehören zu den klassischen Fallstricken für IT-Entwickler: In der Entwicklungsumgebung lief noch alles tadellos – und nach dem Go-live beim Kunden hakt das System, weil irgendeine Kleinigkeit in der IT-Umgebung der Anwender unvorhergesehene Folgen hat. Abhilfe verspricht die Container-Technologie: Container versetzen Softwareentwickler in die Lage, ihre Applikationen und Services zu paketieren, also alle zur Ausführung unverzichtbaren Elemente in eine gemeinsame Box zu stecken. Solch eine Lösung enthält deshalb bereits alles, was für die einfache Bereitstellung und den reibungslosen Betrieb der Lösung benötigt wird. Damit eignet sich der Container-Ansatz für eine Vielzahl unterschiedlicher Einsatzszenarien: Container unterstützen Entwickler bei der Umsetzung von komplexen Microservice-Architekturen ebenso wie bei der Arbeit nach dem DevOps-Modell.

Der größte Vorteil des Konzepts Containerisierung lässt sich auf folgende einfache Formel bringen: "Runs here, runs everywhere". Das bedeutet, wenn ein Container auf dem System des Entwicklers läuft, läuft er unverändert auch auf dem System des Kunden. Die dahinterstehende Funktionsweise lässt sich mit einem Seitenblick auf das namensgebende Konzept aus der Logistik erklären. Um die internationalen Lieferketten reibungslos funktionieren zu lassen, hat sich die Standardisierung von Versandprozessen bewährt. Wichtiges Element dabei sind die allseits bekannten Versandcontainer. Sie haben normierte Maße – der meist genutzte ISO-Container ist 8 Fuß (2,44 Meter) hoch und 40 Fuß (12,19 Meter) lang – und besitzt immer identische Sicherheitsfunktionen. Das heißt, die Ladungssicherung erfolgt immer an den gleichen Sicherungspunkten. Zudem verfügt jeder einzelne Container über eine eigene Identifikationsnummer.

In der Softwareentwicklung kann ein Container analog zu seinem Namensvetter aus der Logistik als ein Behälter betrachtet werden, in den ein Entwickler alles hineinpackt, was er für den Betrieb einer Applikation und zur Auflösung von Abhängigkeiten zu Fremdsystemen benötigt. Dieser Behälter lässt sich beliebig oft klonen und ermöglicht so ein schnelles Roll-out der Anwendung ebenso wie eine einfache Skalierung im Fall von Nachfragespitzen.

Container werden vielfach mit virtuellen Maschinen (VM) verglichen. Doch wo liegt eigentlich der grundlegende Unterschied? Ein kleines Beispiel verschafft hier Klarheit: Verglichen mit Wohngebäuden entspricht eine VM einem Haus, ein Container einer Wohnung. Während in einem Einfamilienhaus die Heizanlage vom alleinigen Hausbewohner genutzt wird, werden in einem Mehrfamilienhaus Teile der Infrastruktur wie Heizungsanlagen und Elektroleitungen gemeinsam genutzt. VMs stellen immer ein vollständiges Betriebssystem bereit, während Container sich die Ressourcen des Host-Betriebssystems teilen.

Da einzelne Container in einer bestehenden Struktur oder Gruppierung ohne großen Aufwand ausgetauscht werden können, wird der gesamte Entwicklungsprozess dadurch flexibler und schneller. Auf diese Weise kann ein neues Software-Release schnell und unkompliziert veröffentlicht werden, ohne dass sich der Entwickler über etwaige Inkompatibilitäten mit dem Zielsystem Gedanken machen muss. Zudem lassen sich bei der laufenden Aktualisierung von Software-Releases einzelne Komponenten der Anwendung einfach modifizieren, indem lediglich der entsprechende Container ausgetauscht wird.

Flexibles Deployment und dynamische Skalierung von Microservices

Ein idealtypisches Einsatzszenario für Container ist die Umsetzung von Microservice-Architekturen. Microservices sind üblicherweise anzutreffen, wenn eine Applikation in viele kleine Bestandteile zerlegt wird, die unabhängig voneinander arbeiten. Anstelle einer einzigen monolithischen Anwendung kommt hierbei also eine Vielzahl kleiner Dienste, eben die sogenannten Microservices, zum Einsatz. Jeder Microservice übernimmt eine präzise definierte Teilaufgabe, zum Beispiel den Abruf des Warenbestands oder die Verifizierung einer Benutzereingabe. Für sich allein bietet der Microservice so natürlich keinen Mehrwert. Da die Mikrodienste aber in der Lage sind, miteinander zu kommunizieren, können sie im Zusammenspiel die gleichen (Groß-)Aufgaben lösen wie monolithische Applikationen.

Zu den großen Vorteilen dieser Vorgehensweise gehören Skalierbarkeit, Erweiterbarkeit, Flexibilität und die Möglichkeit, jeweils autarke Entwicklerteams einzusetzen. Da Microservices aufgrund ihrer Eigenständigkeit gegen den Ausfall anderer Dienste abgesichert sind, profitieren Anwender von einem verlässlicheren Gesamtsystem. Die Dienste lassen sich getrennt voneinander entwickeln und übersichtlich verteilen, sobald eine genaue Definition der zu verwendenden APIs erfolgt ist. Zudem liefern sie eine Basis für den Einsatz sowie für Tests innovativer Technologien, da jeder Microservice über eine andere Technologiebasis verfügen kann. Abhängigkeiten zwischen den einzelnen Diensten werden via Schnittstelle, also API (Application Programming Interface), realisiert.

Für Microservices oder ihre Größe bzw. Granularität existiert kein Standard. Daher können sie pauschal als kleine Funktionsmodule definiert werden, die eine ganz bestimmte Aufgabe erledigen. Eine Orientierung bei der Aufteilung in unterschiedliche Microservices können funktionale Aspekte geben, aber auch Faktoren wie Teamgrößen spielen gegebenenfalls eine Rolle. Grundsätzlich gilt es, einen guten Kompromiss zwischen Größe und Beherrschbarkeit der Servicelandschaft zu finden. In der Praxis erfolgt die Implementierung häufig als REST-Services (Representational State Transfer), also Webservices. Ein Beispiel: Über einen REST-Call können aktuelle Warenbestände oder Bestellinformationen abgerufen werden. Auch im Online-Banking kommen sie sehr häufig zum Einsatz, um regelbasierte Anfragen und Antworten beispielsweise in Form von Kontoinformationen zu ermöglichen.

Immer mehr Anwender und Entwickler, die sich einen Gesamtüberblick über ihre IT-Applikationen verschaffen, geraten an den Punkt, wo es sich als sinnvolle Option erweist, den großen Block der verschiedenen Programme in viele kleine Container umzuwandeln. Erster Vorteil der Maßnahme: Entsprechende Applikationen lassen sich dadurch einfach gruppieren und so besser überblicken. Zweiter Vorteil: Container können ganz einfach dupliziert werden. Das erzeugt enorme Vorteile aufgrund der Möglichkeit, dynamisch auf- und abwärts skalieren zu können. Wenn im Praxiseinsatz bestimmte Services überlastet sind, können Service-Requests möglicherweise nicht mehr schnell genug abgearbeitet werden. An diesem Punkt kann nun ein Duplikat des Containers erstellt werden, um die benötigten Ressourcen zu verdoppeln. Auf diese Weise lassen sich Systemressourcen im Bedarfsfall ganz einfach skalieren. In einem modernen Cloud-Native-Umfeld übernimmt hier eine Managementsoftware die automatisierte Skalierung und entscheidet, wann die Kapazitäten anzupassen sind.

API-Management und Versionswechsel

Für einen Anwendungsfall wie das oben genannte Online-Banking stellt die Bank einen Microservice zur Verfügung, für den eine bestimmte API als Schnittstelle implementiert wird. In der zugehörigen API-Dokumentation ist beschrieben, wie ein Applikationsentwickler auf die Schnittstellen der Bank zugreifen kann, also beispielsweise welche Informationen wie etwa Kontonummer, Passwort oder PIN-Code in welchem Format übermittelt werden müssen. Auf dieser Basis werden die Kontoinformationen durch den per API aufgerufenen Microservice in einer definierten Art und Weise zurückgespielt. Je mehr Microservices dabei zum Einsatz kommen, desto größer wird der Bedarf nach einem systematischen API-Management. Ein API-Management-Werkzeug trägt entscheidend dazu bei, den Überblick zu behalten über das, was via Container ausgerollt wird.

Ein zentraler Aspekt des API-Managements ist also die Überwachung der laufenden Microservices. Funktioniert alles? Sind die Microservices ausgelastet? Muss skaliert werden? Diese Fragen müssen jederzeit schnell beantwortet werden können, um unmittelbar auf Fehler oder temporäre Ressourcenengpässe reagieren zu können. Ein modernes API-Management liefert vor diesem Hintergrund die richtigen Antworten. Eine weitere große Hilfestellung kann API-Management bei Versionswechseln leisten. Grundsätzlich existieren für Software-Aktualisierungen zwei verschiedene Herangehensweisen. Entweder wird eine neue Softwareversion im Zuge eines "Big Bangs" eingeführt, das heißt: Alle Benutzer arbeiten auf einen Schlag mit der neuen Version. Das Risiko dabei: Wenn die Software einen Fehler enthält, kommt es im Extremfall zum Worst-Case-Szenario, dass wirklich niemand mehr die Anwendung nutzen, also beispielsweise Warenbestandsabrufe tätigen oder Online-Banking durchführen kann.

Ebenso kann die neue Version schrittweise in den Anwenderkreis eingeführt werden. Konkret heißt das: Von täglich einer Million Aufrufe der Anwendung oder des (Micro-)Service (beispielsweise Abruf der Kontoinformation) werden zunächst nur 10.000 auf die neue Version geleitet. Funktioniert alles wie gewünscht, erhöht der API-Manager anhand eines bestimmten Algorithmus dynamisch die Quote der Requests, die auf die neue Version umgelenkt werden, bis an einem definierten Tag X die vollständige Umstellung auf die neue Version abgeschlossen ist. Entwickler können sich dank der Containerisierung vollkommen auf die Anwendungslogik und -abhängigkeiten konzentrieren, während Bereitstellung und Verwaltung in der Hand des operativen IT-Teams liegen.

DevOps und Container: Agile Entwicklungsarbeit mit Anwenderbezug

DevOps bezeichnet eine Methodik, um den Prozess zwischen Entwicklern und Operations, also den Benutzern oder Testern zu verbessern. Es ist ein beliebtes Einsatzgebiet für Container, weil diese auch hier dazu beitragen, den Prozess zu unterstützen und zu verschlanken. Anstelle eines vollumfänglichen Anwendungsprogramms werden lediglich die jeweils aktuellen Container mit kleinen Programmaktualisierungen zur Verfügung gestellt. Damit erfüllt das Konzept die Anforderung, kleinschrittiger und damit schneller und agiler in der Softwareentwicklung voranzuschreiten. Die Entwickler stehen nicht länger vor der Herausforderung, selbst bei kleinsten Code-Änderungen das monolithische Gesamtkonstrukt der Anwendung im Auge behalten zu müssen, sondern können sich ganz auf die Optimierung spezifischer Programmabläufe konzentrieren.

Das Ergebnis: mehr Kostenkontrolle und ein effektiverer Einsatz der bereitgestellten Ressourcen.

Ein weiterer Vorteil ist die Möglichkeit, durch DevOps auf Container-Basis schneller Feedback zu erhalten – sei es von den Nutzern oder der Qualitätssicherung. Hinzu kommen frühzeitige und ökonomisch sinnvollere Abläufe bei fortlaufenden Verbesserungen und Anpassungen sowie mehr Transparenz und Zusammenarbeit aufseiten der Projektbeteiligten. So werden Entwickler zum Beispiel in die Lage versetzt, sich über große Entfernungen hinweg miteinander zu synchronisieren. Das Ergebnis: mehr Kostenkontrolle und ein effektiverer Einsatz der bereitgestellten Ressourcen.

Drei-Punkte-Plan für die Containerisierung von Anwendungen

Für eine erfolgreiche Containerisierung und effiziente Nutzung gebündelter Applikationen gilt es, die richtigen Voraussetzungen zu schaffen. Dabei sind die schnelle Implementierung von Funktionen, eine zügige Verteilung von Updates und eine optimierte Synchronisierung von Entwicklungsabläufen besonders wichtig. Der folgende Drei-Punkte-Plan liefert einen Leitfaden.

1. Voraussetzungen schaffen, Anwendungen aufbrechen

Trotz der vielfältigen Vorteile des Container-Ansatzes halten sich viele Unternehmen bislang noch mit der Einführung solcher Lösungen zurück. Ein Grund dafür: Eine Vielzahl der Anwendungen ist nicht ausreichend vorbereitet. Wenn große, verzahnte und komplexe Applikationen in Containern ausgerollt werden, läuft dies dem Grundkonzept verringerter Komplexität zuwider, für das Container eigentlich stehen. Hier könnte es sich als sinnvoll erweisen, Anwendungen daraufhin zu prüfen, ob sie sich zweckmäßig aufsplitten lassen. Es gilt zu klären, wo funktionale oder logische Blöcke gebildet und in einen separaten Container überführt werden können. Ein anschauliches Beispiel liefert ein Warenwirtschaftssystem, das Bestellabwicklung, Kundenverwaltung und mehr beinhaltet. In der konkreten Umsetzung lassen sich unter anderem die Wissensdatenbank, die CRM-Funktion sowie weitere Module in einen Container auslagern. Es zeigt sich, dass die Bildung kleinerer Einheiten den Auftakt erfolgreicher Containerisierung markiert. Dennoch sollte die Aufsplittung weder zu klein- noch zu großteilig sein, damit die IT die Container bestmöglich handhaben kann. Bei zu kleinteiligen Containern wächst die Komplexität und es wird schwieriger, den Überblick über die einzelnen Applikationen zu wahren. Die Kommunikation zwischen den einzelnen Containern erfolgt in der Regel per REST. Je mehr unabhängige Container miteinander kommunizieren, desto größer wird der Kommunikationsoverhead. Andererseits sollten die einzelnen Container auch nicht zu groß werden, damit die Vorteile des verteilten Ansatzes zum Tragen kommen können. Wie so oft gilt es auch hier, die richtige Balance für den eigenen Einsatzzweck zu finden.

2. Migrationsaufwand bei Windows-Anwendungen berücksichtigen

Container sind eine evolutionäre Errungenschaft der Linux-Welt, wo nach wie vor ihre idealen Funktionsbedingungen herrschen. Vor diesem Hintergrund gilt es beim Einsatz mit einer Anwendung, die nativ unter Windows läuft, einen gewissen Migrationsaufwand einzuplanen. Projektverantwortliche und Entwickler sind gut beraten, im Vorfeld eine Kosten-Nutzen-Abwägung vorzunehmen. Hier steht die Frage im Fokus, ob es möglich ist, die jeweilige Anwendung in die Linux-Welt zu transferieren. Die Erfahrung zeigt, dass dies für den serverseitigen Teil der Applikationen oft gut gelingt, aber bei komplexen GUI-Clients oftmals nur mit erheblichem Aufwand zu bewerkstelligen ist.

3. Für eine flexible und breit angelegte Entwicklungsbasis sorgen

Als Basis für die Entwicklung von containerbasierten Anwendungen dient eine Datenplattform, die einfach zu implementieren ist und gerade auch für Programmieraufgaben im Container-Umfeld uneingeschränkt eingesetzt werden kann. Ein hilfreiches Feature, das die Implementierung neuer Funktionen und Anwendungen zusätzlich vereinfacht, ist ein nativ in der Datenplattform integrierter API-Manager. Die zentrale Entwicklung und Kontrolle datenintensiver Anwendungen und Container kombiniert mit transparenter API-Verwaltung verschafft Unternehmen eine solide Basis für ganzheitliches Innovations- und Versionsmanagement sowie vereinfachte Überwachung und Wartung von Applikationen und Microservices.

Agile Infrastruktur mit ganzheitlichem Ansatz

Datenintensive Applikationen mit hochperformanten Schnittstellen stellen hohe Anforderungen an das Datenmanagement. Die Systemlandschaften von morgen setzen immer mehr auf Komplexitätsreduktion und flexible Strukturen, die dynamische Veränderungen begünstigen. Containerisierung bietet hierfür ein agiles Zukunftskonzept. Mit einer darauf abgestimmten interoperablen und skalierbaren Datenplattform erhalten Entwickler eine Grundlage, um das Potenzial von Containern beim Erstellen und beim Deployment neuer Anwendungen und Services noch effizienter zu nutzen.

Autor

Michael Braam

Michael Braam ist bei der InterSystems GmbH als Senior Sales Engineer im Bereich Pre- und Post-Sales angestellt und für die technische Betreuung der Kunden zuständig.
>> Weiterlesen
Das könnte Sie auch interessieren

Kommentare (0)

Neuen Kommentar schreiben