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.
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).
quelle