DevOps

Was ist DevOps?

DevOps setzt sich aus den beiden Begriffen Development (Softwareentwicklung) und Operations (Systemadministration) zusammen. Mit DevOps wird sowohl eine Methodik als auch eine Pipeline von Tools bezeichnet, die den Entwicklungs- und Auslieferungsprozess einer Software begleiten. Mit DevOps-Methoden können die Softwarequalität, die Softwarenachhaltigkeit sowie der Software-Auslieferungsprozess verbessert werden:

"DevOps is a set of practices intended to reduce the time between committing a change to a system and the change being placed into normal production, while ensuring high quality." Quelle: Bass, Len; Weber, Ingo; Zhu, Liming. DevOps: A Software Architect's Perspective. ISBN 978-0134049847.

DevOps-Prinzipien sind heute ein wichtiger Bestandteil bei der Entwicklung, Bereitstellung (Deployment), dem Betrieb und dem Monitoring von Webanwendungen. Ein Grund hierfür ist, dass die Zielplattformen für Webanwendungen zunehmend cloudbasiert sind. DevOps wird in IT-Unternehmen häufig auch als Bestandteil der Unternehmenskultur begriffen. In diesem Sinne fördert DevOps das abteilungsübergreifende Zusammenwirken aller am Prozess der Softwareentwicklung beteiligten Personen. Im Zentrum stehen Kommunikations-, Organisations- und Prüfprozesse, die über verschiedene Softwaretools miteinander verschaltet werden. Ein wichtiges Element ist hierbei die Automation von Teilprozessen (bspw. die automatische Auslieferung einer Webanwendung nach einem Commit in ein Versionskontrollsystem).

DevOps-Methoden werden häufig (wenn auch mit leicht unterschiedlichen Benennungen) in sieben verschiedene Phasen eingeteilt:

  1. Plan (Planung)
  2. Code (Entwicklung, auch "Create" oder "Develop")
  3. Test (Prüfung, auch "Verify")
  4. Package (Paketierung, auch "Build")
  5. Release (Freigabe)
  6. Configure (automatisierte Konfiguration für die Produktivstellung, auch "Deploy")
  7. Monitor (Überwachung der Anwendung, auch "Operate")

Grafik: Beispiel für die Stufen von DevOps-Prozessen
Quelle: Wikimedia, DevOps Toolchain by Kharnagy, CC BY-SA 4.0

Da sich DevOps auf den gesamten Herstellungsprozess einer Software bezieht, ist es im Bereich der weborientierten Anwendungsentwicklung heute unerlässlich, sich sowohl aus der Perspektive der Softwareentwicklung als auch der Perspektive des Projektmanagements einen Überblick über gängige Softwareinstrumente zu verschaffen, die in einer DevOps-Pipeline eine Rolle spielen. Einen Überblick dazu bietet folgendes Diagramm:

Grafik: DevOps Toolchain
Quelle: Thomas Schwender, CC BY

Weiterführende Informationen:

Virtuelle Maschinen und Anwendungscontainer

Immer weniger Webanwendungen werden heute über physische Systeme (dedizierte Systeme) bereitgestellt. Durch große Fortschritte im Bereich der Virtualisierung werden Anwendungen vielmehr auf virtuellen Maschinen oder in Anwendungscontainern betrieben. Hierbei wird eine Abstraktionsschicht zwischen die eigentliche Hardware und die Software (häufig das Betriebssystem) gelegt. Dienste wie z.B. das Betriebssystem, der Arbeitsspeicher oder auch die Netzwerkressourcen werden emuliert und mittels Virtualisierungsprogammen gesteuert. Durch diese Vorgehensweise können die Ressourcen, die einer Webanwendung im Betrieb zur Verfügung stehen, deutlich besser skaliert werden, als dies bei einem direkten Betrieb auf physischer Hardware der Fall wäre. Virtualisierung ermöglicht eine stärker gekapselte Anwendungsarchitektur. Insbesondere die Entwicklung von Anwendungscontainer-Lösungen wie Docker hat dazu geführt, dass moderne Webanwendungen zunehmend als Microservices erstellt werden. Bei diesem Architekturmuster besteht eine Webanwendung aus voneinander unabhängigen (virtualisierten) Komponenten (bzw. Prozessen), die über standardisierte Schnittstellen und Protokolle (HTTP) kommunizieren.

Folgende Darstellung gibt einen Überblick über die Unterschiede zwischen virtuellen Maschinen und Anwendungscontainern:

Virtuelle Maschine Anwendungscontainer
Quelle: Nick Janetakis, Comparing Virtual Machines vs Docker Containers Quelle: Nick Janetakis, Comparing Virtual Machines vs Docker Containers

Orchestrierung und Automation

