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

Anmerkung des Übersetzers.: Wir prĂ€sentieren Ihnen technische Einzelheiten zu den GrĂŒnden fĂŒr den kĂŒrzlichen Ausfall des Cloud-Dienstes, der von den Entwicklern von Grafana betrieben wird. Dies ist ein klassisches Beispiel dafĂŒr, wie eine neue und scheinbar ĂŒberaus nĂŒtzliche Funktion, die darauf abzielt, die QualitĂ€t der Infrastruktur zu verbessern 
 schĂ€dlich sein kann, wenn nicht die zahlreichen Nuancen ihrer Anwendung in einem Produktionsumfeld berĂŒcksichtigt werden. Es ist bemerkenswert, wenn solche Materialien auftauchen, die es ermöglichen, nicht nur aus eigenen Fehlern zu lernen. Weitere Einzelheiten finden Sie in der Übersetzung dieses Textes von dem Produkt-VizeprĂ€sidenten aus Grafana Labs.

Anm. d. Übers.: Wir prĂ€sentieren Ihnen technische Einzelheiten zu den GrĂŒnden fĂŒr den jĂŒngsten Ausfall des Cloud-Service, der von den Schöpfern von Grafana bereitgestellt wird.

Am Freitag, dem 19. Juli, hörte der Hosted Prometheus-Dienst in Grafana Cloud etwa 30 Minuten lang auf zu funktionieren. Ich entschuldige mich bei allen Kunden, die von der Störung betroffen sind. Unsere Aufgabe ist es, die notwendigen Werkzeuge fĂŒr das Monitoring bereitzustellen, und wir verstehen, dass ihre NichtverfĂŒgbarkeit Ihr Leben erschwert. Wir nehmen diesen Vorfall sehr ernst. In diesem Hinweis wird erlĂ€utert, was passiert ist, wie wir darauf reagiert haben und was wir tun, um sicherzustellen, dass so etwas nicht noch einmal vorkommt.

Vorgeschichte

Der Service Grafana Cloud Hosted Prometheus basiert auf Cortex — einem CNCF-Projekt zur Erstellung eines horizontal skalierbaren, hochverfĂŒgbaren, multi-tenant (multitenanten) Prometheus-Dienstes. Die Architektur von Cortex besteht aus einer Reihe separater Mikrodienste, von denen jeder eine eigene Funktion erfĂŒllt: Replikation, Speicherung, Abfragen usw. Cortex wird aktiv weiterentwickelt, es gibt stĂ€ndig neue Funktionen und die Leistung wird verbessert. Wir fĂŒhren regelmĂ€ĂŸig neue Versionen von Cortex in den Clustern ein, damit die Kunden von diesen Möglichkeiten profitieren können – glĂŒcklicherweise kann Cortex ohne Ausfallzeiten aktualisiert werden.

FĂŒr unterbrechungsfreie Aktualisierungen benötigt der Ingester-Dienst von Cortex wĂ€hrend des Aktualisierungsprozesses eine zusĂ€tzliche Ingester-Replik. (Anmerkung des Übersetzers.: Ingester — die grundlegende Komponente von Cortex. Seine Aufgabe ist es, einen kontinuierlichen Datenstrom von Samples zu sammeln, sie in Chunk-Typen von Prometheus zu gruppieren und sie in Datenbanken wie DynamoDB, BigTable oder Cassandra zu speichern.) Dies ermöglicht es den alten Ingester, aktuelle Daten an neue Ingester weiterzuleiten. Es sollte beachtet werden, dass Ingester ressourcenintensiv sind. FĂŒr ihren Betrieb sind 4 Kerne und 15 GB RAM pro Pod erforderlich, d.h. 25 % der Prozessorleistung und des Speichers der Basismaschine in unseren Kubernetes-Clustern. Im Allgemeinen haben wir normalerweise viel mehr ungenutzte Ressourcen im Cluster als 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 vorhanden sind. Wir streben das auch nicht an: CPU und Speicher sind immer fĂŒr andere Prozesse von Nutzen. Um dieses Problem zu lösen, haben wir uns entschieden, Kubernetes Pod PrioritĂ€teneinzusetzen. Die Idee besteht darin, Ingester einen höheren PrioritĂ€tswert zuzuweisen als anderen (statuslosen) Mikrodiensten. Wenn wir einen zusĂ€tzlichen (N+1) Ingester starten mĂŒssen, verdrĂ€ngen wir vorĂŒbergehend andere, kleinere Pods. Diese Pods werden auf andere Maschinen mit verfĂŒgbaren Ressourcen verschoben, um genĂŒgend „Raum“ fĂŒr den Start des zusĂ€tzlichen Ingester zu lassen.

Am Donnerstag, den 18. Juli, haben wir vier neue PrioritĂ€tsstufen in unseren Clustern bereitgestellt: kritisch, hoch, mittel und niedrig. Sie wurden eine Woche lang in unserem internen Cluster ohne Kundentransaktionen getestet. StandardmĂ€ĂŸig erhielten Pods ohne festgelegte PrioritĂ€t mittel eine PrioritĂ€t, wĂ€hrend fĂŒr Ingester eine Klasse mit hoher PrioritĂ€t festgelegt wurde. Kritisch wurde fĂŒr das Monitoring (Prometheus, Alertmanager, Node-Exporter, Kube-State-Metrics usw.) reserviert. Unsere Konfiguration ist öffentlich, und der PR kann angesehen werden. hier.

Ausfall

Am Freitag, den 19. Juli, startete einer der Ingenieure einen neuen dedizierten Cortex-Cluster fĂŒr einen großen Kunden. Die Konfiguration fĂŒr diesen Cluster beinhaltete die neuen Pod-PrioritĂ€ten nicht, sodass allen neuen Pods die StandardprioritĂ€t zugewiesen wurde — mittel.

Im Kubernetes-Cluster standen nicht genĂŒgend Ressourcen fĂŒr den neuen Cortex-Cluster zur VerfĂŒgung, und der bestehende Produktionscluster Cortex wurde nicht aktualisiert (die Ingester hatten keinen hohen PrioritĂ€tswert). Da die Ingester des neuen Clusters standardmĂ€ĂŸig die mittel PrioritĂ€t hatten, wĂ€hrend die bestehenden Pods in der Produktion ĂŒberhaupt keine PrioritĂ€t hatten, verdrĂ€ngten die Ingester des neuen Clusters die Ingester aus dem bestehenden Produktionscluster Cortex.

ReplicaSet fĂŒr den verdrĂ€ngten Ingester im Produktions-Cluster hat den verdrĂ€ngten Pod erkannt und einen neuen zur Aufrechterhaltung der gewĂŒnschten Anzahl von Kopien erstellt. Dem neuen Pod wurde standardmĂ€ĂŸig mittel eine PrioritĂ€t zugewiesen, und ein weiterer "alter" Ingester im Produktions-Cluster verlor Ressourcen. Das Ergebnis war ein lawinenartiger Prozess, der zur VerdrĂ€ngung aller Pods mit Ingester fĂŒr die Produktions-Cluster von Cortex fĂŒhrte.

Ingester sind zustandsbehaftet und speichern Daten der letzten 12 Stunden. Dies ermöglicht uns, sie effizienter zu komprimieren, bevor sie in den Langzeit-Speicher geschrieben werden. Zu diesem Zweck fĂŒhrt Cortex eine Shard-Verteilung der Daten nach Serien durch, indem eine verteilte Hashtabelle (Distributed Hash Table, DHT) verwendet wird und repliziert jede Serie auf drei Ingester mithilfe von quorum-basierten Konsens im Dynamo-Stil. Cortex schreibt keine Daten in Ingester, die abgeschaltet werden. Somit kann Cortex, wenn eine große Anzahl von Ingester die DHT verlĂ€sst, keine ausreichende Replikation der EintrĂ€ge sicherstellen, und diese "fallen".

Erkennung und Behebung

Neue Prometheus-Benachrichtigungen auf Basis des "Fehlerbudgets" (error-budget-based — Details werden in einem zukĂŒnftigen Artikel erscheinen) wurden nach 4 Minuten nach Beginn der Abschaltung laut. In den folgenden etwa fĂŒnf Minuten fĂŒhrten wir Diagnosen durch und erweiterten den darunterliegenden Kubernetes-Cluster, um sowohl neue als auch bestehende Produktions-Cluster unterzubringen.

Weitere fĂŒnf Minuten spĂ€ter haben die alten Ingester erfolgreich ihre Daten geschrieben und die neuen wurden gestartet, und die Cortex-Cluster waren wieder verfĂŒgbar.

Weitere 10 Minuten gingen fĂŒr die Diagnose und Behebung von Out-of-Memory (OOM) Fehlern von den vor Cortex stehenden Authentifizierungs-Proxy-Servern verloren. Die OOM-Fehler wurden durch einen zehnfachen Anstieg der QPS verursacht (wie wir vermuten, aufgrund ĂŒbermĂ€ĂŸig aggressiver Anfragen von den Prometheus-Client-Servern).

Folgen

Die Gesamtdauer des Ausfalls betrug 26 Minuten. Daten gingen nicht verloren. Ingester haben alle In-Memory-Daten erfolgreich in den Langzeit-Speicher geladen. WÀhrend der Abschaltung haben die Prometheus-Server der Clients entfernte (remote) EintrÀge mit dem neuen API remote_write basierend auf WAL (geschrieben von Callum Styan von Grafana Labs) gepuffert und wiederholten fehlgeschlagene EintrÀge nach dem Ausfall.

Anm. d. Übers.: Wir prĂ€sentieren Ihnen technische Einzelheiten zu den GrĂŒnden fĂŒr den jĂŒngsten Ausfall des Cloud-Service, der von den Schöpfern von Grafana bereitgestellt wird.
Operationsaufzeichnungen des Produktions-Clusters

Das DBMS Tarantool ist ein attraktives, zukunftstrÀchtiges Produkt zur Erstellung von hochbelasteten Anwendungen.

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

Wenn man zurĂŒckblickt, sollte man zugeben, dass es nicht sinnvoll war, standardmĂ€ĂŸig PrioritĂ€ten zu vergeben, solange nicht alle Ingester in der Produktion diese erhalten hatten. mittel PrioritĂ€t. Außerdem hĂ€tte man sich im Voraus um ihren hoch hohen PrioritĂ€t kĂŒmmern sollen. Jetzt ist alles behoben. Wir hoffen, dass unsere Erfahrungen anderen Organisationen helfen, die den Einsatz von Pod-PrioritĂ€ten in Kubernetes in Betracht ziehen. Wir werden eine zusĂ€tzliche Kontrolle ĂŒber das Deployment aller zusĂ€tzlichen Objekte einfĂŒhren, deren Konfiguration global fĂŒr den Cluster ist. ZukĂŒnftig werden solche Änderungen von

vielen Menschen bewertet werden. DarĂŒber hinaus wurde die Modifikation, die zu dem Ausfall fĂŒhrte, als zu unwesentlich fĂŒr ein separates Projekt-Dokument angesehen — sie wurde nur in einem GitHub-Issue diskutiert. Ab diesem Moment werden alle Ă€hnlichen Änderungen der Konfigurationsdateien von der entsprechenden Projektdokumentation begleitet.oSchließlich automatisieren wir die GrĂ¶ĂŸenĂ€nderung des Authentifizierungs-Reverse-Proxys, um OOM bei Überlastung zu verhindern, was wir erlebt haben, und analysieren die Standard-Prometheus-Parameter, die mit Rollbacks und Skalierungen zusammenhĂ€ngen, um in Zukunft Ă€hnliche Probleme zu vermeiden.

Der erlebte Ausfall hatte auch einige positive Folgen: Nachdem die notwendigen Ressourcen bereitgestellt wurden, erholte sich Cortex automatisch ohne zusĂ€tzliche Eingriffe. Außerdem haben wir wertvolle Erfahrungen im Umgang mit

Grafana Loki — unserem neuen Log-Aggregationssystem — das sichergestellt hat, dass alle Ingester sich wĂ€hrend und nach dem Ausfall ordnungsgemĂ€ĂŸ verhalten haben. Autoskalierung und Ressourcenmanagement in Kubernetes (Überblick und Video-PrĂ€sentation)

P.S. vom Übersetzer

Lesen Sie auch in unserem Blog:

Quelle: habr.com

60GB SSD 8Gb DDR4