Skip to content

Commit e2570df

Browse files
author
wlanboy
committed
Aufteilung readme Themen
1 parent 27df32b commit e2570df

3 files changed

Lines changed: 138 additions & 58 deletions

File tree

db-schwenk.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# MySQL aktivieren (Feature Flag)
2+
3+
Die App startet standardmäßig mit einer In-Memory-H2-Datenbank. Der Wechsel auf eine externe MySQL-Instanz erfolgt über das Feature Flag `mysql.external.enabled` in `values.yaml`.
4+
5+
## 1. Lokale MySQL-Instanz starten
6+
7+
```bash
8+
cd mysql
9+
docker-compose up -d
10+
```
11+
12+
Startet MySQL auf Port 3306 mit Datenbank `restdata` und User `restdata` (Passwort: `restdata`).
13+
14+
## 2. DNS für Istio ServiceEntry prüfen
15+
16+
Istio registriert den Hostnamen `mysql.extern.big.lan` als `ServiceEntry` im Mesh. CoreDNS muss diesen Namen auflösen können — sonst kann der Envoy-Sidecar keine Verbindung aufbauen.
17+
18+
DNS-Auflösung aus dem `helloworld`-Namespace prüfen:
19+
20+
```bash
21+
kubectl run dnstest -it --rm --image=busybox --restart=Never -n default -- nslookup mysql.extern.big.lan
22+
kubectl run dnstest -it --rm --image=busybox --restart=Never -n helloworld -- nslookup mysql.extern.big.lan
23+
```
24+
25+
Erwartet: eine IP-Antwort. Schlägt die Auflösung fehl, `resolution: STATIC` mit der Docker-Bridge-IP verwenden (siehe Schritt 3).
26+
27+
## 3. values.yaml anpassen
28+
29+
```yaml
30+
mysql:
31+
external:
32+
enabled: true
33+
host: mysql.extern.big.lan
34+
port: 3306
35+
resolution: STATIC # STATIC wenn kein DNS – IP direkt angeben
36+
address: "172.19.0.1" # Docker-Bridge-IP (Äquivalent zu host.docker.internal)
37+
database: restdata
38+
username: "restdata"
39+
password: "restdata"
40+
```
41+
42+
Bei `resolution: DNS` entfällt `address` – Istio löst den Hostnamen über CoreDNS auf.
43+
44+
## 4. Helm-Update deployen
45+
46+
```bash
47+
helm upgrade --install helloworld helmchart/ --namespace helloworld
48+
```
49+
50+
## 5. Verbindung prüfen
51+
52+
```bash
53+
curl https://helloworld.tp.lan/db
54+
```
55+
56+
Erwartet:
57+
58+
```json
59+
{"connected":true,"type":"MySQL","version":"8.x.x","url":"jdbc:mysql://mysql.extern.big.lan:3306/restdata"}
60+
```

kunden-traffic.md

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Zwei Versionen: intern/extern (Source-Namespace-Routing)
2+
3+
Der Chart deployt **zwei Versionen** derselben App parallel (`values.yaml``versions`), um Istio
4+
Source-Namespace-Routing zu demonstrieren (Details siehe [`request-routing/istio-routing.md`](request-routing/istio-routing.md)):
5+
6+
| Version | `sourceNamespace` | ConfigMap | `info.app.version-label` |
7+
|---|---|---|---|
8+
| `extern` | `testclientextern` | `helloworld-config-extern` | `extern` |
9+
| `intern` | `testclientintern` | `helloworld-config-intern` | `intern` |
10+
11+
Jede Version bekommt ein eigenes Deployment, eine eigene ConfigMap (`config/application-<name>.properties`)
12+
und ein eigenes DestinationRule-Subset. Der VirtualService routet Sidecar-zu-Sidecar-Traffic
13+
(Gateway `mesh`) anhand des **Namespace, aus dem der Call kommt**: Ruft ein Pod aus `testclientextern`
14+
auf, landet er beim `extern`-Subset; aus `testclientintern` beim `intern`-Subset. Traffic über den
15+
externen Istio-Ingress (`https://helloworld.tp.lan`) hat kein Source-Workload in einem dieser
16+
Namespaces und landet immer auf der Default-Route (`extern`).
17+
18+
> Das Source-Namespace-Matching wird vom **Envoy-Sidecar des aufrufenden Pods** ausgewertet — die
19+
> Testclient-Namespaces brauchen deshalb selbst Istio Sidecar-Injection, sonst greift die Regel nicht.
20+
21+
## Testclient-Namespaces anlegen
22+
23+
```bash
24+
kubectl create namespace testclientextern
25+
kubectl create namespace testclientintern
26+
27+
kubectl label namespace testclientextern istio-injection=enabled
28+
kubectl label namespace testclientintern istio-injection=enabled
29+
```
30+
31+
## Routing mit einem busybox-Pod testen
32+
33+
`busybox` hat kein `curl`, aber `wget` reicht für den Test. Pro Testclient-Namespace ein Pod, der
34+
den `/actuator/info`-Endpunkt des Services abruft:
35+
36+
```bash
37+
# Aufruf aus testclientextern → erwartet version-label "extern"
38+
kubectl run testclient -n testclientextern --image=busybox --restart=Never --rm -it -- \
39+
wget -qO- http://helloworld.helloworld.svc.cluster.local:8080/actuator/info
40+
41+
# Aufruf aus testclientintern → erwartet version-label "intern"
42+
kubectl run testclient -n testclientintern --image=busybox --restart=Never --rm -it -- \
43+
wget -qO- http://helloworld.helloworld.svc.cluster.local:8080/actuator/info
44+
```
45+
46+
Erwartete Ausgabe (Auszug):
47+
48+
```json
49+
{"app":{"version-label":"extern"}}
50+
```
51+
52+
bzw. `"version-label":"intern"` für den zweiten Aufruf. Zum Vergleich: der externe Ingress-Aufruf
53+
landet immer auf `extern`:
54+
55+
```bash
56+
curl https://helloworld.tp.lan/actuator/info
57+
```
58+
59+
> Läuft der Pod ohne Sidecar (z.B. weil das Namespace-Label fehlte, bevor der Pod gestartet wurde),
60+
> antwortet `wget` trotzdem — aber ohne Source-Namespace-Matching landet der Call dann ebenfalls
61+
> immer auf der Default-Route (`extern`), unabhängig vom Aufrufer-Namespace.
62+
63+
## Aufräumen
64+
65+
```bash
66+
kubectl delete namespace testclientextern testclientintern
67+
```

