Was ist DevOps?

In einem traditionellen Softwareentwicklungsmodell schreiben Entwickler große Mengen an Code für neue Funktionen, Produkte, Fehlerkorrekturen usw. und geben ihre Arbeit dann zur Bereitstellung an das Betriebsteam weiter, in der Regel über ein automatisiertes Ticket-System. Das Betriebsteam erhält diese Anfrage in seiner Warteschlange, testet den Code und stellt ihn für die Produktion bereit - ein Prozess, der Tage, Wochen oder Monate dauern kann. Wenn bei diesem traditionellen Modell Probleme bei der Bereitstellung auftreten, schickt das Team ein Ticket an die Entwickler zurück, um ihnen mitzuteilen, was sie beheben sollen. Nachdem dieses Hin und Her geklärt ist, wird die Arbeitslast schließlich in die Produktion übernommen.

Dieses Modell macht die Softwarebereitstellung zu einem langwierigen und fragmentierten Prozess. Entwickler sehen den Betrieb oft als Hindernis, das den Zeitplan für ihre Projekte verlangsamt, während sich die Betriebsteams als Abladeplatz für Entwicklungsprobleme fühlen.

DevOps löst diese Probleme, indem es Entwicklungs- und Betriebsteams über den gesamten Softwarebereitstellungsprozess hinweg zusammenführt. So können sie Probleme früher erkennen und beheben, Tests und Bereitstellung automatisieren und die Markteinführungszeit verkürzen.

Um besser zu verstehen, was DevOps ist, sollten Sie zunächst wissen, was DevOps nicht ist.

 

DevOps ist nicht

  • Eine Kombination aus dem Entwicklungs- und dem Ops-Team: Es gibt immer noch zwei Teams, sie arbeiten nur auf kommunikative, kooperative Weise.
  • Ein eigenes, separates Team: So etwas wie einen "DevOps-Ingenieur" gibt es nicht. Obwohl einige Unternehmen ein DevOps-Team als Pilot einsetzen, wenn sie versuchen, zu einer DevOps-Kultur überzugehen, bezieht sich DevOps auf eine Kultur, in der Entwickler, Tester und Betriebsmitarbeiter während des gesamten Lebenszyklus der Softwarebereitstellung zusammenarbeiten.
  • Ein Werkzeug oder eine Reihe von Werkzeugen: Obwohl es Tools gibt, die gut mit einem DevOps-Modell zusammenarbeiten oder die DevOps-Kultur fördern, ist DevOps letztlich eine Strategie und kein Tool.
  • Automatisierung: Obwohl sie für eine DevOps-Kultur sehr wichtig ist, macht Automatisierung allein DevOps nicht aus.

 

DevOps Definiert

In einem DevOps-Modell kodieren die Entwickler nicht mehr riesige Funktionspakete, bevor sie sie blindlings an Operations zur Bereitstellung übergeben, sondern sie liefern häufig kleine Mengen an Code für kontinuierliche Tests. Anstatt Probleme und Anfragen über ein Ticket-System zu kommunizieren, treffen sich die Entwicklungs- und Betriebsteams regelmäßig, tauschen Analysen aus und sind gemeinsam für alle Projekte verantwortlich.

 

CI/CD-Pipeline

DevOps ist ein Zyklus aus kontinuierlicher Integration und kontinuierlicher Bereitstellung (oder kontinuierlicher Bereitstellung), auch bekannt als CI/CD-Pipeline. Die CI/CD-Pipeline integriert Entwicklungs- und Betriebsteams, um die Produktivität durch die Automatisierung von Infrastruktur und Workflows sowie die kontinuierliche Messung der Anwendungsleistung zu verbessern. Es sieht so aus:

Stadien und DevOps-Workflow der CI/CD-Pipeline
Abbildung 1: Stadien und DevOps-Workflow der CI/CD-Pipeline
  • Kontinuierliche Integration verlangt von den Entwicklern, dass sie mehrmals täglich Code in ein Repository für automatisierte Tests integrieren. Jeder Check-in wird durch einen automatisierten Build überprüft, so dass die Teams Probleme frühzeitig erkennen können.
  • Continuous Delivery, nicht zu verwechseln mit Continuous Deployment, bedeutet, dass die CI-Pipeline automatisiert ist, der Code aber manuelle technische Prüfungen durchlaufen muss, bevor er in der Produktion implementiert wird.
  • Kontinuierliche Bereitstellung geht noch einen Schritt weiter. Anstelle von manuellen Prüfungen durchläuft der Code automatisierte Tests und wird automatisch bereitgestellt, so dass Kunden sofortigen Zugriff auf neue Funktionen haben.

 

