Suche
Moderne Anwendungsverfolgung im Container

Alles im Blick: Tracing von Anwendungen auf Kubernetes mit AWS X-Ray

Christoph Kassen

© Shutterstock / Phonlamai Photo

Tracing ist für DevOps- und Entwickler-Teams ein wichtiger Faktor zur Informationsgewinnung, wenn es um den Zustand und die Analyse von Anwendungen geht. Probleme können so schnell erkannt und gelöst, Fehler behoben werden. Für das Tracing aller Anwendungen, die auf AWS laufen, gibt es das Tool AWS X-Ray, egal ob sie auf Amazon ECS, AWS Lambda oder einem Kubernetes Cluster gehostet sind. Im folgenden Artikel erklärt Christoph Kassen, AWS Solutions Architect, wie man AWS X-Ray in Verbindung mit Kubernetes einsetzen und betreiben kann.

Mit dem Aufkommen von Microservices-Architekturen hat die Anzahl der Services, die Teil einer Webanwendung sind, stark zugenommen. Es ist nicht mehr ungewöhnlich, hunderte von separaten Microservices zu bauen und zu betreiben, die alle Teil derselben Anwendung sind.

Ein Beispiel dafür ist die typische E-Commerce-Anwendung. Sie zeigt Produkte an, empfiehlt verwandte Artikel, bietet Such- und Filterfunktionen und verwaltet einen Warenkorb. Hinter den Kulissen sind viele weitere Services wie Clickstream-Tracking, Anzeigenanzeige, Targeting und Logging involviert. Bei der Bearbeitung einer einzelnen Benutzeranfrage sind viele dieser Mikrodienste an der Beantwortung beteiligt. Das Verstehen, Analysieren und Debuggen solcher Systeme wird immer komplexer.

AWS X-Ray

AWS X-Ray bietet Application-Tracing-Funktionen, mit denen tiefe Einblicke in alle eingesetzten Microservices möglich sind. So kann mit X-Ray eine Anfrage verfolgt werden, während sie durch die beteiligten Mikrodienste fließt. Dadurch können DevOps-Teams verstehen, wie Services miteinander interagieren. Probleme lassen sich schneller analysieren und auch das Debugging wird beschleunigt.

Bei Microservices-Architekturen sollte jeder Service in sich geschlossen sein und die für das Problem am besten geeigneten Technologien verwenden. Je nachdem, wie der Service aufgebaut ist, wird er unterschiedlich eingesetzt und gehostet.

Eine der beliebtesten Optionen für die Verpackung und den Einsatz von Mikroservices sind derzeit Container. Die Anwendung und ihre Abhängigkeiten sind klar definiert, der Container kann auf einer CI-Infrastruktur aufgebaut werden und das Deployment wird stark vereinfacht. Container Scheduler wie Kubernetes und Amazon Elastic Container Service (Amazon ECS) vereinfachen dabei die Bereitstellung und den Betrieb von Containern in großem Umfang.

DevOpsCon Whitepaper 2018

Free: BRAND NEW DevOps Whitepaper 2018

Learn about Containers,Continuous Delivery, DevOps Culture, Cloud Platforms & Security with articles by experts like Michiel Rook, Christoph Engelbert, Scott Sanders and many more.

AWS X-Ray auf Kubernetes laufen lassen

Kubernetes ist eine Open-Source-Container-Management-Plattform, die die Bereitstellung, Skalierung und Verwaltung von Anwendungen in Containern automatisiert.

Dieser Beitrag zeigt Ihnen, wie Sie X-Ray auf Kubernetes laufen lassen können, um den auf einem Kubernetes Cluster gehosteten Diensten Anwendungs-Tracing-Funktionen zur Verfügung zu stellen. Darüber hinaus funktioniert X-Ray auch für Anwendungen, die auf Amazon ECS, AWS Elastic Beanstalk und Amazon EC2 gehostet werden und sogar beim Bau von Services mit AWS Lambda-Funktionen. Diese Flexibilität hilft Anwendern, die Technologie auszuwählen, die sie benötigen. Dabei können sie zugleich Anfragen über alle in ihrer AWS-Umgebung laufenden Dienste verfolgen.

Der komplette Code, inklusive einer Node.js-basierten Demo-Anwendung, ist im entsprechenden GitHub Repository (aws-xray-kubernetes) verfügbar.