Ein besonderes Gewicht innerhalb des DevOps-Workflows kommt der Automation von Prozessen zu. Automation führt zur Steigerung der Ergebnisqualität, da Fehlerquellen in einem Prozess reduziert und die Nachvollziehbarkeit insgesamt erhöht werden. Automation kann an vielen Stellen im DevOps-Workflow erreicht werden. Dies beginnt schon in der Planungsstufe (bspw. durch die automatisierte Bereitstellung von "Projektgerüsten" in einem Projektmanagement-Tool), erstreckt sich aber auch auf die Softwareentwicklung (durch die automatisierte Erzeugung von "Blaupausen" für eine Webanwendung mit einem Build-Tool (sog. Scaffolding), die Paketierung und das Testing von Software (über Continuous Integration Instrumente und Testing-Tools) sowie den Infrastrukturbereich (in Form der automatisierten Bereitstellung virtueller Entwicklungs- und Produktivsysteme).

Im Bereich der Infrastruktur spricht man auch von der Orchestrierung der Systeme. Hierbei werden meist textbasierte (und somit versionierbare) "Baupläne" der für die Webanwendung notwendigen Systeme und Anwendungscontainer erstellt. Webanwendungen werden also nicht mehr von Hand installiert und konfiguriert, sondern mithilfe von Konfigurationsmanagement-Instrumenten automatisiert "ausgerollt". Häufig wird die Produktivumgebung einer Webanwendung erst bei der Auslieferung einer bestimmten Version on-the-fly erstellt.

Grafik: Orchestrierung und Automation von Infrastruktur
Quelle: Torsten Schrade

Weiterführende Informationen:

Deployment von Webanwendungen

Der Prozess des Deployments, also der Bereitstellung einer Webanwendung, hat sich in den vergangenen Jahren grundlegend gewandelt. Wurden spezifische Codestände früher häufig von Hand per FTP oder SCP auf einen Webserver übertragen und dort bereitgestellt, erfolgt dieser Prozess heute meistens unter Verwendung eines Versionskontrollsystems und darauf angelegter Trigger (Ereignisse), die eine Aktion in einer Deployment-Pipeline auslösen. In einer einfachen Form kann dies mithilfe von Webhooks geschehen, die bei einem Commit in einen Branch eines Code-Repositories ausgelöst werden und eine HTTP-basierte Aktion auf einem Drittsystem anstoßen.

Grafik: Einfaches Deployment eines Git-Repositoriums über Webhooks
Quelle: Tetiana Markova, Deploy Code to Containers from Git Automatically

Im Bereich professioneller Webanwendungen, die zunehmend auf containerbasierte Multikomponenten-Architekturen setzen, können Deployment-Szenarien deutlich komplexer ausfallen, da beim Ausrollen der Software die vollständige Infrastruktur erzeugt wird (Laufzeitumgebung für den Programmcode, Datennbanksystem, Webserver, Caches etc.). Folgende Grafik gibt hierzu ein Beispiel:

Grafik: Komplexes Cloud-Deployment einer Multikomponenten-Webanwendung
Quelle: Philip Cheong, Container-based pipelines for continuous deployment

Weiterführende Informationen:

Cloud- und "Serverless"-Computing

Cloud Computing

Bedingt durch die Fortschritte im Bereich der Virtualisierung Angebote, die unter dem Begriff Cloud Computing zusammengefasst werden, einen starken Wachstumsschub erhalten. Grundsätzlich beschreibt der Begriff die Bereitstellung von Infrastrukturen und Diensten (bspw. Speicherplatz, Rechenleistung oder spezifische Softwarepakete) nicht mehr in Form lokaler, dedizierter Instanzen sondern über ein Netzwerk. Im Falle von Webanwendungen stehen hier das World Wide Web und HTTP im Mittelpunkt.

In den letzten 10 Jahren ist ein Paradigmenwechsel erfolgt. Zum einen haben sich unzählige neue Firmen und Geschäftsmodelle entwickelt, die ihre (virtuellen) Produkte ausschließlich über das Web anbieten (bspw. Facebook, Dropbox, GitHub etc.). Zum anderen wird das Feld technologisch und konzeptionell sehr stark durch die großen Internetkonzerne geprägt, so dass es nicht viele "freie" Alternativen und Anbieter gibt. Die folgende Grafik gibt einen Überblick über Aspekte, die zum Bereich Cloud Computing gerechnet werden:

Grafik: Elemente des Cloud Computing
Quelle: Sam Johnston, CC BY-SA 3.0

Für den Bereich Webanwendungen ist entscheidend, dass die traditionellen Formen des Deployments und Hostings webbasierter Anwendungen auf dedizierten Serversystemen zunehmend verschwinden und durch Cloud-Lösungen ersetzt werden. Anstelle klassischer Webstacks treten gekoppelte, (häufig containerbasierte) virtuelle Architekturen, die über Microservices miteinander kommunizieren. Die bekanntesten Cloud Computing Plattformen, die für den Bereich Webanwendungen Bedeutung haben, sind aktuell:

Weitere Informationen:

"Serverless"-Computing

Eine besonders aktuelle und für den Bereich Webanwendungen relevante Form des Cloud Computing ist das Serverless Computing. Da hierfür im Hintergrund immer noch Server benötigt werden, mit denen die Rechenkapazität bereitgestellt wird, ist der Begriff etwas irreführend. Eine bessere Bezeichnung für das Konzept lautet Functions as a Service (FaaS).

Kerngedanke von FaaS ist dabei, nicht mehr ganze Webanwendungen sondern lediglich Laufzeitumgebungen für Funktionen (in einer beliebigen Programmiersprache) cloudbasiert bereitzustellen. Diese Funktionen können über einen HTTP-Endpoint angesprochen und ausgeführt werden. So könnte eine (cloudbasierte) Funktion z.B. eine GND-Nummer entgegennehmen, diese über eine Schnittstelle auflösen und die erhaltenen Normdaten zurück liefern. Die benötigte Rechenkapazität für die Ausführung einer solchen Funktion wird bei FaaS dynamisch und automatisiert durch den Cloud-Anbieter bereitgestellt. Der/die Entwickler_in hat keinen weiteren Einfluss auf die Systemgegebenheiten. Viele Cloud-Anbieter unterstützen inzwischen weborientierte Sprachen und Frameworks (bspw. node.js, Python etc.).

Grafiken: Grundprinzipien von Serverless Computing
Quelle: Alex Ellis, FaaS-and-Furious

Serverless computing mit OpenFaas auf einem Rasperry Pi Cluster

Zur Erprobung der Möglichkeiten des "Functions as a Service" Ansatzes steht uns eine OpenFaaS Cloud-Umgebung zur Verfügung. Die Umgebung wird auf einem Rasperry Pi Cluster (auf Basis von Docker Swarm) mit zwei Manager- und vier Worker-Nodes betrieben. Hier wollen wir nun gemeinsam PHP-Funktionen einspielen ("deployen") und danach über das Web aufrufen.

(1) Clonen Sie sich den Workspace für das Seminar aus dem GitLab in Ihr persönliches Arbeitsverzeichnis auf ihrem Rechner. Öffnen Sie das Repository in Atom.
(2) Wir analysieren zunächst gemeinsam die Struktur der beiden Beispielfunktionen (hello-world und uppercase). Legen Sie nun einen eigenen Branch an und wechseln Sie in diesen Branch. Kopieren Sie dann den hello-world Ordner und geben Sie diesem Ordner beim Kopieren einen Funktionsnamen ihrer Wahl (Beispiel: "do-something").
(3) Kopieren Sie analog zum Ordner die Datei hello-world.yml und benennen Sie die Datei genau wie ihren neuen Ordner.
(4) Ändern Sie die Metadaten in Ihrer yml-Datei entsprechend Ihrem gewählten Funktionsnamen ab (es müssen nur die Zeilen 5, 7 und 8 angepasst werden).
(5) Öffnen Sie die Handler.php Datei in Ihrem Ordner und programmieren Sie die Funktion nach Ihren Wünschen um. Tipp: Sie können dem Wert der eingehenden $data-Variable verändern, zum Beispiel indem sie die Länge des eingehenden Strings mit strlen ermitteln oder den Hash-Wert des Strings mittels md5 berechnen. Wichtig ist, dass Sie am Ende Ihrer Funktion einen Wert zurückgeben.
(6) Commiten Sie Ihre Änderungen und pushen Sie Ihren Branch zurück in das GitLab.
(7) Die nächsten Schritte führen wir gemeinsam aus. Wir mergen zunächst die eingegangenen Branches in den Master. Dies wird ein automatisches Deployment auf dem Rasperry Pi Cluster auslösen, das wir gemeinsam auf der Konsole beobachten.
(8) Nachdem die Funktionen erfolgreich in der Rasperry Pi Cloud eingespielt wurden testen Sie zum Schluss Ihre nun über das Web erreichbare Funktion mittels Atom und Rester.

POST https://pi.adwudlit.uni-mainz.de/function/csv-to-epidoc HTTP/1.1
Content-type: application/json

{
    "csv": ["https://hou2zi0.github.io/csv-to-epidoc/data/files/epidat.csv"],
    "sep": "|",
    "map": {
    "title": "Inventory_Number",
    "handDesc": "Hands"
    }
}

Weiterführende Informationen:

WS 2019/20 – Webbasierte Forschungsapplikationen für die Geisteswissenschaften CC BY-NC-SA 4.0