Containerisierung in der Software: Revolution der Bereitstellungsprozesse
Wie Software-Container die Lieferung und den Betrieb von modernen Lösungen vereinfachen
von Paul Heinzlreiter
Wie liefert man eine neue Software-Lösung an Kund*innen, damit diese einfach genutzt und betrieben werden kann? Bei dem Wort Container denkt man an effizienten Massenfrachttransport auf großen Frachtschiffen oder ähnliche Logistikketten, welche durch die standardisierten Abmessungen der Container ermöglicht werden. Dieses Bild ist auch für Container in der Softwareentwicklung durchaus zutreffend. Analog zum Einsatz von Containern in der klassischen Logistik ermöglichen Software-Container ebenfalls den flexiblen Einsatz von Software in den verschiedensten Systemumgebungen. Durch eine definierte Schnittstelle können Softwarepakete gemeinsam mit den zugehörigen Bibliotheken paketiert und zur Ausführung gebracht werden. Dieser Ansatz kann sowohl bei Standardsoftwarepaketen wie Webservern oder Datenbanken wie auch bei neu entwickelter Individualsoftware angewendet werden.
Durch die Containerisierung ist somit keine direkte Softwareinstallation auf dem zugrundeliegenden System notwendig, es muss nur ein Dienst zur Ausführung von Containern installiert werden. Durch die Paketierung von Services wie beispielsweise einer Datenbank und der von ihr benötigten Bibliotheken in einem Container ist es problemlos möglich, dass verschiedene Versionen derselben Bibliothek in unterschiedlichen Containern zum Einsatz kommen, ohne dadurch Konflikte zu verursachen.
Inhalt
- Abgrenzung zu Virtualisierung und Cloud Computing
- Geclusterte Containerlösungen
- Anwendungsszenarien
- Automatische Skalierung von Services
- Management und Evaluierung von Softwaresystemen
- Automatisierte Build-Pipelines in der Softwareentwicklung
- Einsatz in den Projekten der RISC Software GmbH
- Autor
- Weiterlesen
Abgrenzung zu Virtualisierung und Cloud Computing
Eine weitere gängige Methode zur Isolation von Softwareinstallationen vom Grundsystem des ausführenden Rechners stellt Virtualisierung dar. Hierbei wird allerdings ein gesamter Computer inklusive virtueller Hardware und Betriebssystem nachgebildet, was zu einer wesentlichen Hauptspeicher- und Prozessornutzung sowie längeren Startzeiten führt. Im Gegensatz dazu wird in einem Container meist nur ein spezifischer Dienst – wie ein Webserver oder eine Datenbank – ausgeliefert.
Im Bereich von Cloud Computing – vor allem bei Infrastructure as a Service – werden üblicherweise virtualisierte Rechner eingesetzt. Damit werden allerdings auch die oben genannten Einschränkungen schlagend. Die großen Public Cloud Anbieter offerieren natürlich inzwischen auch spezialisierte Laufzeitumgebungen für Container. Allerdings ist es auch möglich, eine selbst gemanagte skalierbare Containerumgebung zu betreiben. In diesem Szenario wird die Container-Laufzeitumgebung als Teil der Installations-Tätigkeiten aufgesetzt und konfiguriert. Basis ist hierbei eine Anzahl von Rechnern, welche entweder direkt bei den Kund*innen verfügbar sind (on premise) oder auch in einem Rechenzentrum angemietet werden können (dedicated hosting).
Geclusterte Containerlösungen
Weit verbreitete Lösungen zur Containerisierung von Software stellen Docker und Podman dar. Diese werden üblicherweise zur Ausführung von Containern auf einzelnen Rechnern eingesetzt. Hierbei können auch mehrere Container gemeinsam gestartet und verwaltet werden. Beispiel hierfür ist eine Datenbank sowie der Webserver, auf dem die Webapplikation läuft, welche Daten aus der Datenbank darstellt.
Da die Beschränkung auf einen Rechner die Erweiterbarkeit einer Lösung stark einschränkt, wird in Produktivumgebungen üblicherweise ein Cluster von Rechnern zum Hosting von Containern eingesetzt. Dies kann beispielsweise mit Hilfe von Kubernetes als Ausführungsplattform erreicht werden.
Beim Einsatz von Rechnerclustern zur Ausführung von Containern kann durch das Hinzufügen weiterer Rechenknoten die verfügbare Kapazität für die Ausführung von Containern unkompliziert erhöht werden. Ein entsprechend konfigurierter Kubernetes-Cluster erhöht auch die Ausfallsicherheit des Gesamtsystems, da einzelne Rechner ausfallen können, wenn genügend redundante Rechner verfügbar sind. Gerade wenn die Auslastung der Systeme schwankt, ermöglicht das flexible Ausführen von Containern auf einem Kubernetes-Cluster die effiziente Nutzung der vorhandenen Hardware. Durch seine technologische Flexibilität ermöglicht Kubernetes ausserdem die Einbindung verschiedenster Speicherlösungen wie lokale Festplatten genauso, wie über das Netzwerk erreichbarer Speicher. Falls keine Cloud-Server genutzt werden sollen, ermöglicht der Einsatz von Containern das flexible Austauschen von eingesetzten Diensten wie zum Beispiel Datenbanken, um einfach neue technische Anforderungen umzusetzen.
Durch den Einsatz von Kubernetes ist es ausserdem möglich, den Ausführungsort der Software flexibel anzupassen. Hierfür können einerseits die verbreiteteten Cloud Angebote von Amazon, Microsoft oder Google, wie auch europäische Clouds genutzt werden. Andererseits kann ein Kubernetes Cluster auch auf lokaler Hardware installiert werden, um die maximale Kontrolle über die eigenen Programme und Daten zu behalten. Der besondere Vorteil von Kubernetes in diesem Kontext ist, dass das vorhandene Software- und Service-Setup ohne zusätzlichen Aufwand oder Änderungen in der Konfiguration von einer Infrastruktur auf die andere übertragen werden kann. Somit kann ein Vendor-Lock-In (=Barriere aufgrund von Wechselkosten oder -barrieren, um das Produkt oder den Anbieter zu wechseln) wie bei der direkten Nutzung von zum Beispiel spezifischen Cloud-Diensten vermieden werden.
Anwendungsszenarien
Automatische Skalierung von Services
Der Einsatz von Containern ermöglicht es, durch die Verwendung von vorkonfigurierten Standardabbildern den Konfigurationsaufwand für die einzelnen Services zu minimieren. Darüber hinaus kann flexibel auf sich ändernde Anforderungen reagiert werden. Ein typischer Anwendungsfall dafür ist die automatische Skalierung von Services, wenn beispielsweise bei einem Online-Händler im Weihnachtsgeschäft mehr Anfragen eintreffen und mehr Webserver hochgefahren werden, um diese zu behandeln. Genauso kann die Menge der Container wieder reduziert werden, wenn weniger Anfragen eintreffen.
Management und Evaluierung von Softwaresystemen
Genauso kommt es gerade bei komplexeren Softwarearchitekturen, welche aus vielen verschiedenen Komponenten bestehen und über lange Zeit produktiv eingesetzt werden, oft zu einer evolutionären Weiterentwicklung der eingesetzten Technologie. Durch Containerisierung und Services wie Kubernetes wird es möglich, einzelne Systemkomponenten flexibel auszutauschen, ohne das (De)Installationen von Softwarepaketen oder Bibliotheken direkt auf den ausführenden Servern durchgeführt werden müssen. Dies ist wegen Abhängigkeiten zu verschiedenen Versionen derselben Biblithek oft problematisch, gerade bei Software, welche über mehrere Jahre eingesetzt wird.
Ein weiteres Anwendungsfeld sind Evaluierungen von Softwaresystemen, welche eine fundierte technische Grundlage für Technologieentscheidungen liefern. Damit kann einfach untersucht werden, welche Systeme die vorliegenden Kundenanforderungen am besten erfüllen. Gerade im Bereich des Data Engineering stellt sich zu Beginn eines Projekts oft die Frage, mit welcher Technologie man die Anforderungen der Kund*innen am besten erfüllen kann. Während man manchmal – oft aufgrund nicht-technischer Kriterien – manche Lösungen schnell ausschliessen kann, ist es oft für eine fundierte Entscheidung notwendig, verschiedene Ansätze mit dem Anwendungsfall der Kund*innen zu testen. Gründe dafür dafür können spezielle Anforderungen wie die Datenmenge, welche pro Zeiteineinheit in das System eingebracht werden soll oder speziell notwendige Vorverarbeitungsschritte sein.
Automatisierte Build-Pipelines in der Softwareentwicklung
In der Softwareentwicklung sowie bei der Ausrollung der entwickelten Software in den Betrieb kann Containerisierung im Allgemeinen und Kubernetes im Speziellen wesentliche Beiträge liefern. In einem modernen agilen Softwareentwicklungsprozess spielen automatisierte Tests eine zentrale Rolle, da sie das Softwareentwicklungsteam vor allem gegen unabsichtlich wieder eingeführte Implementierungsfehler absichern. Um die regelmäßige Durchführung dieser Tests zu gewährleisten, werden Tests automatisiert spätestens nach dem Abschluss der Implementierung einer Teilfunktionalität durchgeführt. Da hierfür auch oft eine spezifische Testumgebung notwendig ist, bietet es sich an, die Tests in Containern durchzuführen, welche die aktuellste Version der entwickelten Software und die benötigten Bibliotheken beinhalten. Zusätzlich benötigte Ressourcen wie beispielsweise Datenbanken werden hierbei als Teil des Testsetups konfiguriert und automatisch als separater Container mit ausgeführt. Der Einsatz von Containern vereinfacht dadurch die Entwicklung hochqualitativer Software.
Für eine vereinfachte Softwareinstallation bei Kund*innen unabhängig von einem effektiven Softwareentwicklungsprozess ist auch die Containerisierung der fertig entwickelten Software erstrebenswert, da sie die Ausrollung in den verschiedensten Systemumgebungen bei den Kund*innen extrem vereinfacht. Damit ist es ausreichend, eine standardisierte Container-Runtime zu installieren, und die Software kann direkt ohne weitere Installation benutzt werden. Dies ist möglich, weil der Container bereits alle Bibliotheken und Abhängigkeiten mitbringt, welche für die neue Software benötigt werden. Beispielsweise kann beim Einsatz von Docker ein Softwarewerkzeug, das für eine Linux-Umgebung entwickelt wurde, ohne Probleme auf einem Windows System ausgeführt werden.
Einsatz in den Projekten der RISC Software GmbH
Für das Leichtmetallkompetenzzentrum Ranshofen (LKR) wurde ein Kubernetes-Cluster für den Produktivbetrieb aufgesetzt. Dieser wird für Aufgaben in der Datenanalyse sowie für die Simulation von Aluminium-Strangguss eingesetzt. Darüber hinaus wurde der Simulationscode, der am LKR im Rahmen des FFG geförderten Projekts FReSgO entwickelt wurde, auf die Ausführung in Containern angepasst. Das Kubernetes-Setup ermöglicht dem LKR in seiner Datenverarbeitung flexibel auf neue Anforderungen zu reagieren, die im Rahmen der Forschungstätigkeit mit variablen Abläufen bei der Simulation von Aluminium-Strangguss, bei der Datensammlung in der maschinellen Materialbehandlung und der Datenanalyse auftreten. Es bildet hiermit die Basis für die Weiterentwicklung des Systems sowie die Integration von Machine Learning Ansätzen im FFG Projekt opt1mus.
Für die MOWIS GmbH wurde im Rahmen eines früheren Projekts eine NoSQL-Datenbank aufgebaut, um die laufende Integration von Wetterdaten aus verschiedenen Quellen zu unterstützen. Dieses System war initial stark für Batch-Betrieb (=paket-/stapelweise Übertragung oder Verarbeitung von Daten) ausgelegt. Der Batch-Ansatz bezieht sich hierbei sowohl auf Datenimport wie auch Export, da die Daten gesammelt angeliefert und die berechneten Wettervorhersagen auch wieder geblockt ausgeliefert wurden. Als sich die Erweiterung um eine interaktive Webservice-Schnittstelle als zusätzliche Anforderung ergab, war das Ziel, das bestehende System um die neue Funktionalität zu erweitern. Kritisch hierbei war, das System durch die zu erwartende Menge an interaktiven Anfragen nicht zu überlasten. Die Erwartungshaltung an moderne Webservice-Schnittstellen ist allerdings eine möglichst schnelle Reaktion. Abfragen laufen oftmals über viele Schichten vom Schnittstellendienst über eine Abstraktionsschicht, über eine Geschäftslogikschicht, dann oftmals über weitere Abstraktionsschichten, bis die Daten vom Speicherort gelesen oder geschrieben werden. Sind eine Vielzahl von Services involviert, braucht die Abfrage noch mehr Zeit.
Caches können als Zwischenspeicher solche Abfragen beschleunigen. Der In-Memory-Cache Redis erlaubt das Ablegen beliebig strukturierter Schlüssel-Wert-Paare im Hauptspeicher, die jeweils mit einem Verfallszeitpunkt versehen sein können. Auf einem Rechnerverbund kann Redis den Hauptspeicher mehrerer Rechner zu einem großen Zwischenspeicher zusammenfassen.
Da im Rahmen einer früheren Erweiterung bereits ein Kubernetes-Cluster auf dem System eingerichtet wurde, war es eine naheliegende Entscheidung, den Redis-Cache für die Beschleunigung der Wetterabfragen ebenfalls auf dem Kubernetes Cluster auszuführen, was die Ausrollung des Systems wesentlich vereinfachte, obwohl die neuen Anforderungen zum Zeitpunkt des Systemdesigns noch nicht bekannt waren.
Die RISC Software GmbH hat mehrjährige Erfahrung mit der Containerisierung von Anwendungen, der Installation und Konfiguration von Kubernetes-basierten Umgebungen, sowie deren Nutzung in verschiedensten Szenarien. Wir beraten Sie gerne hinsichtlich der besten Lösung für Ihr Projekt und begleiten Sie auch gerne in der Umsetzung.
Ansprechperson
Autor
DI Paul Heinzlreiter
Senior Data Scientist