Verstehen von Containern
In der heutigen wettbewerbsorientierten Landschaft stehen Unternehmen in einem Wettlauf, um agilere Cloud-native Systeme aufzubauen, die dynamische Bereitstellungsmodelle für ihre Anwendungen und Dienste unterstützen. Container sind ein idealer Baustein für dieses neue Modell, da sie leichtgewichtig, plattformübergreifend portabel und leicht skalierbar sind. Dieser Leitfaden gibt Ihnen einen Einblick in die Welt der Container und erläutert die zahlreichen Funktionen und Vorteile der Container-Orchestrierungsplattform Kubernetes.
Was sind Container?
Ein Container ist eine Möglichkeit, Software, z. B. eine Anwendung oder einen Dienst, so zu verpacken, dass sie auf einem Computer gespeichert oder ausgeführt werden kann. Container nutzen die Betriebssystemvirtualisierung ähnlich wie die Hardwarevirtualisierung. Allerdings stützen sich Container auf die Kernel-Funktionen des Host-Betriebssystems und benötigen keine Hardware-Unterstützung.
Mit Containern können Entwickler ihre Anwendungen so verpacken, dass sie in verschiedenen Umgebungen eingesetzt werden können. So kann beispielsweise ein Java-Entwickler seine Anwendung auf CentOS 6 (einem älteren Betriebssystem) entwickeln, während die Software auf CentOS 7 (einem neueren Betriebssystem) läuft. Derselbe Entwickler könnte auch Container verwenden, um seine Anwendung in einer anderen Umgebung auszuliefern.
Eine Möglichkeit, sich einen Container vorzustellen, ist die eines portablen, autarken, ausführbaren Pakets, das alle erforderlichen Abhängigkeiten enthält, einschließlich Code, Laufzeit, Systemtools und Bibliotheken. Sie können von einer Computerumgebung in eine andere verschoben werden (z. B. von Entwicklungs- zu Test- oder Produktionssystemen), ohne dass Konflikte mit anderen Softwareversionen oder Inkompatibilitäten mit gemeinsam genutzten Bibliotheken zu befürchten sind.
Container vs. VMs
Virtuelle Maschinen (VMs) sind eine Technologie, die es ermöglicht, Software, wie z. B. ein Betriebssystem, über einem anderen Betriebssystem laufen zu lassen. Virtuelle Maschinen werden auch als Gastbetriebssysteme bezeichnet. VMs sind Software-Emulationen von Computern, die es ermöglichen, mehrere Betriebssysteme auf demselben physischen Computer auszuführen.
Im Gegensatz zu Containern verfügen VMs über unabhängige Betriebssystem-Kernel, Dateisysteme und Netzwerkschnittstellen. Die Dateien der VMs befinden sich auf einer virtuellen Festplatte, die in einer Datei auf der Festplatte des physischen Computers gespeichert ist. Sie haben auch ihre eigenen IP-Adressen und sind damit unabhängig von den Host-Rechnern.
Container hingegen teilen sich den Kernel des Host-Rechners. Sie nutzen auch die Netzwerkschnittstelle und das Dateisystem des Wirtsrechners. Der Hauptunterschied zwischen Containern und VMs besteht darin, dass Container eine Anwendung mit ihren Abhängigkeiten in eine standardisierte Einheit für die Softwareentwicklung, -bereitstellung und -auslieferung verpacken können. Container haben ihr eigenes Dateisystem, ihren eigenen Speicherplatz und eine isolierte Netzwerkumgebung, die nur die Kommunikation innerhalb des Containers zulässt.
Container-Orchestrierung
Eine Anwendung kann aus einigen wenigen Containern bis hin zu Hunderten von Containern bestehen. Anstatt Container manuell zu verwalten, nutzen Entwickler die Orchestrierung, um alle mit der Ausführung von Containern verbundenen Aufgaben zu erledigen. Die Orchestrierung übernimmt folgende Aufgaben:
- Bereitstellung und Einsatz von Containern
- Container konfigurieren
- Terminplanung
- Zuweisung von Ressourcen
- Verwaltung der Containerverfügbarkeit
- Lastausgleich
- Weiterleitung des Datenverkehrs an Container
- Sicherheit
Es gibt mehrere Lösungen für die Orchestrierung von Containern, aber in den letzten Jahren hat sich Kubernetes zum De-facto-Standard für die Bereitstellung und Orchestrierung von containerisierten Anwendungen entwickelt. Kubernetes wurde ursprünglich bei Google entwickelt und 2014 als Open-Source-Lösung veröffentlicht. Aufbauend auf Googles langjähriger Erfahrung mit der Ausführung von Container-Workloads in großem Maßstab macht es alles, was mit der Bereitstellung und Verwaltung von Containern zu tun hat, einfacher und sicherer.
Kubernetes-Architektur für die Orchestrierung
Ein Kubernetes-Cluster besteht aus einem oder mehreren Knoten, auf denen mehrere Container laufen können, die systematisch in sogenannten Pods organisiert sind.
Knotenpunkte
Knoten sind virtuelle Maschinen, die über die Kubernetes-Kontrollebene miteinander kommunizieren. Die Kubernetes-Kontrollebene verwendet Netzwerk- und Speicherressourcen, die vom Kubernetes-API-Server und -Scheduler verwaltet werden, um sicherzustellen, dass Pods auf Knoten mit ausreichenden Ressourcen eingeplant werden und dass Pods auf Knoten mit verfügbarer Kapazität platziert werden.
Pods (Was ist ein Kubernetes-Pod im Vergleich zu einem Container)
Ein Kubernetes-Pod ist eine logische Gruppe von einem oder mehreren Containern, die sich dasselbe Netzwerk, denselben Speicher und andere Ressourcen teilen. Er enthält die systematischen Anforderungen der Anwendung, die er bedient. Pods sind das kleinste und grundlegendste Objekt in Kubernetes.
Container Vorteile
Container haben sich zu einem wertvollen Werkzeug für die Erstellung schlanker Software entwickelt, die schnell bereitgestellt und skaliert werden kann. Container bieten zusätzliche Vorteile wie:
Geringere Komplexität - Anstatt für jede Anwendung eine eigene Betriebssysteminstanz einzurichten, können Sie mit Containern eine einzige Betriebssysteminstanz einrichten, auf der mehrere Anwendungen laufen. Dies reduziert die Komplexität, da weniger Betriebssysteme benötigt werden, was wiederum Hardwarekosten spart und den Verwaltungsaufwand verringert, da weniger Instanzen eingerichtet und gewartet werden müssen.
Kostenreduzierung - Je weniger Instanzen benötigt werden, desto geringer sind die Kosten. Container sind außerdem sehr effizient und ermöglichen es Ihnen, mehr Anwendungen pro Server auszuführen als herkömmliche virtuelle Maschinen. Eine einzige Betriebssysteminstanz kann mehrere Container ohne zusätzlichen Overhead unterstützen. Darüber hinaus sind Container schneller als virtuelle Maschinen, da nicht für jede Anwendung ein ganzes Gastbetriebssystem ausgeführt und verwaltet werden muss.
Nutzung der bestehenden Infrastruktur - Die Verwendung von Containern erfordert keine Änderungen an der bestehenden Infrastruktur, da sie Standard-Hardware- und -Softwarekonfigurationen für Betriebssysteme und Hypervisoren verwenden. Dies bedeutet, dass keine zusätzliche Hardware erforderlich ist.
Aufrechterhaltung der Sicherheit - Container sind weniger komplex als virtuelle Maschinen und daher sicherer. Da sie sich eine Betriebssysteminstanz teilen, müssen nicht mehrere Betriebssysteme auf derselben Hardware ausgeführt werden, was die Anzahl potenzieller Angriffspunkte verringert. Da Container nicht über ein vollständiges Betriebssystem verfügen, müssen auch keine Patches für ein Gastbetriebssystem installiert werden - Patches müssen nur auf der Kernel-Ebene angewendet werden. Dies macht Container auch einfacher und flexibler als virtuelle Maschinen, da keine Image-Konsistenz zwischen verschiedenen Versionen eines Betriebssystems erforderlich ist.
Kosten senken - Durch den Einsatz von Containern können Sie die IT-Kosten senken, da Sie mehrere Anwendungen auf weniger Servern konsolidieren und zentral über eine Container-Plattform für Unternehmen verwalten können. Außerdem können Sie die vorhandene Infrastruktur wie Speicher und Netzwerke nutzen, ohne in neue Hardware investieren zu müssen.
Verbesserte Leistung - Da Container Standardhardware- und -softwarekonfigurationen für Betriebssysteme und Anwendungen verwenden, können sie in großem Umfang ohne Leistungseinbußen bereitgestellt werden. Da Container zustandslos sind, können sie schnell und einfach gestartet und gestoppt werden, was die Leistung von mandantenfähigen Anwendungen verbessert.
Verbesserung der Sicherheit - Container ermöglichen die Ausführung mehrerer Anwendungen auf einem einzigen Server, ohne die Sicherheit dieser Anwendungen zu beeinträchtigen. Dies hilft Unternehmen bei der Einhaltung von Vorschriften, reduziert die Anzahl potenzieller Angriffspunkte und vereinfacht Compliance-Tests.
Bessere Übertragbarkeit von Anwendungen - Durch das Verpacken von Komponenten in Containern, die in sich geschlossen und von anderen Komponenten unabhängig sind, können Sie sie im Falle einer Katastrophe oder einer anderen Störung problemlos zwischen Servern oder Rechenzentren verschieben. Dies erleichtert die Migration auf neue Hardware, ohne dass Sie sich Gedanken über Kompatibilitätsprobleme oder Abhängigkeiten zwischen Softwarekomponenten machen müssen.
Geringere Netzwerklatenz - Da jeder Container von anderen Containern auf demselben Host-Server isoliert ist, wird die Latenz im Vergleich zu virtuellen Maschinen, die auf demselben physischen Server gehostet werden, erheblich reduziert. Dies kann zu einer erheblichen Leistungssteigerung führen, insbesondere bei der Ausführung von mandantenfähigen Anwendungen, bei denen mehrere Benutzer gleichzeitig auf denselben Server zugreifen wollen.
Geringerer betrieblicher Aufwand - Da Container leichtgewichtig sind und weniger Ressourcen verbrauchen als virtuelle Maschinen, ist es einfacher, Ihre Anwendung horizontal zu skalieren, indem Sie weitere Server zu Ihrer Umgebung hinzufügen. Das bedeutet, dass Sie Verkehrsspitzen problemlos bewältigen können, ohne eine Überlastung Ihrer Infrastruktur befürchten zu müssen.
Ausführen von Legacy-Anwendungen - Mit Containern können Sie Legacy-Anwendungen, die für ältere Versionen von Betriebssystemen geschrieben wurden, mit minimalem Aufwand auf neueren Versionen des Betriebssystems ausführen. Dies erleichtert Unternehmen mit älteren Anwendungen die Migration ihrer Umgebungen auf neuere Hardware und senkt die Gesamtkosten.
Container-Sicherheit mit Kubernetes
Wenn es um die Absicherung von Containern geht, bietet Kubernetes mehrere Befestigungsschichten, die Sie für einen "Defense-at-depth"-Ansatz berücksichtigen müssen. Sowohl die Absicherung von containerisierten Anwendungen als auch der Zugang zu Kubernetes selbst sollten als entscheidend für den Erfolg der IT-Sicherheit angesehen werden.
Kubernetes-API-Authentifizierung und -Autorisierung
Da die Kubernetes-API die zentrale Steuereinheit eines Kubernetes-Clusters ist, muss der Zugang zu ihr ordnungsgemäß gesichert werden. Dies kann damit beginnen, den Kubernetes-API-Endpunkt in ein privates Netzwerk einzubinden, aber vor allem ist die ordnungsgemäße Verwendung von Authentifizierungs- und Autorisierungsmechanismen erforderlich.
Um eine Anfrage zu authentifizieren (d. h. zu überprüfen, wer die Anfrage sendet), bietet Kubernetes mehrere Mechanismen:
- TLS-Client-Zertifikate
- OIDC
- Service Konto Token
- Statische Token
Um eine Anfrage zu autorisieren (d.h. ist der authentifizierte Benutzer berechtigt, die angeforderte Aktion durchzuführen), steht eine rollenbasierte Zugriffskontrolle (RBAC) zur Verfügung. Rollen können Benutzern oder Gruppen zugewiesen werden und sollten nur das Nötigste erlauben, damit eine Person ihre Arbeit ausführen kann. Insbesondere clusterweite Berechtigungen sollten streng überwacht und mit Bedacht vergeben werden.
Namespaces ermöglichen die Trennung von Einzelpersonen oder Teams und ihren Arbeitslasten und geben Cluster-Administratoren die Möglichkeit, RBAC-Berechtigungen auf die logische Einheit eines Teams in einem Kubernetes-Cluster zu beschränken. Die ordnungsgemäße Verwendung von Namespaces kann die Sicherheit verbessern, indem sie die Auswirkungen einer Kompromittierung von Anmeldeinformationen verringert, da diese nur auf einen kleinen Teil des Clusters und seiner Arbeitslasten zugreifen können.
Lesen Sie unseren Blogbeitrag: Kubernetes-Sicherheitspraktiken
Sicherung von Container-Workloads
Abgesehen von Kubernetes selbst können Container-Workloads natürlich auch über die Standardeinstellungen hinaus gesichert werden, die Kubernetes bei der Erstellung z. B. eines Pods bietet. Diese Regelsätze, die Firewalls ähneln, erlauben es, Einschränkungen sowohl für den externen Verkehr zu Pods als auch für den Verkehr zwischen Pods im selben Cluster zu definieren. Neben der Verhinderung von Angriffen von außen kann der richtige Einsatz von NetworkPolicies die Auswirkungen, die ein kompromittierter Pod auf Ihre Umgebung haben kann, drastisch reduzieren. Wenn ein Pod zum Beispiel keine ausgehenden Netzwerkverbindungen haben soll, können diese über NetworkPolicies verboten werden.
Darüber hinaus bietet Kubernetes eine beträchtliche Anzahl optionaler Einstellungen für Ihre Arbeitslasten, um die Anwendungssicherheit zu erhöhen, Funktionen zu deaktivieren, die möglicherweise nicht benötigt werden (z. B. kann das Dateisystem des Containers auf schreibgeschützt gesetzt werden, um Schreibvorgänge zu verhindern) oder die Container-Sandbox über die standardmäßige Prozessisolierung hinaus zu verbessern. Diese Maßnahmen hängen teilweise vom Anwendungsprofil ab und sind daher möglicherweise nicht allgemein anwendbar, sollten aber nach Möglichkeit geprüft und angewendet werden.
Die Einhaltung spezifischer Regeln für Workload-Einstellungen (z. B. alle Container müssen als ein bestimmter Nicht-Root-Benutzer ausgeführt werden) kann mit Tools wie OPA Gatekeeper durchgesetzt werden, um die einheitliche Verwendung von Standards innerhalb einer Organisation zu gewährleisten.
Video: Kyverno vs. Open Policy Agent - Aktualisieren Sie Ihr Kubernetes Policy Management
Was sind Containerplattformen?
Containerplattformen sind Softwaresysteme, die eine vollständige Umgebung für die Ausführung, Verwaltung und Orchestrierung von Containern bieten. Container sind leichtgewichtige, eigenständige und ausführbare Einheiten, die alles enthalten, was zur Ausführung von Software benötigt wird, einschließlich Code, Laufzeit, Bibliotheken und Systemtools.
Komponenten der Containerplattformen:
Container-Laufzeit: Die Engine, die Container ausführt und verwaltet (z. B. Docker, containerd).
Orchestrierung: Tools und Frameworks zur Verwaltung der Bereitstellung, Skalierung und des Betriebs von containerisierten Anwendungen (z. B. Kubernetes, Docker Swarm, OpenShift).
Verwaltungswerkzeuge: Schnittstellen und APIs für die Verwaltung von Container-Lebenszyklus, Netzwerk, Speicher und Sicherheit.
Warum Containerplattformen verwenden?
Effizienz und Ressourcenoptimierung: Container-Plattformen tragen zur Ressourcenoptimierung bei, indem sie mehrere Container auf einem einzigen Host ohne den Overhead virtueller Maschinen ausführen. Dies erhöht die Effizienz und senkt die Kosten.
Konsistenz in verschiedenen Umgebungen: Container kapseln Anwendungen und ihre Abhängigkeiten und stellen sicher, dass sie in verschiedenen Umgebungen - Entwicklung, Test oder Produktion - konsistent laufen.
Skalierbarkeit: Container-Plattformen erleichtern die Skalierung von Anwendungen. Sie können schnell neue Container starten, um erhöhte Lasten zu bewältigen, und sie abschalten, wenn sie nicht mehr benötigt werden.
Isolierung und Sicherheit: Container bieten ein gewisses Maß an Isolierung zwischen den Anwendungen, wodurch das Risiko von Sicherheitsverletzungen verringert wird. Jeder Container läuft unabhängig und verhindert, dass ein Container andere auf demselben Host beeinträchtigt.
DevOps und CI/CD-Integration: Container-Plattformen lassen sich nahtlos in DevOps-Tools und CI/CD-Pipelines (Continuous Integration/Continuous Deployment) integrieren und ermöglichen automatisierte Tests, Bereitstellung und Updates.
Portabilität: Container können auf jedem System ausgeführt werden, das die Container-Laufzeitumgebung unterstützt, wodurch es einfacher wird, Anwendungen ohne Kompatibilitätsprobleme zwischen verschiedenen Umgebungen und Plattformen zu verschieben.
Wie verwendet man Containerplattformen?
Wählen Sie eine Container-Plattform: Zu den gängigen Container-Plattformen gehören Docker, Kubernetes, OpenShift und Docker Swarm. Kubernetes ist die am weitesten verbreitete Plattform für die Orchestrierung von containerisierten Anwendungen.
Containerisieren Sie Ihre Anwendungen: Beginnen Sie mit der Erstellung von Docker-Images für Ihre Anwendungen. Dazu müssen Sie eine Dockerdatei schreiben, die die Umgebung und die Abhängigkeiten angibt, die für die Ausführung Ihrer Anwendung erforderlich sind.
Bereitstellen und Verwalten von Containern: Verwenden Sie die von Ihnen gewählte Plattform zur Bereitstellung, Verwaltung und Überwachung von Containern. Kubernetes zum Beispiel verwendet YAML-Dateien, um den gewünschten Zustand Ihrer Anwendung zu definieren, einschließlich der Anzahl der Replikate, die jeder Container ausführen soll.
Vernetzung und Speicherung: Konfigurieren Sie das Netzwerk, damit Container untereinander und mit externen Diensten kommunizieren können. Richten Sie außerdem Speicherlösungen ein, um die Datenpersistenz über Container-Neustarts hinweg zu verwalten.
Skalierung und Lastausgleich: Nutzen Sie die Möglichkeiten der Plattform, um Ihre Anwendungen automatisch je nach Bedarf zu skalieren und die Last mithilfe der integrierten Lastausgleichsfunktionen gleichmäßig auf Container zu verteilen.
Überwachung und Protokollierung: Implementieren Sie Überwachungs- und Protokollierungslösungen, um die Containerleistung zu überwachen und Probleme zu diagnostizieren. Tools wie Prometheus, Grafana und ELK-Stack (Elasticsearch, Logstash, Kibana) werden häufig verwendet.
Sicherheit und Compliance: Stellen Sie sicher, dass Ihre Container und Ihre Plattform sicher sind, indem Sie Best Practices befolgen, z. B. Container mit den geringsten Rechten ausführen, vertrauenswürdige Images verwenden und Ihre Container und Ihre Plattform regelmäßig aktualisieren.
Automatisierung mit CI/CD: Integrieren Sie Ihre Container-Plattform in CI/CD-Pipelines, um das Erstellen, Testen und Bereitstellen von Containern zu automatisieren und so eine schnellere und zuverlässigere Bereitstellung von Updates und neuen Funktionen zu ermöglichen.
Der effektive Einsatz von Container-Plattformen kann Ihre Entwicklungs- und Bereitstellungsprozesse verändern und sie flexibler, skalierbarer und effizienter machen. Wenn Sie verstehen, warum und wie diese Plattformen eingesetzt werden, können Sie ihre Fähigkeiten voll ausschöpfen, um Ihren IT-Betrieb und die Anwendungsbereitstellung zu verbessern.
Beispiele für Container-Plattformen
1. Docker
Docker ist eine der bekanntesten und am weitesten verbreiteten Container-Plattformen. Sie bietet eine unkomplizierte Möglichkeit, Anwendungen und ihre Abhängigkeiten in Container zu verpacken.
Wesentliche Merkmale:
Vereinfachte Erstellung und Verwaltung von Containern
Umfangreiche Bibliothek mit vorgefertigten Containern in Docker Hub
Unterstützung für Multicontainer-Anwendungen mit Docker Compose
Integration mit verschiedenen CI/CD-Tools
2. Kubernetes
Kubernetes ist eine Open-Source-Plattform zur Orchestrierung von Containern, die zur Automatisierung der Bereitstellung, Skalierung und Verwaltung von containerisierten Anwendungen entwickelt wurde.
Wesentliche Merkmale:
Automatisierte Skalierung und Lastausgleich
Selbstheilungsfunktionen zum automatischen Austausch ausgefallener Container
Fortlaufende Aktualisierungen und Rollbacks
Umfangreiches Ökosystem und Unterstützung für Multi-Cloud-Implementierungen
3. OpenShift
OpenShift, entwickelt von Red Hat, ist eine Kubernetes-Container-Plattform für Unternehmen. Sie enthält zusätzliche Tools und Funktionen, um die Fähigkeiten von Kubernetes zu erweitern.
Wesentliche Merkmale:
Integrierte CI/CD-Pipelines mit Jenkins
Verbesserte Sicherheits- und Compliance-Funktionen
Entwicklerfreundliche Tools und Benutzeroberflächen
Integration in das Red Hat-Ökosystem und die Support-Services
4. Amazon Elastic Kubernetes Service (EKS)
Amazon EKS ist ein verwalteter Kubernetes-Service von AWS. Er vereinfacht die Ausführung von Kubernetes in der AWS-Cloud, indem er die Verwaltungsaufgaben der Steuerungsebene übernimmt.
Wesentliche Merkmale:
Verwaltete Kubernetes-Kontrollebene
Integration mit AWS-Diensten wie IAM, CloudWatch und ELB
Skalierbarkeit und hohe Verfügbarkeit mit AWS-Infrastruktur
Vereinfachte Bereitstellung und Verwaltung von Clustern
5. Google Kubernetes Engine (GKE)
GKE ist der verwaltete Kubernetes-Service von Google Cloud, der eine optimierte Methode zur Bereitstellung, Verwaltung und Skalierung von containerisierten Anwendungen mit Kubernetes bietet.
Wesentliche Merkmale:
Automatisierte Upgrades und Patches
Integration mit Google Cloud-Diensten wie BigQuery und Pub/Sub
Verbesserte Sicherheitsfunktionen wie GKE-Sandbox und binäre Autorisierung
Unterstützung für hybride und Multi-Cloud-Umgebungen mit Anthos
6. Azure Kubernetes-Dienst (AKS)
AKS ist der verwaltete Kubernetes-Dienst von Microsoft Azure, der eine einfache Bereitstellung und Verwaltung von Kubernetes-Clustern in der Azure-Cloud ermöglicht.
Wesentliche Merkmale:
Verwaltete Kubernetes-Kontrollebene
Integration mit Azure-Diensten wie Azure Active Directory und Azure Monitor
Vereinfachte Überwachung und Skalierung
Hybride Funktionen mit Azure Arc
7. Rancher
Rancher ist eine Open-Source-Container-Management-Plattform, die die Bereitstellung und Verwaltung von Kubernetes-Clustern in verschiedenen Umgebungen vereinfacht.
Wesentliche Merkmale:
Zentralisierte Verwaltung für mehrere Kubernetes-Cluster
Benutzerfreundliche Schnittstelle für die Clusterverwaltung
Integrierte Überwachungs-, Protokollierungs- und Alarmierungswerkzeuge
Multi-Cloud- und On-Premises-Unterstützung
8. IBM Cloud Kubernetes Dienst
IBM Cloud Kubernetes Service bietet eine verwaltete Kubernetes-Lösung in der IBM Cloud mit Schwerpunkt auf Sicherheit und Integration mit den Cloud-Angeboten von IBM.
Wesentliche Merkmale:
Verwaltete Kubernetes mit automatischen Updates und Skalierung
Integration mit IBM Watson und anderen IBM Cloud-Diensten
Verbesserte Sicherheits- und Compliance-Funktionen
Globale Reichweite mit der Cloud-Infrastruktur von IBM