Wie überwachen Sie Node Micro-Dienste, die in Docker-Containern ausgeführt werden?

7

Dieser Artikel über " Wie gesund ist Ihre Dockerized-Anwendung?" erklärt die Probleme bei der Überwachung, bietet jedoch keine guten Beispiele für die tatsächliche Überwachung eines Mikrodienstes im Docker-Container.

Wir verwenden derzeit PM2-Monit, um unsere Microservices zu überwachen. Wenn wir sie jedoch in Docker-Containern ablegen, verlieren wir die Möglichkeit, auf diese Daten innerhalb eines Bildschirms für alle verschiedenen Microservices zuzugreifen, die jeweils in einem eigenen Docker-Container ausgeführt werden.

Die Dockerswarm-Überwachung zeigt den Status der Container an, nicht jedoch den darin ausgeführten Microservice.

Was ist eine solide bewährte Methode zur Lösung dieses Problems?

avi
quelle

Antworten:

4

Dies ist ein Bereich, in dem Kubernetes das richtige Modell hat. Es sollte einen Load Balancer zwischen allen Systemen geben, für die Funktionszustandsprüfungen durchgeführt werden sollten.

Sobald Sie Nagios, Zabbix oder andere Arten der Überwachung zum System hinzufügen, beginnen Sie mit dem Aufbau einer großen Zustandsmaschine. Dies wird das lose Kopplungsmodell aufbrechen und Abhängigkeiten einführen, die das einfache Refactoring verhindern. Obwohl nicht in Stein gemeißelt, ist die Hauptunterscheidung zwischen Mikrodiensten und anderen Varianten von SOA diese lose Kopplung.

Wenn die Dienste detailliert sind und eine einzelne Funktion ausführen, implementieren Sie eine Integritätsprüfung bei einem vorgelagerten Load Balancer und überwachen Sie dann die aktiven Poolmitglieder.

Als Beispiel in HAproxy

backend myapp
[...]
option tcp-check
tcp-check send GET\ /health HTTP/1.0\r\n
tcp-check send Host:\ foo\r\n
tcp-check send \r\n
tcp-check expect rstring ^HTTP/1.1\ 200\ Ok
tcp-check expect string container\ Good
server srv1 10.0.0.1:8080 check
server srv2 10.0.0.2:8080 check

Theoretisch interessiert Sie die Leistung eines tatsächlichen Containers nicht, nur dass Ihre Gesamtleistung gut ist.

Diese Methode erleichtert die Selbstreparatur des Systems und die Skalierung mit minimalem Komplexitätsaufwand.

Grundsätzlich müssen Sie nur überprüfen, ob die Anzahl der Systeme, die Sie erwarten, aktiv ist, und wenn nicht, drehen Sie noch mehr. Wenn Sie Kapazität hinzufügen müssen, ändern Sie einfach die Anzahl der erwarteten Knoten.

Dies vereinfacht auch das Refactoring, da Sie diesen Test nur ohne externe Abhängigkeiten oder Zustandsmaschine replizieren oder ändern müssen.

Es sollte auch die Ausfallzeit und die Pagerduty-Warnungen mitten in der Nacht reduzieren, wenn sich das System selbst repariert.

Was die Gesamtsystemmetriken betrifft, die benötigt werden, um Probleme wie die Latenz aufzuspüren, möchte ich sie mit einem Tool wie elasticsearch an einem zentralen Ort haben. Wenn Sie Syslog, Logstash oder Log4 verwenden? um Metriken zu sammeln, die auf lange Sicht weitaus nützlicher sind. Wenn Systeme klein und einfach sind, bietet die herkömmliche abfragebasierte Überwachung möglicherweise genügend Metriken. Es ist jedoch vorzuziehen, sie in einem Format zu haben, das durchsuchbar und vor allem relational zu anderen Systemen ist.

Lösungen wie monit haben immer noch ihren Platz, aber es geht darum, die langlebigen Komponenten wie die VMs oder das Bare-Metal-System, in dem sich Ihr Schwarm befindet, zu überwachen. Die Container selbst sollten jedoch von diesem System entkoppelt werden, um die größten Vorteile eines Micro-Services-Modells zu erzielen.

gdahlm
quelle
Warum interessiert mich die Leistung eines bestimmten Containers nicht? Ist das nicht der einfachste Weg, um herauszufinden, wo der Engpass liegt, und um zu wissen, wann er skaliert werden muss?
Avi
Sie können die Leistung des Container-Hosts verfolgen, was dasselbe ist. Aber es ist wirklich eine Frage, ob Sie dem Microservices-Modell folgen möchten oder nicht. Während es nicht die einzige Möglichkeit ist, die Arbeit zu erledigen, ist die lose Kupplung einer der Hauptmieter des Modells
gdahlm
@gdahim Sorry, meine Frage war nicht klar. Ich frage, wie das Kopplung verursacht. Ich sehe den Nutzen des Gesundheitschecks, aber Ihre Antwort macht mir nicht klar, warum mir die Verwendung von CPU oder Mem im Container egal ist.
Avi
1
Es gibt mehrere Gründe, aber hier einige: 1) Agentenversionen und -konfigurationen müssen in der gesamten Umgebung synchronisiert werden, was koordinierte Anstrengungen erfordert. 2) Änderungen oder Umgestaltungen des internen Systems führen möglicherweise zu Warnungen oder Reduzierungen bei der Überwachung, was dazu führen kann, dass Änderungen koordiniert werden müssen. 3) Es erhöht die erforderlichen Dienste pro Container, für die Integrationstests oder Gates erforderlich sind. Denken Sie jedoch auch daran, dass ein Container ein Namespace und keine separate Entität ist. Wenn Sie den Container-Host überwachen, werden dieselben Zahlen erzeugt.
Gdahlm
4

Eine häufig verwendete Lösung (nicht container-spezifisch) besteht darin, eine Integritätsprüfungs-API in Ihrem Dienst zu erstellen, die alle zu überwachenden Funktionen (z. B. Verfügbarkeit von DBs und anderen Abhängigkeiten) und die App selbst testet und einige erwartete Ausgaben zurückgibt (z. B. <) Service>: <Status>). Sie können dann Warnungen von einem Überwachungsdienst wie Nagios auslösen, wenn diese API nicht für alle Dienste ein OK zurückgibt. Dies schlägt auch fehl, wenn der Microservice selbst fehlerhaft ist.

Dieser Ansatz bietet auch den Vorteil, dass ein Funktionstest Ihres Dienstes ausgeführt wird (indem ein API-Endpunkt erreicht wird).

Dieser Ansatz deckt jedoch einige Randfälle nicht ab - z. Der Microservice wird ausgeführt (bestimmte APIs schlagen jedoch fehl).

Grumpyops
quelle