# Cloud-native Computing

Cloud-native Computing ist ein Ansatz in der Softwareentwicklung, der Cloud Computing nutzt, um skalierbare Anwendungen in Cloud-Infrastrukturen, -Plattformen und -Umgebungen zu erstellen und auszuführen. Gemäß der Cloud Native Computing Foundation (CNCF) prägen diesen Remote-Computing-Ansatz insbesondere Technologien wie Container, Microservices sowie serverlose Funktionen und unveränderliche Infrastrukturen (Immutable Infrastructures und Infrastructure as Code), die zumeist über deklarativen Code bereitgestellt werden.

## Definition

Cloud-native Technologien ermöglichen lose gekoppelte Software-Systeme (Cloud-native Applikationen), die resilient, beobachtbar und dank Auto-Scaling und Self-Healing in automatisierten Umgebungen mit minimaler Interaktion durch Administratoren betreibbar sind.
   „Eine Cloud-native Anwendung (CNA) ist ein verteiltes, beobachtbares, elastisches und auf horizontale Skalierbarkeit optimiertes Service-of-Services System, das seinen Zustand in (einem Minimum an) zustandsbehafteten Komponenten isoliert. Die Anwendung und jede in sich geschlossene Bereitstellungseinheit dieser Anwendung wird nach Cloud-fokussierten Designmustern entworfen und auf elastischen Self-Service-Plattformen betrieben.“

## Eigenschaften

Cloud-native Anwendungen sind daher oft durch eine oder mehrere der folgenden Eigenschaften charakterisiert:
* Beobachtbarkeit bei Software-Systemen bezieht sich typischerweise auf Telemetriedaten, die meist in drei Aspekte unterteilt werden: Tracing (verteilte Ablaufverfolgung) ermöglicht Einblick in den Lebenszyklus von Requests in einem verteilten System. Metriken im Rahmen eines Monitorings liefern quantitative Informationen zu Prozessen, die im System ausgeführt werden. Mittels Logging (Protokollierung) lässt sich Einblick in anwendungsspezifische Nachrichten, die von Prozessen ausgegeben werden, gewinnen. Diese Beobachtbarkeit ist insbesondere für die DevOps-Prinzipien des Feedback essentiell.
* Elastizität ist „der Grad, in dem ein System in der Lage ist, sich an Workload-Änderungen anzupassen, indem es Ressourcen in einer autonomen Art und Weise provisioniert und deprovisioniert, so dass zu jedem Zeitpunkt die verfügbaren Ressourcen so gut wie möglich mit dem aktuellen Bedarf übereinstimmen“.
* Skalierbarkeit kann in strukturelle Skalierbarkeit und Lastskalierbarkeit unterschieden werden. „Strukturelle Skalierbarkeit ist die Fähigkeit eines Systems, sich in einer gewählten Dimension ohne größere Änderungen an seiner Architektur zu erweitern. Unter Lastskalierbarkeit ist die Fähigkeit eines Systems zu verstehen, auch steigendem Datenverkehr bewältigen zu können“.
* Service-of-Services Systeme werden bei Cloud-nativen Anwendungen zumeist im Microservice-Architekturstil verstanden. Dieser Architekturstil versteht „eine einzelne Anwendung als eine Suite kleiner Services, die jeweils in einem eigenen Prozess laufen und mit leichtgewichtigen Mechanismen kommunizieren. Diese Services sind um Geschäftsfunktionen herum aufgebaut und können unabhängig voneinander von vollautomatischen Bereitstellungsmechanismen aktualisiert werden. Es gibt nur ein Minimum an zentraler Verwaltung dieser Dienste, die in verschiedenen Programmiersprachen (polyglotte Programmierung) geschrieben sein können und unterschiedliche Datenspeichertechnologien verwenden (polyglotte Datenhaltung)“.
* In sich geschlossene Bereitstellungseinheiten (Deployment Unit) sind ein Teil der Deployment-Topologie der Anwendung zur Realisierung einer bestimmten technischen Einheit. Immer häufiger wird eine Deployment Unit als „ein Standardcontainer verstanden. Das Ziel eines Standardcontainers ist es, eine Softwarekomponente und alle ihre Abhängigkeiten in einem Format zu kapseln, das selbstbeschreibend und portabel ist, so dass jede konforme Laufzeitumgebung sie ohne zusätzliche Abhängigkeiten ausführen kann, unabhängig von der zugrunde liegenden Maschine und dem Inhalt des Containers“.
* Zustandsbehaftete Komponenten (meist Datenbanken) werden für „mehrere Instanzen einer skalierten Anwendungskomponente verwendet, die ihren internen Zustand synchronisieren, um ein einheitliches Verhalten zu bieten“. Da die Skalierung zustandsbehafteter Komponenten meist aufwändiger ist, als die Skalierung zustandsloser Komponenten, versucht man Zustände in möglichst wenigen zustandsbehafteten Komponenten zu isolieren.
* Unter einer elastischen Plattform versteht man eine „Middleware für die Ausführung von benutzerdefinierten Anwendungen, deren Kommunikation und Datenspeicherung über eine Self-Service-Schnittstelle mittels eines Netzwerks angeboten wird“. Solche gut automatisierbaren Plattformen sind insbesondere für die DevOps-Prinzipien des Flow essentiell.
Häufig werden Cloud-native Anwendungen daher als eine Reihe von Microservices erstellt, die in Containern ausgeführt werden. Sie können mittels Container-Plattformen wie bspw. Kubernetes orchestriert und mit DevOps- und Git-basierten Continuous Integration und Deployment-Workflows verwaltet und bereitgestellt werden. Der Vorteil der Verwendung von Containern besteht darin, dass die gesamte Software inklusive aller Abhängigkeiten, die zur Ausführung benötigt wird, in Form in sich geschlossener Bereitstellungseinheiten vorgehalten werden kann. Container werden hierzu in virtualisierten Umgebungen (Betriebssystemvirtualisierung) ausgeführt, die die enthaltene Anwendung von ihrer Umgebung isoliert.