Wie PrioritĂ€ten von Pods in Kubernetes zu AusfĂ€llen bei Grafana Labs fĂŒhrten

Hinweis.: Hiermit prĂ€sentieren wir Ihnen technische Details zu den Ursachen des jĂŒngsten Ausfalls des Cloud-Dienstes, der von den Entwicklern von Grafana betrieben wird. Dies ist ein klassisches Beispiel dafĂŒr, wie eine neue, scheinbar Ă€ußerst nĂŒtzliche Funktion, die die QualitĂ€t der Infrastruktur verbessern soll
 schĂ€dlich sein kann, wenn man nicht die zahlreichen Nuancen ihrer Anwendung in der Produktionsumgebung berĂŒcksichtigt. Es ist großartig, wenn solche Materialien veröffentlicht werden, die es ermöglichen, nicht nur aus eigenen Fehlern zu lernen. Die Details finden Sie in der Übersetzung dieses Textes des Produkt-VizeprĂ€sidenten von Grafana Labs.

Wie die PrioritĂ€ten von Pods in Kubernetes zu Ausfallzeiten bei Grafana Labs fĂŒhrten

Am Freitag, den 19. Juli, funktionierte der Hosted Prometheus-Dienst in Grafana Cloud fĂŒr etwa 30 Minuten nicht. Ich entschuldige mich bei all unseren Kunden, die durch diesen Ausfall betroffen waren. Unsere Aufgabe ist es, die notwendigen Überwachungstools bereitzustellen, und wir verstehen, dass ihre UnzugĂ€nglichkeit Ihnen das Leben erschwert. Wir nehmen diesen Vorfall sehr ernst. In diesem Hinweis erklĂ€ren wir, was passiert ist, wie wir darauf reagiert haben und was wir unternehmen, um sicherzustellen, dass sich so etwas nicht wiederholt.

Hintergrund

Der Grafana Cloud Hosted Prometheus Service basiert auf Cortex — einem CNCF-Projekt zur Schaffung eines horizontal skalierbaren, hochverfĂŒgbaren und multi-tenant (mehrmandantenfĂ€higen) Prometheus-Services. Die Architektur von Cortex besteht aus einer Reihe von separaten Microservices, die jeweils eine bestimmte Funktion erfĂŒllen: Replikation, Speicherung, Abfragen usw. Cortex wird aktiv weiterentwickelt, mit stĂ€ndig neuen Funktionen und Leistungssteigerungen. Wir implementieren regelmĂ€ĂŸig neue Versionen von Cortex in die Cluster, damit unsere Kunden von diesen Möglichkeiten profitieren können — zumal Cortex in der Lage ist, ohne Ausfallzeiten zu aktualisieren.