DevOps und Sicherheit

Ein Problem bei DevOps ist, dass die Sicherheit oft durch die Maschen fällt. Entwickler arbeiten schnell, und ihre Arbeitsabläufe sind automatisiert. Die Sicherheit ist ein separates Team, und die Entwickler wollen nicht für Sicherheitsprüfungen und -anfragen verlangsamt werden. Infolgedessen stellen viele Entwickler die Software bereit, ohne die richtigen Sicherheitskanäle zu durchlaufen, und machen dabei unweigerlich gefährliche Sicherheitsfehler.

 

Um dieses Problem zu lösen, setzen Organisationen DevSecOpsein. DevSecOps greift das Konzept von DevOps auf - die Idee, dass Entwickler und IT-Teams während der Softwarebereitstellung eng zusammenarbeiten sollten, anstatt getrennt voneinander - und erweitert es um die Sicherheit und die Integration automatisierter Prüfungen in die gesamte CI/CD-Pipeline. Dadurch wird das Problem der Sicherheit, die wie eine äußere Kraft wirkt, gelöst und die Entwickler können ihre Geschwindigkeit beibehalten, ohne die Datensicherheit zu gefährden.

 

DevOps FAQs

Infrastructure as Code (IaC) umfasst die Verwaltung und Provisionierung von IT-Infrastrukturen über maschinenlesbare Definitionsdateien. IaC-Plattformen wie Terraform und AWS CloudFormation ermöglichen die Automatisierung der Einrichtung von Infrastrukturen, was eine konsistente und wiederholbare Bereitstellung ermöglicht. Indem sie die Infrastruktur als Software behandeln, können Organisationen Versionskontrolle, Tests und kontinuierliche Integrationsverfahren auf Änderungen an der Infrastruktur anwenden und so die Agilität und Zuverlässigkeit verbessern.
Kontinuierliche Integration (Continuous Integration, CI) ist eine Entwicklungspraxis, bei der Entwickler häufig Codeänderungen in ein zentrales Repository einbringen, wodurch automatische Builds und Tests ausgelöst werden. CI deckt Integrationsfehler so schnell wie möglich auf, verbessert die Softwarequalität und verkürzt die Zeit für die Bereitstellung neuer Updates. Es bildet die Grundlage für die kontinuierliche Bereitstellung von Anwendungen in Produktionsumgebungen.
Continuous Delivery (CD) erweitert die kontinuierliche Integration, indem alle Codeänderungen nach der Build-Phase automatisch in einer Test- oder Produktionsumgebung bereitgestellt werden. Mit CD können Entwickler sicherstellen, dass ihr Code immer in einem bereitstellbaren Zustand ist, was eine nahtlosere und schnellere Bereitstellung für Endbenutzer ermöglicht. Es überbrückt die Lücke zwischen Entwicklung und Betrieb und fördert einen agilen und reaktionsschnellen Software-Lebenszyklus.
Unter kontinuierlicher Bereitstellung versteht man die automatische Freigabe von validierten Änderungen für die Produktion, ohne dass ein manuelles Eingreifen erforderlich ist. Es ist ein Schritt über die kontinuierliche Bereitstellung hinaus, bei der jede Änderung, die alle Stufen der Produktionspipeline durchläuft, für die Kunden freigegeben wird. Diese Praxis beschleunigt die Feedbackschleife und verbessert die Effizienz und Zuverlässigkeit des Freigabeprozesses.
Bei der Automatisierung werden vordefinierte Anweisungen ausgeführt, um Aufgaben ohne menschliches Eingreifen zu erledigen. Bei der Cloud-Sicherheit stellen Automatisierungstools Richtlinien bereit, scannen nach Schwachstellen und reagieren auf Bedrohungen, wodurch die Sicherheitsabläufe optimiert werden. Sie interagieren mit Cloud-APIs und setzen Skripte und Workflows ein, um Ressourcen zu provisionieren, die Compliance durchzusetzen und komplexe Prozesse effizient zu orchestrieren.
Das Konfigurationsmanagement bezieht sich darauf, Systeme in einem gewünschten, konsistenten Zustand zu halten. Es verfolgt Änderungen und Konfigurationen an Software und Hardware, um ein Abdriften und unautorisierte Änderungen zu verhindern. Tools wie Ansible, Puppet und Chef automatisieren Konfigurationsänderungen in der gesamten IT-Umgebung und stellen sicher, dass die Systeme korrekt und einheitlich konfiguriert sind.
Orchestrierung automatisiert die Verwaltung komplexer Aufgaben und Workflows über mehrere Systeme und Dienste hinweg. Es koordiniert automatisierte Aufgaben zu einem zusammenhängenden Prozess, verwaltet Abhängigkeiten und ordnet Aktionen nacheinander an. In Cloud-Umgebungen verwalten Orchestrierungs-Tools wie Kubernetes containerisierte Anwendungen und kümmern sich um die Bereitstellung, Skalierung und Vernetzung, um die Ressourcennutzung zu optimieren und die Anwendungsleistung zu erhalten.
Microservices sind ein Designansatz, bei dem Anwendungen aus kleinen, unabhängigen Diensten zusammengesetzt sind, die über genau definierte APIs kommunizieren. Jeder Dienst konzentriert sich auf eine einzelne Geschäftsfunktion, führt seinen eigenen Prozess aus und kann unabhängig bereitgestellt werden. Diese Architektur verbessert die Skalierbarkeit, beschleunigt die Entwicklungszyklen und verbessert die Fehlerisolierung.
Überwachung und Protokollierung sind entscheidend für die Aufrechterhaltung der Betriebsleistung und Sicherheit in Cloud-Umgebungen. Die Überwachung bietet Echtzeiteinblicke in die Infrastruktur, Anwendungen und Dienste und ermöglicht eine proaktive Verwaltung des Systemzustands und der Leistung. Die Protokollierung zeichnet Ereignisse und Datenpunkte auf, die für die Fehlersuche, forensische Analysen und Compliance-Audits unerlässlich sind. Gemeinsam ermöglichen sie eine schnelle Erkennung von und Reaktion auf Vorfälle und gewährleisten so kontinuierliche Verfügbarkeit und Sicherheit.
Versionskontrollsysteme verfolgen und verwalten Änderungen an Code, Dokumenten oder anderen Informationssammlungen. Sie erleichtern die Zusammenarbeit zwischen Entwicklungsteams, führen eine Änderungshistorie und ermöglichen bei Bedarf die Rückkehr zu früheren Versionen. Die Versionskontrolle ist von grundlegender Bedeutung für die Verwaltung von Codebases, die Reduzierung von Konflikten und die Sicherstellung, dass Bereitstellungen konsistent und nachvollziehbar sind.
Zu den gängigen Bereitstellungsstrategien gehören Blue-Green Deployments, bei denen zwei identische Umgebungen parallel laufen, wobei eine als Live-Umgebung dient, während die andere die neue Version hostet. Bei Canary-Versionen werden die Änderungen schrittweise an eine kleine Gruppe von Benutzern weitergegeben, bevor eine breitere Bereitstellung erfolgt. Rolling Updates ersetzen nach und nach die Instanzen der alten Version durch die neue, was Ausfallzeiten und Risiken reduziert.
Containerization kapselt eine Anwendung und ihre Abhängigkeiten in einem Container, der auf jeder Computerumgebung ausgeführt werden kann. Dieser Ansatz ist eine schlanke Alternative zu virtuellen Maschinen und bietet Effizienz und Konsistenz in Entwicklungs-, Test- und Produktionsumgebungen. Die Containerisierung vereinfacht die Bereitstellung, Skalierung und Verwaltung von Anwendungen und isoliert sie von der zugrunde liegenden Infrastruktur.
Docker wird verwendet, um Anwendungen mithilfe von Containern zu erstellen, bereitzustellen und auszuführen. Es ermöglicht Entwicklern, eine Anwendung mit all ihren Abhängigkeiten in ein standardisiertes Paket zu packen. Docker bietet die Werkzeuge und die Plattform für die Verwaltung des Lebenszyklus von Containern, einschließlich der Erstellung von Images, der Container-Orchestrierung, der Skalierung und des Netzwerks.
Kubernetes orchestriert containerisierte Anwendungen und verwaltet deren Bereitstellung, Skalierung und Betrieb. Es stellt sicher, dass der gewünschte Zustand der Anwendungen mit dem tatsächlichen Zustand in der Cloud-Umgebung übereinstimmt. Kubernetes automatisiert den Lastausgleich, überwacht den Zustand der Anwendungen und bietet Selbstheilungsfunktionen, indem Container, die ausfallen oder nicht reagieren, neu gestartet oder ersetzt werden. Es übernimmt auch die Erkennung von Diensten und kann Konfiguration und sensible Informationen als Geheimnisse verwalten.
Eine Build-Pipeline besteht aus einer Reihe von automatisierten Prozessen für die Kompilierung von Code, die Durchführung von Tests und die Bereitstellung von Software. Es beginnt mit dem Abrufen von Code aus der Versionskontrolle, gefolgt von der Erstellung ausführbarer Dateien, der Durchführung automatischer Tests und der Bereitstellung in verschiedenen Umgebungen. Die Pipeline ist so konzipiert, dass in jeder Phase Feedback gegeben wird, um die Qualität des Codes zu gewährleisten und den Weg von der Entwicklung bis zur Produktion zu rationalisieren.
Die Testautomatisierung beschleunigt die Validierung von Softwarefunktionalität, Sicherheit und Leistung. Es ermöglicht wiederholte und umfangreiche Tests ohne manuellen Aufwand und verbessert so die Konsistenz und Abdeckung. Automatisierte Tests können in mehreren Umgebungen und auf mehreren Geräten gleichzeitig ausgeführt werden, was den Entwicklern schnelles Feedback gibt und die Markteinführungszeit für neue Versionen verkürzt.
Ein Code-Repository ist ein Speicherort für Code und die dazugehörigen Dateien, der die Versionskontrolle und die Zusammenarbeit erleichtert. Sie dient als zentraler Knotenpunkt für die Speicherung, Verfolgung und Verwaltung von Änderungen an der Codebasis. Repositories unterstützen das Verzweigen und Zusammenführen, so dass Entwickler in isolierten Umgebungen an Funktionen, Korrekturen oder Experimenten arbeiten können, bevor sie die Änderungen in den Hauptcode integrieren
Das Release-Management umfasst die Planung, Terminierung und Kontrolle von Software-Builds in verschiedenen Phasen und Umgebungen. Dazu gehören die Verwaltung der Release-Pipeline, die Koordination mit den Beteiligten, die Sicherstellung der Compliance mit den Release-Kriterien und die Bereitstellung der Software in der Produktion. Der Prozess zielt darauf ab, neue Funktionen und Fehlerbehebungen zuverlässig und effizient bereitzustellen, bei minimaler Unterbrechung der Dienste.
Die agile Methodik betont die iterative Entwicklung, die Zusammenarbeit mit dem Kunden und die Reaktionsfähigkeit auf Veränderungen. Sie plädiert für kleine, inkrementelle Versionen, kontinuierliches Feedback und adaptive Planung. Agile Prinzipien fördern die funktionsübergreifende Zusammenarbeit von Teams, ein nachhaltiges Entwicklungstempo und reflektierende Praktiken zur kontinuierlichen Verbesserung von Prozessen und Produkten.
Die serverlose Architektur ermöglicht es Entwicklern, Anwendungen zu erstellen und auszuführen, ohne die Serverinfrastruktur zu verwalten. Es abstrahiert die Server, so dass sich die Entwickler ausschließlich auf das Schreiben von Code konzentrieren können. Cloud-Anbieter verwalten die Ausführungsumgebung, indem sie die Zuweisung von Ressourcen dynamisch verwalten. Serverlose Architekturen skalieren automatisch mit der Nachfrage und die Nutzer zahlen nur für die verbrauchte Rechenzeit.
Die Optimierung der Leistung umfasst die Optimierung von Systemeinstellungen und Code, um Leistungskennzahlen wie Reaktionszeit, Durchsatz und Ressourcennutzung zu verbessern. Es erfordert die Erstellung von Profilen und die Überwachung von Anwendungen, um Engpässe zu erkennen. Anschließend müssen die Konfigurationen angepasst, der Code optimiert und eine effiziente Ressourcenzuweisung sichergestellt werden, um die Effizienz des Systems insgesamt zu verbessern.
Ausfallsicherheit und Zuverlässigkeit werden durch die Entwicklung fehlertoleranter Systeme gewährleistet, die Ausfälle ohne Serviceunterbrechung bewältigen und sich davon erholen können. Die Implementierung von Redundanz, Failover-Mechanismen, regelmäßigen Tests von Disaster-Recovery-Verfahren und Echtzeitüberwachung trägt zu einer robusten Systemarchitektur bei. Diese Praktiken tragen dazu bei, dass die Leistung und Verfügbarkeit trotz Systembelastungen oder unerwarteter Probleme konstant bleibt.