readme.md

Lines changed: 11 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,14 @@ Im h2-Modus (Standard) liefert `/db`:
199199

200200
---
201201

202+
## Zwei Versionen: intern/extern (Source-Namespace-Routing)
203+
204+
Der Chart deployt zwei Versionen derselben App parallel und routet Traffic anhand des
205+
Aufrufer-Namespace per Istio. Beschreibung, Testclient-Setup und busybox-Testbefehle:
206+
**[kunden-traffic.md](kunden-traffic.md)**
207+
208+
---
209+
202210
## Helm Chart — Manuelle Befehle
203211

204212
### Testen (lokal rendern, kein Deployment)
@@ -245,64 +253,9 @@ kubectl delete namespace helloworld
245253

246254
## MySQL aktivieren (Feature Flag)
247255

248-
Die App startet standardmäßig mit einer In-Memory-H2-Datenbank. Der Wechsel auf eine externe MySQL-Instanz erfolgt über das Feature Flag `mysql.external.enabled` in `values.yaml`.
249-
250-
### 1. Lokale MySQL-Instanz starten
251-
252-
```bash
253-
cd mysql
254-
docker-compose up -d
255-
```
256-
257-
Startet MySQL auf Port 3306 mit Datenbank `restdata` und User `restdata` (Passwort: `restdata`).
258-
259-
### 2. DNS für Istio ServiceEntry prüfen
260-
261-
Istio registriert den Hostnamen `mysql.extern.big.lan` als `ServiceEntry` im Mesh. CoreDNS muss diesen Namen auflösen können — sonst kann der Envoy-Sidecar keine Verbindung aufbauen.
262-
263-
DNS-Auflösung aus dem `helloworld`-Namespace prüfen:
264-
265-
```bash
266-
kubectl run dnstest -it --rm --image=busybox --restart=Never -n default -- nslookup mysql.extern.big.lan
267-
kubectl run dnstest -it --rm --image=busybox --restart=Never -n helloworld -- nslookup mysql.extern.big.lan
268-
```
269-
270-
Erwartet: eine IP-Antwort. Schlägt die Auflösung fehl, `resolution: STATIC` mit der Docker-Bridge-IP verwenden (siehe Schritt 3).
271-
272-
### 3. values.yaml anpassen
273-
274-
```yaml
275-
mysql:
276-
external:
277-
enabled: true
278-
host: mysql.extern.big.lan
279-
port: 3306
280-
resolution: STATIC # STATIC wenn kein DNS – IP direkt angeben
281-
address: "172.19.0.1" # Docker-Bridge-IP (Äquivalent zu host.docker.internal)
282-
database: restdata
283-
username: "restdata"
284-
password: "restdata"
285-
```
286-
287-
Bei `resolution: DNS` entfällt `address` – Istio löst den Hostnamen über CoreDNS auf.
288-
289-
### 4. Helm-Update deployen
290-
291-
```bash
292-
helm upgrade --install helloworld helmchart/ --namespace helloworld
293-
```
294-
295-
### 5. Verbindung prüfen
296-
297-
```bash
298-
curl https://helloworld.tp.lan/db
299-
```
300-
301-
Erwartet:
302-
303-
```json
304-
{"connected":true,"type":"MySQL","version":"8.x.x","url":"jdbc:mysql://mysql.extern.big.lan:3306/restdata"}
305-
```
256+
Wechsel von der In-Memory-H2-Datenbank auf eine externe MySQL-Instanz über das Feature Flag
257+
`mysql.external.enabled`. Schritt-für-Schritt-Anleitung inkl. DNS-Check und Verifikation:
258+
**[db-schwenk.md](db-schwenk.md)**
306259

307260
---
308261

0 commit comments

Comments
 (0)