Grüße, Habr!
Wir waren einst die Ersten, die das Thema auf dem russischen Markt eingeführt haben
Einführung
Kubernetes ist für die Verarbeitung zustandsloser Arbeitslasten konzipiert. Typischerweise werden solche Workloads in Form einer Microservice-Architektur dargestellt, sie sind leichtgewichtig, lassen sich gut horizontal skalieren, folgen den Prinzipien von 12-Faktor-Anwendungen und können mit Leistungsschaltern und Chaosaffen arbeiten.
Kafka hingegen fungiert im Wesentlichen als verteilte Datenbank. Daher muss man sich bei der Arbeit mit dem Status auseinandersetzen, und dieser ist viel schwerer als ein Microservice. Kubernetes unterstützt Stateful Loads, aber wie Kelsey Hightower in zwei Tweets betont, sollten sie mit Vorsicht behandelt werden:
Manche Leute sind der Meinung, dass Kubernetes zu einer vollständig verwalteten Datenbank wird, die mit RDS konkurriert, wenn man es in einen zustandsbehafteten Workload einfügt. Das ist nicht so. Wenn Sie hart genug arbeiten, zusätzliche Komponenten hinzufügen und ein Team von SRE-Ingenieuren gewinnen, können Sie möglicherweise RDS auf Kubernetes aufbauen.
Ich empfehle jedem immer, bei der Ausführung zustandsbehafteter Workloads auf Kubernetes äußerste Vorsicht walten zu lassen. Die meisten Leute, die fragen: „Kann ich zustandsbehaftete Workloads auf Kubernetes ausführen“, haben nicht genug Erfahrung mit Kubernetes und oft auch mit der Workload, nach der sie fragen.
Sollten Sie Kafka also auf Kubernetes ausführen? Gegenfrage: Funktioniert Kafka ohne Kubernetes besser? Deshalb möchte ich in diesem Artikel hervorheben, wie sich Kafka und Kubernetes ergänzen und welche Fallstricke eine Kombination mit sich bringen kann.
Zeitpunkt der Fertigstellung
Lassen Sie uns über das Grundlegende sprechen – die Laufzeitumgebung selbst
Prozess
Kafka-Broker sind CPU-freundlich. TLS kann zu einem gewissen Overhead führen. Kafka-Clients sind jedoch möglicherweise rechenintensiver, wenn sie Verschlüsselung verwenden. Dies hat jedoch keine Auswirkungen auf Broker.
Память
Kafka-Broker fressen Speicher auf. Die JVM-Heap-Größe ist normalerweise auf 4–5 GB begrenzt, Sie benötigen jedoch auch viel Systemspeicher, da Kafka den Seitencache sehr stark nutzt. Legen Sie in Kubernetes die Containerressourcen- und Anforderungslimits entsprechend fest.
Datenspeicherung
Die Datenspeicherung in Containern ist kurzlebig – beim Neustart gehen Daten verloren. Für Kafka-Daten können Sie ein Volume verwenden emptyDir
, und der Effekt wird ähnlich sein: Ihre Brokerdaten gehen nach Abschluss verloren. Ihre Nachrichten können weiterhin als Replikate auf anderen Brokern gespeichert werden. Daher muss der ausgefallene Broker nach einem Neustart zunächst alle Daten replizieren, was sehr viel Zeit in Anspruch nehmen kann.
Deshalb sollten Sie eine langfristige Datenspeicherung nutzen. Sei es eine nicht-lokale Langzeitspeicherung mit dem XFS-Dateisystem oder genauer gesagt ext4. Verwenden Sie kein NFS. Ich habe dich gewarnt. Die NFS-Versionen v3 oder v4 funktionieren nicht. Kurz gesagt: Der Kafka-Broker stürzt ab, wenn er das Datenverzeichnis aufgrund des Problems der „dummen Umbenennung“ in NFS nicht löschen kann. Falls ich Sie noch nicht überzeugt habe, ganz vorsichtig
Netzwerk
Wie bei den meisten verteilten Systemen hängt die Leistung von Kafka stark davon ab, die Netzwerklatenz auf ein Minimum und die Bandbreite auf ein Maximum zu beschränken. Versuchen Sie nicht, alle Broker auf demselben Knoten zu hosten, da dies die Verfügbarkeit verringert. Wenn ein Kubernetes-Knoten ausfällt, fällt der gesamte Kafka-Cluster aus. Verteilen Sie den Kafka-Cluster außerdem nicht über ganze Rechenzentren. Das Gleiche gilt für den Kubernetes-Cluster. Ein guter Kompromiss besteht in diesem Fall darin, verschiedene Verfügbarkeitszonen zu wählen.
Konfiguration
Regelmäßige Manifeste
Die Kubernetes-Website hat
- Unter: Ein Pod ist die kleinste bereitstellbare Einheit in Kubernetes. Ein Pod enthält Ihre Arbeitslast und der Pod selbst entspricht einem Prozess in Ihrem Cluster. Ein Pod enthält einen oder mehrere Container. Jeder ZooKeeper-Server im Ensemble und jeder Broker im Kafka-Cluster werden in einem separaten Pod ausgeführt.
- StatefulSet: Ein StatefulSet ist ein Kubernetes-Objekt, das mehrere zustandsbehaftete Workloads verarbeitet, und solche Workloads erfordern eine Koordination. StatefulSets bieten Garantien hinsichtlich der Reihenfolge von Pods und ihrer Einzigartigkeit.
- Headless-Dienste: Mit Diensten können Sie Pods mithilfe eines logischen Namens von Clients trennen. Kubernetes ist in diesem Fall für den Lastausgleich verantwortlich. Beim Betrieb zustandsbehafteter Workloads wie ZooKeeper und Kafka müssen Clients jedoch mit einer bestimmten Instanz kommunizieren. Hier bieten sich Headless-Dienste an: In diesem Fall hat der Client weiterhin einen logischen Namen, Sie müssen den Pod jedoch nicht direkt kontaktieren.
- Langzeitspeichervolumen: Diese Volumes werden benötigt, um den oben erwähnten nicht-lokalen persistenten Blockspeicher zu konfigurieren.
Auf
Helmkarten
Helm ist ein Paketmanager für Kubernetes, der mit Betriebssystempaketmanagern wie yum, apt, Homebrew oder Chocolatey verglichen werden kann. Es erleichtert die Installation vordefinierter Softwarepakete, die in Helm-Charts beschrieben sind. Ein gut ausgewähltes Helm-Diagramm erleichtert die schwierige Aufgabe, alle Parameter für die Verwendung von Kafka auf Kubernetes richtig zu konfigurieren. Es gibt mehrere Kafka-Diagramme: Das offizielle befindet sich
Betreiber
Da Helm gewisse Mängel aufweist, erfreut sich ein anderes Tool großer Beliebtheit: Kubernetes-Operatoren. Der Betreiber verpackt nicht nur Software für Kubernetes, sondern ermöglicht Ihnen auch die Bereitstellung und Verwaltung dieser Software.
die Liste
Leistung
Es ist wichtig, die Leistung durch ein Benchmarking Ihrer Kafka-Instanz zu testen. Solche Tests helfen Ihnen, potenzielle Engpässe zu erkennen, bevor Probleme auftreten. Glücklicherweise bietet Kafka bereits zwei Leistungstest-Tools: kafka-producer-perf-test.sh
и kafka-consumer-perf-test.sh
. Nutzen Sie diese aktiv. Als Referenz können Sie auf die in beschriebenen Ergebnisse verweisen
Geschäftstätigkeit
Überwachung
Transparenz im System ist sehr wichtig – sonst versteht man nicht, was darin passiert. Heute gibt es ein solides Toolkit, das eine metrikbasierte Überwachung im Cloud-native-Stil ermöglicht. Zwei beliebte Tools für diesen Zweck sind Prometheus und Grafana. Prometheus kann mit einem JMX-Exporter Metriken aus allen Java-Prozessen (Kafka, Zookeeper, Kafka Connect) sammeln – und das auf einfachste Weise. Wenn Sie cAdvisor-Metriken hinzufügen, können Sie besser verstehen, wie Ressourcen in Kubernetes verwendet werden.
Strimzi hat ein sehr praktisches Beispiel für ein Grafana-Dashboard für Kafka. Es visualisiert wichtige Kennzahlen, beispielsweise zu Sektoren, die nicht ausreichend repliziert werden oder offline sind. Da ist alles sehr klar. Ergänzt werden diese Kennzahlen durch Ressourcennutzungs- und Leistungsinformationen sowie Stabilitätsindikatoren. Sie erhalten also die grundlegende Kafka-Clusterüberwachung umsonst!
Source:
Es wäre schön, all dies durch Client-Überwachung (Metriken zu Verbrauchern und Produzenten) sowie Latenzüberwachung (dafür gibt es) zu ergänzen
Protokollierung
Die Protokollierung ist eine weitere wichtige Aufgabe. Stellen Sie sicher, dass alle Container in Ihrer Kafka-Installation angemeldet sind stdout
и stderr
und stellen Sie außerdem sicher, dass Ihr Kubernetes-Cluster alle Protokolle in einer zentralen Protokollierungsinfrastruktur zusammenfasst, z. B.
Funktionsprüfung
Kubernetes verwendet Liveness- und Bereitschaftstests, um zu überprüfen, ob Ihre Pods normal laufen. Wenn die Aktivitätsprüfung fehlschlägt, stoppt Kubernetes diesen Container und startet ihn dann automatisch neu, wenn die Neustartrichtlinie entsprechend festgelegt ist. Wenn die Bereitschaftsprüfung fehlschlägt, isoliert Kubernetes den Pod von der Bearbeitung von Anfragen. Somit ist in solchen Fällen überhaupt kein manueller Eingriff mehr erforderlich, was ein großes Plus ist.
Rollout von Updates
StatefulSets unterstützen automatische Updates: Wenn Sie die RollingUpdate-Strategie auswählen, wird jedes unter Kafka nacheinander aktualisiert. Auf diese Weise können Ausfallzeiten auf Null reduziert werden.
Skalierung
Die Skalierung eines Kafka-Clusters ist keine leichte Aufgabe. Kubernetes macht es jedoch sehr einfach, Pods auf eine bestimmte Anzahl von Replikaten zu skalieren, was bedeutet, dass Sie deklarativ so viele Kafka-Broker definieren können, wie Sie möchten. Am schwierigsten ist es in diesem Fall, die Sektoren nach der Vergrößerung bzw. vor der Verkleinerung neu zuzuordnen. Auch hier hilft Ihnen Kubernetes bei dieser Aufgabe.
Verwaltung
Aufgaben im Zusammenhang mit der Verwaltung Ihres Kafka-Clusters, wie das Erstellen von Themen und das Neuzuweisen von Sektoren, können mithilfe vorhandener Shell-Skripte erledigt werden, indem Sie die Befehlszeilenschnittstelle in Ihren Pods öffnen. Allerdings ist diese Lösung nicht sehr schön. Strimzi unterstützt die Verwaltung von Themen mit einem anderen Operator. Hier besteht durchaus Raum für Verbesserungen.
езервное копирование и восстановление
Nun hängt die Verfügbarkeit von Kafka auch von der Verfügbarkeit von Kubernetes ab. Wenn Ihr Kubernetes-Cluster ausfällt, fällt im schlimmsten Fall auch Ihr Kafka-Cluster aus. Nach Murphys Gesetz wird dies definitiv passieren und Sie werden Daten verlieren. Um diese Art von Risiko zu reduzieren, sollten Sie über ein gutes Backup-Konzept verfügen. Sie können MirrorMaker verwenden, eine andere Möglichkeit besteht darin, hierfür S3 zu verwenden, wie hier beschrieben
Abschluss
Bei der Arbeit mit kleinen bis mittelgroßen Kafka-Clustern lohnt sich der Einsatz von Kubernetes auf jeden Fall, da es zusätzliche Flexibilität bietet und das Bedienererlebnis vereinfacht. Wenn Sie sehr hohe nichtfunktionale Latenz- und/oder Durchsatzanforderungen haben, ist es möglicherweise besser, eine andere Bereitstellungsoption in Betracht zu ziehen.
Source: habr.com