|
| 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 | +``` |
0 commit comments