Die Beispielanwendung im Repository besteht aus zwei einfachen Microservices: Service-A und Service-B. Das folgende Ablaufdiagramm zeigt, wie jeder Dienst mit zwei Pods auf dem Kubernetes Cluster bereitgestellt wird:

  1. Anfragen werden vom Kunden an den Service-A gesendet.
  2. Service-A kontaktiert dann Service-B.
  3. Die Anfragen werden von Service-B bearbeitet.
  4. Service-B fügt jeder Anfrage eine zufällige Verzögerung hinzu, um unterschiedliche Antwortzeiten in X-Ray anzuzeigen.

Um die Beispielanwendungen auf Ihrem eigenen Kubernetes Cluster zu testen, verwenden Sie die im GitHub Repository bereitgestellten Dockerfiles. Anschließend erstellen Sie die beiden Container, schieben diese in eine Container-Registry und wenden die Yaml-Konfiguration mit kubectl auf Ihren Kubernetes Cluster an.

Voraussetzungen

Wenn Sie derzeit keinen Cluster in Ihrer AWS-Umgebung haben, werfen Sie einen Blick auf Amazon Elastic Container Service for Kubernetes (Amazon EKS), um einen vollständig verwalteten Kubernetes-Cluster zu erstellen.

Sicherheitseinstellungen für X-Ray

Die Knoten im Kubernetes Cluster Hosting Web Application Pods benötigen IAM-Berechtigungen, damit die Pods, die den X-Ray Daemon hosten, Traces an das X-Ray Service Backend senden können.

Am einfachsten ist es, eine neue IAM-Richtlinie einzurichten, die es allen Worker-Knoten innerhalb Ihres Kubernetes Clusters erlaubt, Daten auf X-Ray zu schreiben. Erstellen Sie in der IAM-Konsole oder AWS CLI eine neue Richtlinie wie die folgende:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "xray:PutTraceSegments",
                "xray:PutTelemetryRecords"
            ],
            "Resource": [
                "arn:aws:iam::000000000000:instance-profile/nodes.k8s.cluster.local "
            ]
        }
    ]
}

Passen Sie die AWS-Konto-ID innerhalb der Ressource an und geben Sie der Richtlinie einen beschreibenden Namen, zum Beispiel k8s-nodes-XrayWriteAccess.

Als nächstes fügen Sie die Richtlinie dem Instanzprofil für die Kubernetes-Arbeitsknoten hinzu. Wählen Sie daher die IAM-Rolle, die Ihren Worker-Instanzen zugewiesen ist – überprüfen Sie die EC2-Konsole, wenn Sie unsicher sind. Anschließend hängen Sie die zuvor erstellte IAM-Richtlinie an die Worker-Instanz an. Sie können die IAM-Berechtigungen direkt von der Kommandozeile aus mit dem folgenden Befehl anhängen:

aws iam attach-role-policy --role-name k8s-nodes --policy-arn 
arn:aws:iam::000000000000:policy/k8s-nodes-XrayWriteAccess

Erstellen des X-Ray Daemon Docker Images

Der X-Ray Daemon ist als einzelne, statisch kompilierte Binärdatei verfügbar, die direkt von der AWS-Website heruntergeladen werden kann.

Der erste Schritt besteht darin, einen Docker-Container zu erstellen, der das X-Ray Daemon Binary enthält und den Port 2000 per UDP freigibt. Der Daemon wird entweder über Kommandozeilenparameter oder eine Konfigurationsdatei konfiguriert. Die wichtigste Option ist, den Listen-Port auf die richtige IP-Adresse einzustellen, damit Tracing-Anfragen von Anwendungs-Pods akzeptiert werden können.

Um Ihr eigenes Docker Image mit dem X-Ray Daemon zu erstellen, verwenden Sie das unten gezeigte Dockerfile.

# Use Amazon Linux Version 1
FROM amazonlinux:1

# Download latest 2.x release of X-Ray daemon
RUN yum install -y unzip && \
    cd /tmp/ && \
    curl https://s3.dualstack.us-east-2.amazonaws.com/aws-xray-assets.us-east-2/xray-daemon/aws-xray-daemon-linux-2.x.zip > aws-xray-daemon-linux-2.x.zip && \
    unzip aws-xray-daemon-linux-2.x.zip && \
    cp xray /usr/bin/xray && \
    rm aws-xray-daemon-linux-2.x.zip && \
    rm cfg.yaml

# Expose port 2000 on udp
EXPOSE 2000/udp

ENTRYPOINT ["/usr/bin/xray"]

# No cmd line parameters, use default configuration
CMD [''] 

Dieses Container-Image basiert auf Amazon Linux, was zu einem kleinen Container-Image führt. Um das Container-Image zu erstellen und zu taggen, führen Sie docker build -t xray:latest aus.

Ein Amazon ECR-Repository erstellen

Erstellen Sie ein Repository in der Amazon Elastic Container Registry (Amazon ECR), um Ihr X-Ray Docker Image zu speichern. Ihr Kubernetes Cluster verwendet dieses Repository, um das Image während des Deployments der X-Ray Pods abzurufen.

Verwenden Sie den folgenden CLI-Befehl, um Ihr Repository oder alternativ die AWS Management Console zu erstellen:

aws ecr create-repository --repository-name xray-daemon

Das erzeugt ein Repository namens xray-daemon und zeigt den Repository URI, der beim pushen des Docker Images verwendet wird.

Nachdem der Container-Build abgeschlossen ist, schieben Sie ihn mit dem folgenden Push-Befehlen in das zuvor erstellte ECR Repository.

docker tag xray-daemon:latest 000000000000.dkr.ecr.eu-west-1.amazonaws.com/xray-daemon:latest
docker push 000000000000.dkr.ecr.eu-west-1.amazonaws.com/xray-daemon:latest

Das resultierende Repository sollte ähnlich wie im folgenden Screenshot aussehen.

Sie können diese Prozesse mit AWS CodeBuild und AWS CodePipeline automatisieren. Eine Anleitung, wie Docker-Container erstellt und automatisch in ein ECR Repository geschoben werden können, finden Sie unter Docker Sample for AWS CodeBuild.

Den X-Ray-Daemon für Kubernetes bereitstellen

Stellen Sie sicher, dass Sie das kubectl-Tool richtig konfigurieren, damit Ihr Cluster den X-Ray Pod auf Ihrem Kubernetes Cluster einsetzen kann. Nachdem die X-Ray Pods in Ihrem Kubernetes Cluster installiert sind, können Anwendungen Tracing-Informationen an den X-Ray Daemon auf Ihrem Host senden. Der größte Vorteil ist, dass Sie X-Ray nicht als Sidecar-Container neben Ihrer Anwendung laufen lassen müssen. Das vereinfacht die Konfiguration und Bereitstellung Ihrer Anwendungen und spart insgesamt Ressourcen auf Ihrem Cluster.

Um den X-Ray Daemon als Pods auf Ihrem Kubernetes Cluster zu installieren, führen Sie Folgendes aus dem geklonten GitHub Repository aus:

kubectl apply -f xray-k8s-daemonset.yaml


Auf jedem Kubernetes-Worker-Knoten wird ein X-Ray Pod deployt, der die Tracing-Daten von Ihren Microservices entgegennimmt und an einen den X-Ray Service weiterleitet. Beim Deployment des Containers über ein DaemonSet wird der X-Ray Port direkt auf dem Host exposed. Auf diese Weise können sich Clients direkt mit dem Daemon auf Ihrem Knoten verbinden, wodurch unnötiger Netzwerkverkehr über Ihren Cluster vermieden wird.

Verbindung zum X-Ray Daemon herstellen

Um Application Tracing in Ihre Anwendungen zu integrieren, verwenden Sie das X-Ray SDK für eine der unterstützten Programmiersprachen:

  • Java
  • Knoten.js
  • .NET (Framework und Core)
  • Go
  • Python

Die SDKs stellen Klassen und Methoden zur Verfügung, um Trace-Daten zu erzeugen und an den X-Ray Daemon zu senden. Trace-Daten umfassen Informationen über eingehende HTTP-Anfragen, die von der Anwendung bedient werden, und Aufrufe, die die Anwendung über das AWS SDK oder HTTP Clients an nachgelagerte Dienste durchführt.

