Istio und Kubernetes in Produktion. Teil 2. Rückverfolgung

    Im letzten Artikel haben wir uns die grundlegenden Komponenten des Service Mesh Istio angesehen, das System kennengelernt und die Hauptfragen beantwortet, die sich zu Beginn der Arbeit mit Istio normalerweise stellen. In diesem Abschnitt wird beschrieben, wie die Erfassung von Ablaufverfolgungsinformationen über das Netzwerk organisiert wird.



    Das erste, was viele Entwickler und Systemadministratoren zu hören bekommen, wenn sie die Worte "Service Mesh" hören, ist das Aufspüren. In der Tat fügen wir jedem Knoten des Netzwerks, durch den der gesamte TCP-Datenverkehr geleitet wird, einen speziellen Proxy-Server hinzu. Es scheint, dass Sie jetzt leicht Informationen über alle Netzwerkinteraktionen im Netzwerk senden können. In der Realität gibt es leider viele Nuancen, die berücksichtigt werden müssen. Lass uns sie anschauen.

    Irrtum Nummer eins: Wir können kostenlose Daten über Reisen im Netzwerk erhalten


    In der Tat, relativ frei, können wir nur die Knoten unseres Systems durch Pfeile miteinander verbinden und die Datenrate, die zwischen den Diensten übertragen wird (tatsächlich nur die Anzahl der Bytes pro Zeiteinheit). In den meisten Fällen kommunizieren unsere Dienste jedoch über ein Protokoll auf Anwendungsebene wie HTTP, gRPC, Redis usw. Natürlich möchten wir die Ablaufverfolgungsinformationen in diesen Protokollen sehen, wir möchten die Rate der Anforderungen und nicht die Datenrate sehen. Wir möchten die Latenz von Anforderungen für unser Protokoll verstehen. Schließlich möchten wir den vollständigen Pfad anzeigen, den die Anforderung von der Anmeldung in unserem System übergibt, bis der Benutzer eine Antwort erhält. Diese Aufgabe ist nicht so einfach.

    Lassen Sie uns zunächst einen Blick darauf werfen, wie das Senden der Verfolgungsspanne in Istio aus architektonischer Sicht aussieht. Wie wir uns aus dem ersten Teil erinnern, verfügt Istio über eine separate Komponente zum Sammeln der Telemetrie, die als Mixer bezeichnet wird. In der aktuellen Version 1.0. * Wird jedoch direkt von Proxy-Servern gesendet, und zwar von Envoy-Proxy. Envoy-Proxy unterstützt das Versenden von Ablaufverfolgungsintervallen per zipkin-Protokoll. Andere Protokolle können nur über das Plugin verbunden werden. Mit Istio erhalten wir sofort einen kompilierten und konfigurierten Envoy-Proxy, der nur das zipkin-Protokoll unterstützt. Wenn wir zum Beispiel das Jaeger-Protokoll verwenden und die Ablaufverfolgung über UDP senden möchten, müssen wir unser Istio-Proxy-Image sammeln. Benutzerdefinierte Plugins für istio-proxy werden unterstützt, es befindet sich jedoch noch in der Alpha-Version. Daher Wenn wir auf eine große Anzahl von benutzerdefinierten Einstellungen verzichten möchten, wird der Bereich der Technologien zum Speichern und Empfangen der Verfolgungsspanne reduziert. Von den Hauptsystemen können Sie jetzt Zipkin selbst oder Jaeger verwenden, aber alles über ein mit Zipkin kompatibles Protokoll senden (was viel weniger effizient ist). Das zipkin-Protokoll selbst beinhaltet das Senden aller Ablaufverfolgungsinformationen an die Sammler über das HTTP-Protokoll, was ziemlich teuer ist.

    Wie gesagt, Treysit wollen wir Protokolle der Anwendungsschicht. Dies bedeutet, dass Proxyserver, die sich neben jedem Dienst befinden, genau wissen müssen, welche Interaktion gerade stattfindet. Standardmäßig konfiguriert Istio den einfachen TCP-Typ für alle Ports. Dies bedeutet, dass keine Traces gesendet werden. Damit die Traces gesendet werden können, muss zunächst eine solche Option in der Hauptnetzkonfiguration aktiviert werden und, was sehr wichtig ist, alle Ports der Dienstinstanzen kubernetes gemäß dem im Dienst verwendeten Protokoll benannt werden. Das ist zum Beispiel so:

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
    spec:
      ports:
      - port: 80
        targetPort: 80
        name: http
      selector:
        app: nginx

    Sie können auch zusammengesetzte Namen verwenden, z. B. http-magic (Istio erkennt http und erkennt diesen Port als http-Endpunkt). Das Format ist Proto-Extra.

    Um nicht eine große Anzahl von Konfigurationen für die Definition eines Protokolls zu patchen, können Sie eine fehlerhafte Problemumgehung verwenden: Patchen Sie die Pilot-Komponente in dem Moment, in dem sie nur die Logik zur Definition des Protokolls ausführt . Daher ist es natürlich notwendig, diese Logik auf die Standardlogik zu ändern und auf die Konvention der Benennung aller Ports umzustellen.

    Um zu verstehen, ob das Protokoll richtig definiert ist, müssen Sie einen der Sidecar-Container mit envoy proxy aufrufen und eine Anfrage an den Admin-Port der envoy-Schnittstelle mit location / config_dump stellen. In der resultierenden Konfiguration müssen Sie das gewünschte Servicefeld betrachten. Sie wird in Istio als Bezeichner für die Zieladresse verwendet. Um den Wert dieses Parameters in Istio anzupassen (wir werden ihn dann in unserem Ablaufverfolgungssystem sehen), müssen Sie das serviceCluster-Flag beim Start des Sidecar-Containers angeben. Zum Beispiel ist es möglich , so die Variable zu berechnen , die von den nach unten API Kubernetes abgeleitet:

    --serviceCluster ${POD_NAMESPACE}.$(echo ${POD_NAME} | sed -e 's/-[a-z0-9]*-[a-z0-9]*$//g')

    Ein gutes Beispiel für das Verständnis , wie die Verfolgung in dem Gesandten, gibt es hier .

    Der Endpunkt selbst zum Senden von Ablaufverfolgungsbereichen muss auch in den Envoy-Proxy-Startflags angegeben werden. Beispiel: --zipkinAddress tracing-collector.tracing:9411

    Irrglaube Nummer zwei: Wir können kostengünstig die vollständigen Spuren der Weiterleitung von Anforderungen durch das System aus der Box bekommen


    Leider nicht. Die Komplexität der Implementierung hängt davon ab, wie Sie die Interaktion von Services bereits implementiert haben. Warum so?

    Tatsache ist, dass es für den isio-proxy nicht möglich ist, den gesamten Verkehr abzufangen, damit er die Entsprechung eingehender Anforderungen an den Dienst mit denjenigen versteht, die denselben Dienst verlassen. Sie benötigen eine Art Verbindungskennung. Der HTTP-Envoy-Proxy verwendet spezielle Header, nach denen der Envoy genau versteht, welche Anforderung an den Dienst bestimmte Anforderungen an andere Dienste generiert. Die Liste solcher Titel:

    • x-request-id,
    • x-b3-traceid,
    • x-b3-spanid
    • x-b3-parentspanid,
    • x-b3-abgetastet,
    • x-b3-Flaggen,
    • x-ot-span-Kontext.

    Wenn Sie einen einzigen Punkt haben, z. B. einen Basis-Client, in dem Sie eine solche Logik hinzufügen können, ist alles in Ordnung. Sie müssen nur auf die Aktualisierung dieser Bibliothek für alle Clients warten. Wenn Sie jedoch ein sehr heterogenes System haben und es keine Vereinheitlichung bei der Umstellung von Diensten auf Dienste über das Netzwerk gibt, ist dies höchstwahrscheinlich ein großes Problem. Ohne das Hinzufügen einer solchen Logik sind alle Verfolgungsinformationen nur "einstufig". Das heißt, wir erhalten alle Inter-Service-Interaktionen, aber sie werden nicht in einer einzigen Durchgangskette durch das Netzwerk geklebt.

    Fazit


    Istio bietet ein praktisches Werkzeug für das Erfassen von Informationen über das Netzwerk. Wir müssen jedoch verstehen, dass zur Implementierung des Systems eine Anpassung des Systems und die Besonderheiten der Istio-Implementierung erforderlich sind. Infolgedessen müssen zwei Hauptpunkte gelöst werden: Die Definition des Protokolls der Anwendungsschicht (das vom Envoy-Proxy unterstützt werden sollte) und das Einrichten von Weiterleitungsinformationen zum Zusammenhang der Anforderungen an den Dienst von Anforderungen des Dienstes (bei Verwendung des Headers im Fall des HTTP-Protokolls). Wenn diese Probleme gelöst sind, erhalten Sie ein leistungsfähiges Werkzeug, mit dem Sie Informationen aus dem Netzwerk auch in sehr heterogenen Systemen, die in vielen verschiedenen Sprachen und Frameworks geschrieben sind, transparent sammeln können.

    Im nächsten Artikel über Service Mesh werden wir eines der größten Probleme von Istio erörtern - einen hohen RAM-Verbrauch für jeden Sidecar-Proxy-Container und den Umgang damit.

    Jetzt auch beliebt: