README.md 9.08 KB
Newer Older
Nane Kratzke's avatar
UE1    
Nane Kratzke committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Lab 12: Tracing und Logging

In dem Ihnen zur Verfügung gestellten Cluster ist der sogeannte ELK-Stack (Elasticsearch + Kibana) vorbereitet. Genauer gesagt folgende Komponenten:

- [Elasticsearch](https://www.elastic.co/de/elasticsearch) Zeitreihendatenbank
- [FileBeat](https://www.elastic.co/de/beats/filebeat) Sammelt Logdaten des Kubernetes Clusters und laufender Pods und leitet diese an ES weiter.
- [APM](https://www.elastic.co/de/apm) Tracing und Monitoring Server
- [Kibana](https://www.elastic.co/de/kibana) Observability UI, um auf die so gesammelten Daten für Analysen zugreifen zu können.

Wir nutzen diesen Stack als Typrepräsentant, um das Tracing von verteilten Transaktionen in Service-Architekturen zu demonstrieren und die Möglichkeiten der Log-Konsolidierung zu veranschaulichen.

Der ELK-Stack hat den großen Vorteil, dass er aus einer Hand stammt ([Elastic](https://www.elastic.co)) und daher recht einfach und schnell mittels [Helm-Charts](https://github.com/elastic/helm-charts) in beliebigen Kubernetes Clustern installiert werden kann.

```Bash
# Nicht durch Sie in diesem Lab durchzuführen!!!

> helm repo add elastic https://helm.elastic.co
> helm install elasticsearch elastic/elasticsearch
> helm install kibana elastic/kibana
> helm install filebeat elastic/filebeat
> helm install apm-server elastic/apm-server
```

Für die oben genannten Komponenten gibt es jedoch auch eine Vielzahl alternativer Produkte wie bspw. [Prometheus](https://prometheus.io), [Fluentd](https://www.fluentd.org), [Jaeger](https://www.jaegertracing.io)/[Zipkin](https://zipkin.io) oder [Grafana](https://grafana.com). Auch Managed Monitoring Services wie bspw. [Datadog](https://www.datadoghq.com) erfreuen sich zunehmender Beliebtheit. Ferner bieten insbesondere die kommerziellen Hyperscaler wie [AWS](https://aws.amazon.com/de), [Azure](https://azure.microsoft.com/de-de), [Google Cloud](https://cloud.google.com), etc. entsprechende Monitoring Lösungen (auch zum Zwecke der Kundenbindung) an, die daher häufig eng und tief mit den entsprechenden Infrastrukturen integriert sind (dafür dann jedoch auch entsprechendes Vendor Lock-In Potenzial mitbringen).

Die in diesem Lab veranschaulichten Prinzipien lassen sich dennoch auf alle oben genannten Produkte übertragen. Welcher Produktstack letztlich in konkreten Projekten eingesetzt wird, hängt oft entscheidend davon ab, welche Monitoring-Produkte bereits in Unternehmen für andere Projekte eingesetzt werden. Meist vermeidet man es mehrere Monitoring-Stacks parallel zu fahren. Aus diesem Lab kann daher keine Empfehlung für eines der genannenten Produkte abgeleitet werden. Die Wahl des ELK-Stacks erfolgte aus rein pragmatischen Gründen im Kontext dieses Moduls.
Nane Kratzke's avatar
Nane Kratzke committed
27

Nane Kratzke's avatar
Nane Kratzke committed
28
## Inhaltsverzeichnis
Nane Kratzke's avatar
UE1    
Nane Kratzke committed
29
- [Lab 12: Tracing und Logging](#lab-12-tracing-und-logging)
Nane Kratzke's avatar
Nane Kratzke committed
30
31
32
33
  - [Inhaltsverzeichnis](#inhaltsverzeichnis)
  - [Vorbereitung](#vorbereitung)
  - [Übung 01: Instrumentieren von Microservices zum Zwecke des Tracings](#übung-01-instrumentieren-von-microservices-zum-zwecke-des-tracings)
  - [Übung 02: Propagieren von Traces zwischen Microservices](#übung-02-propagieren-von-traces-zwischen-microservices)
Nane Kratzke's avatar
UE1    
Nane Kratzke committed
34
35
36
37
  - [Übung 03: Konsolidiertes Logging](#übung-03-konsolidiertes-logging)
  - [Verständnis- und Transferfragen](#verständnis--und-transferfragen)
  - [Links](#links)
  - [Was sollten Sie mitnehmen](#was-sollten-sie-mitnehmen)
Nane Kratzke's avatar
Nane Kratzke committed
38
39
40

## Vorbereitung

41
42
43
44
Sie benötigen auf Ihren lokalen Entwicklungsrechner:

- [Python 3](https://www.python.org/downloads)
- [Docker](https://www.docker.com/get-started)
Nane Kratzke's avatar
UE1    
Nane Kratzke committed
45
46
- [Lens](https://k8slens.dev)
- [salvo](https://github.com/tarekziade/salvo) `python3 -m pip install salvo` *Sie können mit anderen HTTP Load Generatoren arbeiten. Diese Anleitung basiert jedoch auf `salvo`.*
47
48
49

Führen Sie anschließend bitte folgende Schritte aus:

Nane Kratzke's avatar
Nane Kratzke committed
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
1. [Forken](https://git.mylab.th-luebeck.de/cloud-native/lab-tracing/-/forks/new) Sie sich bitte dieses [Repository](https://git.mylab.th-luebeck.de/cloud-native/lab-tracing).
2. Erstellen Sie anschließend in Gitlab unter `Einstellungen -> Repository -> Bereitstellungstoken` für das in Schritt 1 geforkte Repository einen **Bereitstellungstoken**, um selbstgebaute Container Images deployen zu können.
   - **Name:** `Registry read access (deployment)`
   - **Username:** `image-registry` (bitte exakt so!)
   - **Scope:** `read-registry` (nicht mit *read repository* verwechseln!)
   - Klicken Sie anschließend auf `Bereitstellungstoken erstellen` und kopieren Sie sich dieses geheime Token in die Zwischenablage!
3. Hinterlegen Sie nun für Gitlab Build-Pipelines dieses geheime Token unter `Einstellungen -> CI/CD -> Variables` als CI/CD-Variable.
   - Klicken Sie auf `ADD Variable`
   - **Key:** `REGISTRY_READ_TOKEN` (exakt so)
   - **Value:** Fügen Sie hier das geheime Token (Schritt 2) aus der Zwischenablage ein.
   - **Type:** `Variable` (nichts anderes)
   - **Flags:** Selektieren Sie `Mask Variable` damit das geheime Token in Log-Dateien maskiert wird.
4. Setzen Sie bitte analog zu Schritt 3 die `KUBECONFIG` Variable in `Einstellungen -> CI/CD -> Variables` auf den Inhalt der Kubeconfig-Datei, die Sie für dieses Modul als Access Credential für den bereitgestellten Kubernetes Cluster erhalten haben (Type: `File`). Hierdurch erhält die Build Pipeline für das Deployment Zugriff auf den Cluster.

## Übung 01: Instrumentieren von Microservices zum Zwecke des Tracings

Nane Kratzke's avatar
UE1    
Nane Kratzke committed
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
Die Deployment-Pipeline dieses Projekts ist so eingestellt, dass Ihnen eine Kibana Oberfläche in der `prepare`-Stage automatisch deployed wird. Kibana hat Zugriff auf den zentralen Elasticsearch Log- und Tracing-Store des Clusters.

Um Zugriff auf Kibana zu bekommen, geben Sie in einem Lens-Terminal folgendes ein:

```Bash
Terminal 1:> kubectl port-forward svc/kibana-kibana 55601:5601
```

Anschließend können Sie unter [http://localhost:55601](http://localhost:55601) die Kibana Oberfläche für dieses Lab einsehen.

![UI](Kibana-Observability.png)

**Halten Sie bitte das Terminal 1 für die gesamte Dauer des Labs offen!**

Die Instrumentierung mit APM ist extrem einfach und wesentlich komfortabler als bspw. mit [OpenTracing](https://opentracing.io/guides/python) o. ähnl. Bibliotheken, da APM viel Instrumentierung schon abnimmt, wenn es mit unterstützen [Webframeworks](https://www.elastic.co/guide/en/apm/agent/python/current/supported-technologies.html) eingesetzt wird.

Für [Flask](https://flask.palletsprojects.com) muss man bspw. nur die folgenden Zeilen nutzen, um das Flask `app`-Objekt mit einem Tracing Layer zu "umgeben". Dadurch werden bereits alle Requests an den Service getraced und auch automatisch Spans für ausgehende HTTP-Requests erzeugt.

```Python
app = Flask(__name__)
apm = ElasticAPM(app, service_name="my-service")
```

Den zu verwendenden APM Tracing Server können Sie dem Prozess mittels der Umgebungsvariable `ELASTIC_APM_SERVER_URL` mit geben. Das Service Deployment in `deploy/space-deploy+svc.yaml` ist bereits entsprechend vorbereitet. Der Tracing Server selber ist in der `.gitlab-ci.yml` Datei in der Umgebungsvariablen `TRACING_SERVER` hinterlegt.

1. Lesen Sie sich vorher etwas in die Instrumentierung mittels APM/Python/Flask in diesem [Tutorial](https://www.elastic.co/guide/en/apm/agent/python/current/flask-support.html) ein. Weitere Spans können mittels den Hinweisen zu [Instrumenting Custom Code](https://www.elastic.co/guide/en/apm/agent/python/current/instrumenting-custom-code.html) eingefügt werden.
2. Ergänzen Sie nun in der Datei `space/service.py` das Tracing mittels APM. Der `service_name` soll dabei aus der Umgebungsvariable `SERVICE` ausgelesen werden.
3. Committen und Pushen Sie Ihre Änderungen nun an Gitlab.
4. Warten Sie bis die Deployment Pipeline durchgelaufen ist. Und starten Sie dann den manuellen `space-svc`-Job in der `deploy`-Stage.

> __Hinweis:__
> Wenn Sie gar nicht weiterkommen, können Sie mit
> `> cp/cheat/service-ue1.py space/service.py`
> ggf. etwas abkürzen.

Nane Kratzke's avatar
Nane Kratzke committed
101
102
103

## Übung 02: Propagieren von Traces zwischen Microservices

Nane Kratzke's avatar
UE1    
Nane Kratzke committed
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
![UI](Kibana-UI.png)

Wenn Sie auf `hiphop-svc-1` klicken, sollten Sie eine derartige Auswertung sehen. Insbesondere die Latency Distribution ist hier von Interesse, da Sie diese nutzen können, um die Verteilung von Latenzen in Ihren Requests zu sehen.

Vergleichen Sie doch einmal die Spans von Requests mit kurzen Latenzen mit den Spans von langen Latenzen.

- Was fällt Ihnen auf?
- Wie entstehen vermutlich die Wartezeiten?
- Was für Ideen haben Sie, diese Wartezeiten zu reduzieren?

![Tracing](Kibana-Tracing.png)

> __Hinweis:__
> Wenn Sie gar nicht weiterkommen, können Sie mit
> `> cp/cheat/service-ue2.py hiphop/service.py`
> ggf. etwas abkürzen.

## Übung 03: Konsolidiertes Logging

## Verständnis- und Transferfragen

## Links

- [ELK Stack Helm-Charts](https://github.com/elastic/helm-charts)
- [Elasticsearch](https://www.elastic.co/de/elasticsearch)
- [FileBeat](https://www.elastic.co/de/beats/filebeat)
- [APM](https://www.elastic.co/de/apm)
- [APM Python Agent](https://www.elastic.co/guide/en/apm/agent/python/current/index.html)
- [Flask](https://flask.palletsprojects.com)
- [Kibana](https://www.elastic.co/de/kibana)
- [OpenTracing](https://opentracing.io)

## Was sollten Sie mitnehmen

- a
- b
- c