Standardmäßig erwartet das X-Ray SDK, dass der Daemon am 127.0.0.0.1:2000 verfügbar ist. Das muss in diesem Setup geändert werden, da der Daemon nicht Teil jedes Pod ist, sondern in seinem eigenen Pod gehostet wird.

Das eingesetzte X-Ray DaemonSet stellt alle Pods über die Kubernetes-Diensterkennung zur Verfügung, so dass Anwendungen diesen Endpunkt nutzen können, um den X-Ray Daemon zu finden. Wenn das Deployment in den „default“-Namensraum erfolgt, ist der Endpunkt:

xray-service.default

Anwendungen müssen nun die Daemon-Adresse entweder mit der Umgebungsvariablen AWS_XRAY_DAEMON_ADDRESS – das ist die beste Variante – oder direkt im SDK-Setup-Code setzen:

AWSXRay.setDaemonAddress('xray-service.default:2000');

Um die Umgebungsvariable einzurichten, fügen Sie die folgenden Informationen in die Beschreibung der YAML Ihrer Kubernetes-Anwendung ein. Dadurch wird die Adresse des X-Ray-Services über eine Umgebungsvariable definiert, die automatisch vom SDK übernommen wird.

env:
- name: AWS_XRAY_DAEMON_ADDRESS 
  value: xray-service.default

Senden von Tracing-Informationen an AWS X-Ray

Mit den X-Ray SDKs ist das Versenden von Tracing-Informationen aus Ihrer Anwendung problemlos möglich. Der folgende Beispielcode dient als Ausgangspunkt, um Ihre Anwendung mit Traces auszustatten. Schauen Sie sich auch die beiden Beispielanwendungen im GitHub Repository an, um zu sehen, wie Sie Traces von Service A nach Service B senden können.

Da Ihre Anwendung innerhalb von Containern läuft, aktivieren Sie sowohl das EC2Plugin als auch das ECSPlugin, die Ihnen Informationen über den Kubernetes-Knoten, der den Pod hostet, sowie den Containernamen liefern. Das ECSPlugin, ursprünglich für Amazon ECS gedacht, gibt Ihnen zusätzliche Informationen über Ihren Container, auch wenn Sie Ihre Anwendung auf Kubernetes ausführen.

var app = express();

//...

var AWSXRay = require('aws-xray-sdk');
AWSXRay.config([XRay.plugins.EC2Plugin, XRay.plugins.ECSPlugin]);

app.use(AWSXRay.express.openSegment('defaultName')); //erforderlich am Anfang des Requests

app.get('/', Funktion (req, res) {
  res.render('index');
});

app.use(AWSXRay.express.closeSegment()); //erforderlich am Ende des Requests / in der Fehlerbehandlung

Weitere Informationen über alle Optionen und Möglichkeiten, Ihren Anwendungscode zu instrumentieren, finden Sie auf der X-Ray-Dokumentationsseite für die entsprechenden SDK-Informationen.

Das folgende Bild zeigt die resultierende Service Map, die Einblicke in den Fluss der Anfragen durch die Microservices-Landschaft gibt. Sie können hier einzelne Traces aufschlüsseln und sehen, welchen Pfad jeder Request genommen hat.

Von der Service Map aus können Sie in einzelne Requests aufschlüsseln und sehen, woher sie stammen und wie viel Zeit jeweils für die Bearbeitung aufgewendet wurde.

Sie können sich auch Details zu jedem einzelnen Segment des Traces anzeigen lassen, indem Sie darauf klicken. Hier werden weitere Details angezeigt.

Auf der Registerkarte Ressourcen sehen Sie den Kubernetes od, der vom ECSPlugin, das die Anfrage bearbeitet hat, aufgenommen wurde, sowie die Instanz, auf der Pod lief.

Zusammenfassung

Sie haben gesehen, wie sich X-Ray auf einem bestehenden Kubernetes Cluster einsetzen und betreiben lässt. Die Nutzung von Tracing liefert tiefe Einblicke in Ihre Anwendungen, erleichtert damit die Analyse und ermöglicht es, Probleme frühzeitig zu erkennen. Mit AWS X-Ray bekommen Sie diese Erkenntnisse für alle Anwendungen, die auf AWS laufen, egal ob sie auf Amazon ECS, AWS Lambda oder einem Kubernetes Cluster gehostet werden.

Geschrieben von
Christoph Kassen

AWS Solutions Architect

Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu: