Ein kritischer Leitfaden zu Kubernetes
- Kubernetes hat unter manchen Entwicklerinnen und Entwicklern den Ruf, unnötig komplex und eine Zeitverschwendung zu sein; sein Einsatz in kleinen Teams gilt oft als Overengineering.
- Bei Jamsocket wird Kubernetes seit mehreren Jahren in Produktionsumgebungen betrieben, wobei ein effizienter Umgang gefunden wurde: Man nutzt nur die benötigten Funktionen und ignoriert den Rest.
Warum Kubernetes verwenden
- Kubernetes ist der am besten ausgetretene Weg, wenn man alle drei der folgenden Dinge gleichzeitig will:
- Wenn man mehrere Prozesse/Server/geplante Jobs ausführen möchte.
- Wenn man diese redundant betreiben und die Last verteilen möchte.
- Wenn man ihre Konfiguration und ihre Beziehungen untereinander als Code definieren möchte.
- Kubernetes ist eine Abstraktionsschicht, mit der sich ein Pool von Computern wie ein einziger kopfloser Computer behandeln lässt.
- Jamsocket deployt mehrmals täglich, und wenn es Probleme mit dem Produkt gibt, sind auch die Produkte der Kunden betroffen; Rolling Deployments geben daher die nötige Sicherheit, häufig auszurollen.
Wie Kubernetes verwendet wird
- Jamsocket ist ein Dienst, der dynamische Prozesse erzeugt, die mit Web-Apps kommunizieren können, ähnlich wie AWS Lambda, nur dass die Lebensdauer der Prozesse nicht an eine einzelne Anfrage/Antwort, sondern an eine WebSocket-Verbindung gebunden ist.
- Kubernetes wird genutzt, um langlebige Prozesse wie API-Server, Container-Registry, Controller, Log-Sammler, einige DNS-Dienste und Metrik-Erfassung zu betreiben.
- Dinge, für die Kubernetes nicht verwendet wird: kurzlebige Prozesse, statische/Marketing-Websites, Dinge, die Daten direkt speichern.
- Mit Google Kubernetes Engine wird das Kubernetes-Management nach außen ausgelagert; ein Wechsel zu Amazon EKS ist bei Bedarf vergleichsweise einfach.
Aktiv genutzte Kubernetes-Ressourcen
- Deployments: Die meisten Pods werden über Deployments erzeugt.
- Services: Verwendet werden ClusterIP für interne Dienste und LoadBalancer für externe Dienste.
- CronJobs: Werden für Bereinigungsskripte und Ähnliches genutzt.
- ConfigMaps und Secrets: Werden verwendet, um die oben genannten Ressourcen mit Daten zu versorgen.
Dinge, die mit Vorsicht verwendet werden
- StatefulSet und PersistentVolumeClaim werden zwar genutzt, wichtige Daten werden aber bevorzugt in verwalteten Diensten außerhalb von Kubernetes gespeichert.
- RBAC wird möglichst vermieden, da es zusätzliche Komplexität einführt.
Dinge, die aktiv vermieden werden
- YAML von Hand schreiben: Stattdessen werden TypeScript und Pulumi verwendet, um Definitionen für Kubernetes-Ressourcen zu erzeugen.
- Nicht standardisierte Ressourcen und Operatoren: Sie ermöglichen Drittanbieter-Software zwar die Nutzung der Kubernetes-Infrastruktur, sind in der Praxis aber schwer handhabbar.
- Helm: Wird wegen Operatoren und YAML-Konventionen nicht verwendet.
- Alles, was „mesh“ im Namen trägt: Wird als unnötig angesehen.
- Ingress-Ressourcen: Werden vermieden, um keine unnötige zusätzliche Indirektion einzuführen.
- Den kompletten k8s-Stack lokal nachzubauen: Stattdessen werden mit Docker Compose oder eigenen Skripten nur die tatsächlich benötigten Teile des Systems gestartet.
Menschen sollten nicht auf Pods warten müssen
- Kubernetes wurde mit Fokus auf Robustheit und Modularität statt auf Container-Startzeiten entworfen und eignet sich daher nicht für Fälle, in denen Menschen auf den Start eines Pods warten.
- Jamsocket verwendet Plane, einen Rust-Orchestrator unter MIT-Lizenz, um Prozesse für interaktive Workloads schnell zu planen und auszuführen.
Abstraktionen auf höherer Ebene
- Einige Alternativen zu Kubernetes sind sehr gut, besonders dann, wenn die Infrastruktur nicht als Code beschrieben werden muss.
- Statt Kubernetes kann man sich auch für andere Lösungen entscheiden, etwa Dienste wie Railway, Render oder Flight Control.
- Wenn man den eigenen Umgang mit Kubernetes systematisch steuert, kann niemand sagen, es sei zu früh dafür.
Meinung von GN⁺
- Kubernetes ist trotz seiner Stärke bei der Verwaltung von Komplexität und Automatisierung, besonders in großen Systemen, für kleinere Projekte oder Startups wegen dieser Komplexität durchaus belastend.
- Dieser Artikel zeigt Wege auf, übermäßige Komplexität beim Einsatz von Kubernetes zu vermeiden, und hilft so auch Einsteigerinnen, Einsteigern und kleinen Teams, die Vorteile von Kubernetes zu nutzen.
- Vor dem Einsatz von Kubernetes sollte man sorgfältig abwägen, welche Funktionen tatsächlich benötigt werden und welche technischen Fähigkeiten das Team mitbringt, um Nutzen, Verwaltungsaufwand und Kosten gegeneinander abzuwägen.
- Statt Kubernetes kann es besser sein, einfachere und leichter zu verwaltende Dienste zu verwenden. Beispiele sind Docker Swarm, Apache Mesos und Nomad, die jeweils eigene Vor- und Nachteile haben.
- Bei der Einführung von Kubernetes sollten die Integration in die bestehende Infrastruktur, Sicherheit, Verwaltungskosten und die Lernkurve berücksichtigt werden.
- Zu den Vorteilen von Kubernetes zählen Skalierbarkeit, hohe Verfügbarkeit und eine konsistente Deployment-Erfahrung über verschiedene Cloud-Umgebungen hinweg. Dafür ist jedoch ein Verständnis von Ressourcenmanagement und Orchestrierung erforderlich.
1 Kommentare
Hacker-News-Kommentare
Zusammenfassung des ersten Kommentars:
stateless) App-Server waren kein großes Wartungsproblem, aber durch die Evangelisierung von Microservices wurden Probleme geschaffen, die zuvor nicht existierten.Zusammenfassung des zweiten Kommentars:
kubectl explain Xsei deutlich besser als die AWS-Dokumentation.Zusammenfassung des dritten Kommentars:
Zusammenfassung des vierten Kommentars:
Zusammenfassung des fünften Kommentars:
Zusammenfassung des sechsten Kommentars:
Zusammenfassung des siebten Kommentars:
Zusammenfassung des achten Kommentars:
Zusammenfassung des neunten Kommentars:
Zusammenfassung des zehnten Kommentars:
kustomizezu verwenden, um die Konfiguration klar und eindeutig zu halten.