Ein Hinweis unserer Redaktion zu den Übersetzungen: Der vorgestellte Artikel beschreibt das geschlossene Produkt eines bestimmten Unternehmens, und leider gibt es keine Hinweise darauf, dass jemals eine Eröffnung geplant ist - im Sinne von Stallman. Dennoch erschien es uns sehr wichtig und nützlich zu überlegen, wie Menschen im Allgemeinen mit Istio-Debug-Problemen umgehen und wie sie ihre Arbeit in diesem Bereich optimieren. Vielleicht kann jemand ein paar interessante Ideen für sich zeichnen.Irgendwann bei der Entwicklung von Produktionssystemen auf Basis der Microservice-Architektur kamen wir zu dem Schluss, dass die Überwachung jedes einzelnen Elements unseres Service nicht ausreicht, um ernsthafte Probleme zu bewältigen. Im Laufe der Zeit muss gleichzeitig ein vollständiges Bild des gesamten Aufrufstapels in der gesamten Anwendung mit detaillierten Informationen zur Anforderungstopologie, zu Netzwerkverzögerungen und zur Dauer einzelner Befehle erstellt werden. Um dieses Problem zu lösen, greifen Ingenieure normalerweise auf verteilte Ablaufverfolgung zurück.
In diesem Beitrag wird das Konzept der verteilten Ablaufverfolgung anhand des Prismas der Microservice-Architektur untersucht: Wie alles über
Istio integriert und automatisiert wird. Anschließend wird der gesamte Prozess über
Backyards - unser Serviceprodukt für Istio - vereinfacht und verarbeitet.
Eintrag
Zuvor haben
wir darüber geschrieben, wie kompliziert es sein kann, Istio nur zu installieren und zu konfigurieren. Um diese Situation zu vereinfachen, haben wir uns für die
Open-Source-Entwicklung von Banzai Cloud Istio entschieden . Zusätzlich zu Istio können Sie mit Helm (
Prometheus ,
Grafana ,
Jaeger ,
Kiali ) eine Reihe praktischer Tools verwenden. In jedem Fall kamen die
meisten Support- / Integrationsanfragen von ihnen. Da wir der Meinung sind, dass
jeder ein Tool nach seinen Wünschen auswählt , haben wir die aufgelisteten Tools in Istio nicht starr implementiert, sondern nur die Möglichkeit bereitgestellt, diese Komponenten einfach zu integrieren.
Darüber hinaus wollten wir unseren Benutzern ein weiteres leistungsstarkes Tool zum Verwalten der aufgelisteten Komponenten im Cluster (dh etwas anderes als Istio) zur Verfügung stellen. Deshalb haben wir auch Hinterhöfe erstellt. Mit ihm können Sie Prometheus, Grafana und Jaeger einfach installieren. Im Gegensatz zu Kiali ist Backyards nicht nur eine webbasierte Überwachungsschnittstelle, sondern ein voll funktionsfähiges multifunktionales Tool zur Verwaltung Ihres Servicenetzwerks. Es ist mit einem oder mehreren Clustern gleichzeitig kompatibel und enthält eine leistungsstarke CLI- und GraphQL-API.
In diesem Beitrag konzentrieren wir uns auf verteiltes Tracing und Jaeger.
Einführung in die verteilte Ablaufverfolgung
In der Architektur von Mikrodiensten ist es oft schwierig, Probleme zu finden und zu debuggen, wenn sich mehrere Dienste gleichzeitig anrufen. Tatsächlich liegt in dieser Aussage der Hauptgrund, warum die Effizienz von Dienstanforderungen gering ist: Welcher Dienst ist zu einem Engpass geworden, wie groß ist die Netzwerkverzögerung zwischen Anforderungen?
Dank der verteilten Ablaufverfolgung können Sie den gesamten Anrufbaum visualisieren, sehen, welcher Dienst auf welchen Dienst zugegriffen hat, wie lange jeder Anruf dauert und wie lange die Beantwortung verzögert wird. Mithilfe der verteilten Ablaufverfolgung können Sie feststellen, wo der Fehler aufgetreten ist und welcher Dienst keine Antwortzeit hat.
Bei der verteilten Ablaufverfolgung werden einzelne Anforderungen über den gesamten Aufrufstapel innerhalb des Systems verfolgt.

Ohne verteilte Ablaufverfolgung können Sie sich bei den vielen zwischen Microservices ausgetauschten Anrufen leicht verlieren. Es ist auch schwierig, Probleme ohne sie zu debuggen, da Sie sich nur auf Protokolle verlassen müssen. Dank der verteilten Ablaufverfolgung steht Ihnen jedoch der gesamte Aufrufstapel mit allen zur Diagnose des Problems erforderlichen Informationen zur Verfügung.
Unter der Haube einer verteilten Spur
Span ist die kleinste Einheit in einer verteilten Spur. Sie hat die Bezeichnungen "Start" und "Dauer". Span haben Eltern-Kind-Beziehungen zueinander und bilden zusammen Trace.
Es gibt drei Aufgaben, um Spuren korrekt zu sammeln
1. Incoming request spans 2. Outgoing request spans 3. Context propagation
Eingehende Anfragen umfassen:
Wenn eine Anforderung bei einem Dienst eintrifft, muss sie auf einen Trace-Header überprüft werden. Wenn kein Header vorhanden ist, muss ein Stammbereich (übergeordneter Bereich) erstellt werden, um die Ablaufverfolgung zu starten. Wenn ja, erstellen Sie einen untergeordneten Bereich, um die Ablaufverfolgung fortzusetzen.
Ausgehende Anforderungsbereiche:
Wenn eine Anforderung von einem Dienst an einen anderen gesendet wird, wird zuerst eine Spanne erstellt, sodass die Partei, die die Anforderung empfängt, weiterhin wie oben beschrieben nachverfolgt.
Kontextverbreitung:
Dienste empfangen und senden normalerweise mehrere Anforderungen gleichzeitig. Ohne Änderungen ist es unmöglich, die Verbindung zwischen eingehenden und ausgehenden Anforderungen zu verfolgen. Hier kommt die schönste Stunde, um den Kontext zu vermitteln. Bei HTTP können Sie dazu die Trace-Header eingehender Anrufe an ausgehende Anrufe aus der Anwendung übergeben, um eine vollständige Ablaufverfolgung zu erstellen.
Zusätzlich zu diesen Aufgaben sollten Spuren gesammelt, gruppiert und perfekt visualisiert werden.
All dies mag kompliziert genug erscheinen, um auf allen Diensten im System implementiert zu werden, aber es gibt Tools, mit denen Sie fast alle im automatischen Modus beschriebenen Aufgaben lösen können. Infolgedessen können Entwickler die verteilte Ablaufverfolgung sofort einsatzbereit erhalten.
Für weitere Informationen zu den Grundprinzipien der verteilten Ablaufverfolgung würde ich empfehlen, diesen großartigen Beitrag von Nike zu lesen.Verteilte Rückverfolgung in Istio
In Istio erledigen Envoy-Proxys die Drecksarbeit der
verteilten Ablaufverfolgung . Istio verfügt über eine Sidecar-Injektion, dank derer alle eingehenden und ausgehenden Anforderungen an / vom Dienst zuerst über den Envoy-Proxyserver geleitet werden. In diesem Stadium werden die Eltern- und Tochterspuren generiert. Dies sind die ersten beiden der drei erforderlichen Bedingungen zum Erstellen einer verteilten Spur.
Die dritte Bedingung - die Übertragung des Kontexts - muss durch eine Änderung der Anwendungslogik durchgeführt werden. In
Istio Bookinfo ist dies bereits auf der Ebene jedes Microservices implementiert, sodass vollständige Traces sofort nach der Installation abgerufen werden können. Wenn Sie die verteilte Ablaufverfolgung in Ihren eigenen Diensten verwenden, müssen Sie die
Kontextverbreitung selbst implementieren.
Im Gegensatz zu einigen verbreiteten Missverständnissen ist anzumerken, dass die vollständige Unterstützung der verteilten Ablaufverfolgung mit
Kontextausbreitung selbst auf der Ebene eines regulären Dienstnetzes nur durch Ändern der Logik der Anwendung erstellt werden kann. Ein gutes Beispiel finden Sie in
Vorbehalt 1 .
Auf der Istio-Website finden Sie
Dokumentationen zu den zu verwendenden Headern. Alle sind mit
dem Zipkin-Header-Format kompatibel.
Bitte beachten Sie, dass Istio zusätzlich zu der oben beschriebenen Envoy- basierten Ablaufverfolgung auch eine Mixer-basierte Ablaufverfolgung hat , die die Mixer-Komponente aktiver nutzt. Es ist wahrscheinlich, dass Mixer in zukünftigen Versionen nicht mehr angeboten wird, daher werde ich die Arbeit damit nicht im Detail beschreiben. Man muss nur sagen, dass die Mischer-Telemetrie durch den Bediener zu spüren ist.
Mit Envoy und der Verteilung der benötigten Trace-Header können wir die benötigten Traces abrufen. Um diese Informationen zu sammeln und zu visualisieren, wird Istio mit Tools wie
Jaeger ,
Zipkin ,
Lightstep und
Datadog geliefert . Standardmäßig wird Jaeger verwendet, es ist auch das beliebteste Tool aller aufgelisteten Tools.
Wir können auch die Abtastrate anpassen, dh wie viel Prozent aller Anfragen in Form von Traces dargestellt werden. Der Standardwert beträgt 1% der Gesamtzahl der Anforderungen. Die Frequenz kann hier in
diesem Feld des Istio-Operators geändert werden.
Wie es in Istio funktioniert
Lassen Sie uns zusammenfassen, wie verteiltes Tracing mit Jaeger durchgeführt wird (später vergleichen wir dies mit demselben Prozess in Backyards):
- Zusammen mit Istio erhalten Sie Jaeger mit allen erforderlichen Services und Bereitstellungen.
- Die Adresse des Trace-Dienstes wird standardmäßig durch die Konfiguration der Envoy-Proxys festgelegt, und über diese funktionieren Span-Berichte und Sidecar-Dienste.
- Bookinfo kann installiert werden, bevor alle Dienste ihre Kopfzeilen an Traces verteilen.
- Spuren werden verfügbar, sobald genügend Informationen gesammelt wurden.
- Das Jaeger-Bedienfeld kann umgeleitet werden, um den Benutzerteil über einen Browser zu öffnen.
Verteilte Spur in Hinterhöfen
In Backyards können Sie Jaeger installieren, konfigurieren, eine Demo-Anwendung mit automatisch verteilten Trace-Headern installieren und Lasten an all dies senden - alles wird mit einem einfachen Befehl erledigt! Und nachdem die Dienste mit den Tracks miteinander verknüpft wurden, wird dies alles über die Benutzeroberfläche verfügbar.
Jetzt schau!
Erstellen Sie einen ClusterFür den Anfang brauchen wir einen Cluster in Kubernetes. Ich habe den Kubernetes-Cluster auf GKE durch die kostenlose Version von Pipeline für Entwickler erhöht. Wenn Sie dasselbe tun möchten, erstellen Sie Ihren Cluster über Pipeline bei einem der fünf von uns unterstützten Cloud-Anbieter. Andernfalls erhöhen Sie Ihren Kubernetes-Cluster an einer anderen Stelle.
Wie es bei Backyards funktioniertZuvor haben wir das Zwischenergebnis zusammengefasst, dass Jaeger in Verbindung mit Istio verwendet werden kann. Vergleichen wir nun, wie alles in Backyards passiert.
Der einfachste Weg, Istio, Backyards und die Demo-Anwendung in einem neuen Cluster zu installieren, ist die Verwendung
der Backyards-Befehlszeilenschnittstelle .
Sie müssen nur einen Befehl eingeben (in Ihrem Cluster sollte sein
KUBECONFIG):
$backyards install –a –run-demo
- Mit diesem Befehl wird Jaeger automatisch installiert (anstelle unseres Open-Source-Istio-Operators und der Backyards-Komponenten).
- Wie bereits erwähnt, ist Istio sofort einsatzbereit und kann in andere Komponenten wie Prometheus, Grafana oder Jaeger integriert werden. Bei der Installation von Jaeger wird die Serviceadresse im Benutzerfenster des Bedieners festgelegt. In Zukunft wird diese Adresse an jeder Stelle geschrieben, an der sie zur Steuerung der Istio-Komponenten und des Datenflusses benötigt wird.
- Die Demo-Anwendung ist ebenfalls standardmäßig installiert. Es werden Golang-Dienste verwendet, die bereits für die Verteilung der erforderlichen Trace-Header konfiguriert sind.
- Das automatische Laden der Demo-Anwendung beginnt (daher das Flag --run-demo ), sodass Sie sofort mit dem Verfolgen von Tracks beginnen können.
- Jaeger wird über das Eingabe-Gateway geöffnet, ist mit der Benutzeroberfläche verknüpft und automatisch sowohl in Form eines Schemas als auch als Liste verfügbar.
Es ist buchstäblich so einfach wie das Schreiben eines Teams, um einen neuen Kubernetes-Cluster zu erstellen. Probieren Sie es aus, wenn Sie möchten!
Folgendes werden Sie sehen:Jaeger im Zusammenhang mit dem Schema:

Und hier ist eine Liste:

Jaeger UI für Demo-Anwendung:


In der Benutzeroberfläche können Sie den gesamten Aufrufstapel in Ihrem Microservice-System sehen. Jetzt können Sie genau verfolgen, wann die Stammanforderung gestartet wurde und wie lange jede Anforderung gedauert hat. Sie können beispielsweise feststellen, dass der Analysedienst die meiste Zeit bestimmte Abfragen durchgeführt hat, da er mit tatsächlichen Berechnungen beschäftigt ist (z. B. berechnet er die Werte von Pi).
ReinigungUm die Demo-Anwendung Backyards und Istio aus Ihrem Cluster zu entfernen, benötigen Sie nur ein Team. Sie kümmert sich darum, alle Komponenten in der richtigen Reihenfolge zu entfernen:
$ backyards uninstall -a
Zusammenfassung
Die verteilte Ablaufverfolgung ist hauptsächlich für vorhandene verteilte Systeme erforderlich, in denen Schwierigkeiten oder Probleme behoben werden müssen. Unser Betreiber, Istio, konzentriert sich ausschließlich auf das Management, da Backyards viel mehr Komponenten enthält, die für die Arbeit verwendet werden können. Dies ist beispielsweise Jaeger, das sofort die Möglichkeit bietet, eine verteilte Ablaufverfolgung durchzuführen.
In diesem Fall wird Jaeger über Backyards installiert, und letzterer zeigt alle Links und Spuren von Jaeger im System direkt in der Benutzeroberfläche an!
Hab eine schöne Spur!