Container haben sich als Standard für die cloudnative Anwendungsentwicklung etabliert, und Kubernetes, auch bekannt als K8s, ist wohl das beliebteste Tool zur Container-Orchestrierung. Eine Umfrage der Cloud Native Computing Foundation (CNCF) ergab, dass 91 % der Befragten Kubernetes einsetzen, 83 % davon in der Produktion. Im Vorjahr waren es noch 78 %.
Beliebt zu sein bedeutet jedoch nicht, dass Kubernetes einfach zu bedienen ist. Kubernetes ist ein komplexes System. Der Einstieg ist mit einer erheblichen Lernkurve verbunden. Auch wenn die folgenden Kubernetes-Best-Practices und Empfehlungen möglicherweise nicht auf Ihre Situation anwendbar sind, können die passenden Ihnen helfen, Kubernetes einfacher und schneller optimal zu nutzen.
Siehe auch: Top-Cloud-Unternehmen
20 Kubernetes-Best-Practices
1) Hosting durch einen Anbieter nutzen
Nutzen Sie externes Hosting, um Ihre Kubernetes-Bereitstellung auf den Weg zu bringen. Je nach Art des von Ihnen gewählten gehosteten Dienstes muss sich Ihr Team weder um die manuelle Bereitstellung der Komponenten der Control Plane noch um das Hinzufügen von Nodes zur Erweiterung Ihres Clusters oder die Konfiguration der Pods kümmern, die Ihre Container unterstützen. Auch die Implementierung einer rollenbasierten Zugriffskontrolle (RBAC) zur Absicherung Ihrer getrennten Umgebungen sowie die Einrichtung von Monitoring und Protokollierung für Ihren Cluster entfällt.
2) Die neueste Version verwenden
Verwenden Sie die neueste Version von Kubernetes. Neben Updates und zusätzlichen Funktionen enthält das aktuelle Release auch Patches für Sicherheitsprobleme früherer Versionen. Das ist entscheidend, um viele der Schwachstellen einzudämmen, die Ihren Cluster beeinträchtigen könnten. Ältere Versionen werden außerdem von der Kubernetes-Community weniger stark unterstützt.
3) Ein Versionskontrollsystem verwenden
Sie sollten Konfigurationsdateien für Ihre Bereitstellung, Ingress, Services und andere Dateien in einem Versionskontrollsystem speichern, bevor Sie sie in einen Cluster übertragen. So können Sie nachvollziehen, wer Änderungen vorgenommen hat, und einen Genehmigungsprozess für Änderungen einführen, um die Stabilität und Sicherheit Ihres Clusters zu verbessern.
4) Labels und Annotationen verwenden
Je mehr Objekte sich in Ihrem Cluster befinden, desto schwieriger wird es, sie zu finden und zu organisieren. Labels ─ Schlüssel-Wert-Strukturen, die Objekten zugewiesen werden ─ ermöglichen es Ihnen, aussagekräftige und relevante Metadaten an Clusterobjekte anzuhängen, damit diese kategorisiert, gefunden und gesammelt bearbeitet werden können.
Mit Labels können Sie feststellen, ob ein Pod Teil einer Produktions- oder Canary-Bereitstellung ist und ob er zum Frontend oder Backend gehört. Sie können außerdem angeben, welcher Schicht ein Objekt angehört und welche Release-Version es hat, sowie zwischen stabilen und Alpha-Releases unterscheiden.
5) Readiness- und Liveness-Probes verwenden
Readiness- und Liveness-Probes sind im Wesentlichen Zustandsprüfungen. Eine Readiness-Probe stellt sicher, dass ein bestimmter Pod aktiv ist und ausgeführt wird, bevor die Last an diesen Pod weitergeleitet wird. Ist der Pod nicht bereit, werden Anfragen von Ihrem Service abgezogen, bis die Probe bestätigt, dass der Pod aktiv ist. Eine Liveness-Probe überprüft, ob die Anwendung noch ausgeführt wird. Sie versucht, den Pod anzupingen, um eine Antwort zu erhalten, und prüft anschließend dessen Zustand. Gibt es keine Antwort, wird die Anwendung auf dem Pod nicht ausgeführt. Wenn die Prüfung fehlschlägt, startet die Liveness-Probe einen neuen Pod und die Anwendung darauf.
6) Ressourcenanforderungen und -limits festlegen
Ressourcenanforderungen geben die Mindestressourcen an, die ein Container verwenden kann, während Ressourcenlimits die maximalen Ressourcen festlegen.
Ohne Ressourcenanforderungen und -limits können Pods in einem Cluster mehr Ressourcen als erforderlich verwenden. Beginnt der Pod, mehr CPU oder Arbeitsspeicher auf dem Node zu verbrauchen, kann der Scheduler möglicherweise keine neuen Pods platzieren. Sogar der Node selbst kann abstürzen.
Für Anforderungen und Limits ist es üblich, die CPU in Millicores anzugeben. Der Arbeitsspeicher wird in Megabytes oder Mebibytes angegeben.
7) Kleinere Container-Images verwenden
Basis-Images können zu bis zu 80 % aus Paketen und Bibliotheken bestehen, die nicht benötigt werden. Verwenden Sie stattdessen kleinere Container-Images wie Alpine-Images, die zehnmal kleiner als Basis-Images sind. Sie benötigen weniger Speicherplatz und helfen Ihnen, das Image schneller abzurufen und zu erstellen. Außerdem sinkt mit der Größe des Container-Images die Wahrscheinlichkeit von Sicherheitsproblemen. Anschließend können Sie alle Pakete und Bibliotheken hinzufügen, die zum Ausführen Ihrer Anwendung erforderlich sind.
8) Komponenten der Control Plane überwachen
Überwachen Sie Workload und Ressourcenverbrauch sowie die Leistung der Komponenten der Control Plane, darunter die Kubernetes-API, kubelet, etcd, controller-manager, kube-proxy und kube-dns. Dadurch lassen sich Probleme und Bedrohungen innerhalb des Clusters erkennen und seine Latenz erhöhen.
Sie sollten außerdem automatisierte Monitoring-Tools verwenden, statt die Warnmeldungen manuell zu verwalten.
9) Autoscaling verwenden
Nutzen Sie die Autoscaling-Mechanismen von Kubernetes, um Cluster-Services bei einem Anstieg des Ressourcenverbrauchs automatisch zu skalieren.
Der horizontale Pod-Autoscaler skaliert die Anzahl der Pods in einer Bereitstellung, einem Replication Controller, einem ReplicaSet oder einem StatefulSet automatisch auf Grundlage der wahrgenommenen CPU-Auslastung.
Der vertikale Pod-Autoscaler empfiehlt geeignete Werte für CPU- und Arbeitsspeicheranforderungen sowie -limits. Außerdem kann er die Werte automatisch aktualisieren.
Der Cluster-Autoscaler vergrößert und verkleinert den Pool der Worker-Nodes. Er passt die Größe eines Kubernetes-Clusters an die aktuelle Auslastung an.
10) GitOps einführen
Verwenden Sie GitOps, einen Git-basierten Workflow, als bevorzugtes Modell, bei dem Git als zentrale Quelle der Wahrheit für sämtliche Automatisierung dient, einschließlich CI/CD-Pipelines. Ein GitOps-Framework kann die Produktivität steigern, indem es die Anwendungsentwicklung beschleunigt und Bereitstellungszeiten verkürzt. Außerdem kann es die Nachverfolgbarkeit von Fehlern verbessern und CI/CD-Workflows automatisieren.
11) Festplattennutzung überwachen
Da eine hohe Festplattennutzung die Clusterleistung beeinträchtigen kann, sollten Sie regelmäßig alle mit Ihrem Cluster verbundenen Festplattenvolumes sowie das Root-Dateisystem überwachen. Mithilfe der Überwachung von Warnmeldungen können Sie bei Bedarf Korrekturmaßnahmen ergreifen, indem Sie entweder skalieren oder Speicherplatz freigeben.
12) Mit zustandslosen Anwendungen beginnen
Mit einem zustandslosen Backend können Entwicklungsteams sicherstellen, dass keine langlebigen Verbindungen die Skalierung erschweren. Die Verwendung zustandsloser Anwendungen ermöglicht Entwicklern außerdem, Anwendungen effizienter und ohne Ausfallzeiten bereitzustellen.
Zustandslose Anwendungen lassen sich entsprechend den geschäftlichen Anforderungen leichter migrieren und bei Bedarf skalieren.
Siehe auch: Top-Edge-Unternehmen
Kubernetes-Best-Practices: Autorisierung und Authentifizierung
13) Rollenbasierte Zugriffskontrolle einsetzen
Um die Sicherheit Ihrer Kubernetes-Workloads zu erhöhen, aktivieren Sie die rollenbasierte Zugriffskontrolle (Role-Based Access Control, RBAC) von Kubernetes. RBAC ist in Kubernetes 1.6 und höher normalerweise standardmäßig aktiviert. Da Kubernetes Autorisierungscontroller kombiniert, müssen Sie bei der Aktivierung von RBAC auch die veraltete attributbasierte Zugriffskontrolle (Attribute Based Access Control, ABAC) deaktivieren.
Weisen Sie jedem Benutzer in Ihrem Cluster und jedem in Ihrem Cluster ausgeführten Service Account Rollen zu. Rollen in RBAC enthalten mehrere Berechtigungen, die ein Benutzer oder Service Account ausüben kann. Sie können dieselbe Rolle mehreren Personen zuweisen, und jede Rolle kann mehrere Berechtigungen umfassen. RBAC-Einstellungen können auch auf Namespaces angewendet werden. Wenn Sie einem Benutzer eine Rolle zuweisen, die in einem Namespace zulässig ist, hat dieser keinen Zugriff auf andere Namespaces im Cluster. Kubernetes stellt RBAC-Eigenschaften wie Rolle und Clusterrolle bereit, um Sicherheitsrichtlinien zu definieren.
14) Drittanbieter-Authentifizierung für den API-Server verwenden
Integrieren Sie Kubernetes in einen Authentifizierungsanbieter eines Drittanbieters, um zusätzliche Sicherheitsfunktionen wie die Multi-Faktor-Authentifizierung zu nutzen. Dadurch lässt sich außerdem sicherstellen, dass sich kube-apiserver beim Hinzufügen oder Entfernen von Benutzern nicht ändert. Stellen Sie nach Möglichkeit sicher, dass Benutzer nicht auf der Ebene des API-Servers verwaltet werden.
Siehe auch: DevOps, Low-Code und RPA: Vor- und Nachteile
Kubernetes-Best-Practices: Sicherheitsprobleme
15) Netzwerkrichtlinien verwenden
Verwenden Sie Netzwerkrichtlinien, um den Zugriff auf Services innerhalb eines Kubernetes-Clusters einzuschränken. Sie können auch den Zugriff von Pods im Cluster auf die Metadaten-API Ihrer Cloud beschränken und den Datenverkehr auf Ebene der IP-Adresse oder des Ports steuern.
Informationen zum Einrichten einer Netzwerkrichtlinie finden Sie in der Kubernetes-Dokumentation.
16) Nicht als Root ausführen
Die UID (die von den Kubernetes-Systemen generierte Zeichenfolge, die Objekte eindeutig identifiziert) des Benutzers, der einen Container ausführt, wird direkt dem Host zugeordnet. Wird der Container als UID 0 (Root) ausgeführt, erscheint er auf dem Node, auf dem er ausgeführt wird, ebenfalls als Root.
Kubernetes verfügt über integrierte Schutzmechanismen, die eine Rechteausweitung mit diesem Mechanismus verhindern. Dennoch besteht immer die Möglichkeit, dass Sicherheitsprobleme eine Ausweitung von Berechtigungen ermöglichen. Vermeiden Sie dies, indem Sie Ihre Container nicht als Root ausführen. Ändern Sie stattdessen das Dockerfile für Ihre erstellten Container so, dass ein Benutzer mit einer bekannten UID angelegt und verwendet wird.
17) Eine Firewall einrichten
Richten Sie eine Firewall für Ihren API-Server ein, um zu verhindern, dass Angreifer aus dem Internet Verbindungsanfragen an Ihren API-Server senden. Sie können reguläre Firewalling-Regeln oder Firewall-Regeln für Ports verwenden. Wenn Sie etwas wie GKE einsetzen, können Sie eine Funktion für autorisierte Master-Netzwerke verwenden, um die IP-Adressen zu begrenzen, die auf den API-Server zugreifen können.
18) API-Zugriff beschränken
Die meisten Cloud-Implementierungen für Kubernetes beschränken den Zugriff auf die Kubernetes-API Ihres Clusters bereits mithilfe von RBAC, Identity & Access Management (IAM) oder Active Directory (AD). Wenn Ihr Cluster diese Methoden nicht verwendet, richten Sie sie mithilfe von Open-Source-Projekten für die Interaktion mit verschiedenen Authentifizierungsmethoden ein.
19) SSH-Zugriff beschränken
Eine weitere wichtige Sicherheitsmaßnahme besteht darin, den SSH-Zugriff auf Ihre Kubernetes-Nodes zu beschränken. Normalerweise würden Sie Port 22 auf keinem Node geöffnet lassen, benötigen ihn aber möglicherweise irgendwann zur Fehlerbehebung. Konfigurieren Sie Ihre Nodes über Ihren Cloud-Anbieter so, dass der Zugriff auf Port 22 außer über das VPN Ihrer Organisation oder einen Bastion Host blockiert wird. So erhalten Sie schnell SSH-Zugriff, während Angreifer von außen keinen Zugriff haben.
20) Richtlinienprotokolle prüfen
Prüfen Sie regelmäßig alle unter /var/log/audit.log gespeicherten Protokolle, um Bedrohungen zu erkennen, den Ressourcenverbrauch zu überwachen und wichtige Ereignis-Heartbeats des Kubernetes-Clusters zu erfassen. Die Standardrichtlinien des Kubernetes-Clusters sind in der Datei /etc/kubernetes/audit-policy.yaml definiert. Sie können diese an spezifische Anforderungen anpassen. Außerdem können Sie Fluentd, ein Open-Source-Tool, verwenden, um eine zentrale Protokollierungsebene für Ihre Container zu verwalten.
Siehe auch: Wie Datenbankvirtualisierung die Migration eines Data Warehouse in die Cloud unterstützt
Kubernetes-Best-Practices: Kontinuierliches Lernen ist erforderlich
Diese Kubernetes-Best-Practices sind nur einige der vielen verfügbaren Maßnahmen, die Kubernetes zu einem leichter nutzbaren und wertvolleren System für die Anwendungsentwicklung machen. Dennoch gibt es noch viel zu lernen, um Kubernetes effektiv einzusetzen.
Das kann für Entwicklungsteams überwältigend sein, die bereits mit den zahlreichen Aufgaben der modernen Anwendungsentwicklung überlastet sind ─ selbst angesichts der stetig wachsenden Zahl von Tools und Services zur Beschleunigung der damit verbundenen Prozesse. Wenn Sie jedoch mit diesen Tipps beginnen, sind Sie auf dem besten Weg, Ihre komplexen Anwendungsentwicklungsprojekte mit Kubernetes voranzubringen.
Siehe auch: Technologieprognosen für 2022: Cloud, Daten, Cybersicherheit, KI und mehr
Über den Autor:
Alexander Ivenin ist Technical Lead für Systeme bei ClearScale.