FĂŒr unterbrechungsfreie Updates benötigt der Ingester-Service von Cortex wĂ€hrend des Aktualisierungsprozesses eine zusĂ€tzliche Ingester-Replik. (Hinweis.: Ingester — ein grundlegender Bestandteil von Cortex. Seine Aufgabe besteht darin, einen kontinuierlichen Strom von Samples zu sammeln, sie in Prometheus-Chunks zu gruppieren und in Datenbanken wie DynamoDB, BigTable oder Cassandra zu speichern. Dies ermöglicht es den alten Ingester, aktuelle Daten an neue Ingester zu ĂŒbertragen. Es ist erwĂ€hnenswert, dass Ingester ressourcenintensiv sind. FĂŒr ihren Betrieb werden 4 Kerne und 15 GB RAM pro Pod benötigt, was 25 % der CPU-Leistung und des Speichers der zugrunde liegenden Maschine bei unseren Kubernetes-Clustern entspricht. In der Regel haben wir jedoch viel mehr ungenutzte Ressourcen im Cluster als die benötigten 4 Kerne und 15 GB RAM, sodass wir diese zusĂ€tzlichen Ingester wĂ€hrend der Updates problemlos starten können.

Es kommt jedoch hĂ€ufig vor, dass wĂ€hrend des normalen Betriebs auf keiner der Maschinen diese 25 % ungenutzten Ressourcen verfĂŒgbar sind. Und wir streben das auch nicht an: CPU und RAM sind immer fĂŒr andere Prozesse nĂŒtzlich. Um dieses Problem zu lösen, haben wir uns entschieden, Kubernetes Pod Priorities. Die Idee besteht darin, den Ingester einen höheren PrioritĂ€tswert zuzuweisen als anderen (stateless) Mikrodiensten. Wenn wir einen zusĂ€tzlichen (N+1) Ingester starten mĂŒssen, drĂ€ngen wir vorĂŒbergehend andere, kleinere Pods zurĂŒck. Diese Pods werden auf freie Ressourcen auf anderen Maschinen verschoben, wodurch ausreichend Platz fĂŒr den Start des zusĂ€tzlichen Ingester entsteht.

Am Donnerstag, dem 18. Juli, haben wir in unseren Clustern vier neue PrioritĂ€tsstufen eingefĂŒhrt: kritisch, hoch, mittel und niedrig. Diese wurden etwa eine Woche in einem internen Cluster ohne Kundenverkehr getestet. StandardmĂ€ĂŸig erhielten Pods ohne festgelegte PrioritĂ€t mittel PrioritĂ€t, wĂ€hrend fĂŒr Ingester eine Klasse mit hoher PrioritĂ€t eingestellt. Kritisch fĂŒr Monitoring-Dienste (Prometheus, Alertmanager, node-exporter, kube-state-metrics usw.) reserviert war. Unsere Konfiguration ist öffentlich und der PR kann eingesehen werden. hier.

Ausfall

Am Freitag, dem 19. Juli, hat einer der Ingenieure ein neues dediziertes Cortex-Cluster fĂŒr einen Großkunden gestartet. Die Konfiguration fĂŒr dieses Cluster enthielt keine neuen Pods-PrioritĂ€ten, sodass allen neuen Pods die StandardprioritĂ€t zugewiesen wurde — mittel.

Im Kubernetes-Cluster fehlten die Ressourcen fĂŒr das neue Cortex-Cluster, und das bestehende Produktions-Cortex-Cluster wurde nicht aktualisiert (Ingester hatten keinen hohen PrioritĂ€t). Da die Ingester des neuen Clusters standardmĂ€ĂŸig mittel PrioritĂ€t hatten und die bestehenden Pods im Produktionsumfeld ĂŒberhaupt keine PrioritĂ€t hatten, verdrĂ€ngten die Ingester des neuen Clusters die Ingester aus dem bestehenden Produktions-Cortex-Cluster.

Das ReplicaSet fĂŒr den verdrĂ€ngten Ingester im Produktions-Cluster hat den verdrĂ€ngten Pod erkannt und einen neuen erstellt, um die vorgegebene Anzahl an Kopien aufrechtzuerhalten. Dem neuen Pod wurde standardmĂ€ĂŸig mittel eine PrioritĂ€t zugewiesen, wodurch der Ă€ltere Ingester im Produktions-Cluster ĂŒber Ressourcen entzogen wurde. Das Ergebnis war ein lawinenartiger Prozess, der dazu fĂŒhrte, dass alle Pods mit Ingester fĂŒr die Produktionscluster von Cortex verdrĂ€ngt wurden.

Ingester sind zustandsbehaftet und speichern Daten fĂŒr die letzten 12 Stunden. Dies ermöglicht eine effizientere Komprimierung, bevor sie in einen langfristigen Speicher geschrieben werden. Zu diesem Zweck fĂŒhrt Cortex eine Daten-Sharding nach Serien durch und verwendet eine verteilte Hash-Tabelle (Distributed Hash Table, DHT) zur Replikation jeder Serie auf drei Ingester mit quorum-basierter Konsistenz im Dynamo-Stil. Cortex schreibt keine Daten in Ingester, die deaktiviert sind. Wenn also eine große Anzahl von Ingester die DHT verlĂ€sst, kann Cortex keine ausreichende Replikation der Aufzeichnungen gewĂ€hrleisten, und diese „fallen aus“.

Erkennung und Behebung

Neue Prometheus-Benachrichtigungen basierend auf dem „Fehlerbudget“ (error-budget-based — weitere Informationen werden in einem zukĂŒnftigen Artikel veröffentlicht) Ă€ußerten sich alarmiert nach vier Minuten seit Beginn der Ausfallzeit. In den nĂ€chsten etwa fĂŒnf Minuten fĂŒhrten wir Diagnostics durch und erweiterten den darunter liegenden Kubernetes-Cluster, um sowohl neue als auch bestehende Produktionscluster zu hosten.

FĂŒnf Minuten spĂ€ter haben die alten Ingester erfolgreich ihre Daten aufgezeichnet, wĂ€hrend die neuen gestartet wurden und die Cortex-Cluster wieder verfĂŒgbar waren.

Weitere zehn Minuten benötigten wir fĂŒr die Diagnose und Behebung von Out-of-Memory (OOM)-Fehlern bei den Authentifizierungs-Proxy-Servern vor Cortex. Die OOM-Fehler wurden durch einen zehnfachen Anstieg des QPS verursacht (wie wir annehmen, aufgrund von ĂŒbermĂ€ĂŸig aggressiven Anfragen von den Prometheus-Client-Servern).

Folgen

Die Gesamtdauer des Ausfalls betrug 26 Minuten. Es gingen keine Daten verloren. Die Ingester haben erfolgreich alle in-memory-Daten in langfristigen Speicher ĂŒbertrĂ€gt. WĂ€hrend des Ausfalls haben die Prometheus-Server der Clients entfernte (remote) Aufzeichnungen mit Hilfe von der neuen API remote_write basierend auf WAL (geschrieben von Callum Styan von Grafana Labs) und haben fehlgeschlagene Aufzeichnungen nach dem Ausfall wiederholt.

Wie die PrioritĂ€ten von Pods in Kubernetes zu Ausfallzeiten bei Grafana Labs fĂŒhrten
Schreiboperationen des Produktionsclusters

Fazit

Es ist wichtig, aus diesem Vorfall zu lernen und die notwendigen Maßnahmen zu ergreifen, um eine Wiederholung zu vermeiden.

RĂŒckblickend sollten wir anerkennen, dass wir standardmĂ€ĂŸig keinen mittel PrioritĂ€t setzen sollten, bis alle Ingester in der Produktion hoch diese PrioritĂ€t erhalten haben. Außerdem hĂ€tte im Vorfeld auf ihre hohe PrioritĂ€t geachtet werden mĂŒssen. Jetzt ist alles behoben. Wir hoffen, dass unsere Erfahrungen anderen Organisationen helfen, die die Verwendung von Pod-PrioritĂ€ten in Kubernetes in Betracht ziehen.

Wir werden eine zusĂ€tzliche Kontrollstufe fĂŒr die Bereitstellung aller zusĂ€tzlichen Objekte hinzufĂŒgen, deren Konfigurationen global fĂŒr den Cluster sind. ZukĂŒnftig werden solche Änderungen vongrĂ¶ĂŸtenmehr Personen bewertet. Außerdem wurde die Modifikation, die zu dem Ausfall fĂŒhrte, als zu geringfĂŒgig fĂŒr ein separates Projektdokument betrachtet – sie wurde nur im GitHub-Issue diskutiert. Ab sofort werden alle solchen KonfigurationsĂ€nderungen mit entsprechender Projektdokumentation begleitet.

Schließlich automatisieren wir die Skalierung des Authentifizierungs-Proxy-Servers, um OOM-Probleme bei Überlastungen zu verhindern, die wir erlebt haben, und analysieren die standardmĂ€ĂŸigen Prometheus-Einstellungen im Zusammenhang mit Rollbacks und Skalierung, um zukĂŒnftig Ă€hnliche Probleme zu vermeiden.

Der erlebte Ausfall hatte auch einige positive Konsequenzen: Nachdem wir die benötigten Ressourcen erhalten hatten, konnte Cortex automatisch wiederhergestellt werden, ohne dass zusĂ€tzliches Eingreifen erforderlich war. Zudem haben wir wertvolle Erfahrungen mit Grafana Loki — unserem neuen Log-Aggregationssystem — das uns half sicherzustellen, dass alle Ingester wĂ€hrend und nach dem Ausfall ordnungsgemĂ€ĂŸ funktionierten.

P.S. vom Übersetzer

Lesen Sie auch in unserem Blog:

Quelle: habr.com

Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server đŸ”„ Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster