Service Mesh in bestehende Landschaften einführen, ohne den laufenden Betrieb zu gefährden
In der Enterprise-Realität sind reine „Greenfield“-Deployments die absolute Ausnahme. Der Standard ist eine komplexe „Brownfield“-Umgebung, in der moderne Cloud-Native-Microservices in Kubernetes neben Legacy-Workloads auf virtuellen Maschinen oder Bare-Metal-Servern koexistieren. Diese…
In der Enterprise-Realität sind reine „Greenfield“-Deployments die absolute Ausnahme. Der Standard ist eine komplexe „Brownfield“-Umgebung, in der moderne Cloud-Native-Microservices in Kubernetes neben Legacy-Workloads auf virtuellen Maschinen oder Bare-Metal-Servern koexistieren. Diese heterogenen Landschaften verlangen nach einer Infrastrukturschicht, die Konnektivität und Sicherheit nicht nur isoliert im Cluster, sondern über die gesamte hybride Architektur hinweg gewährleistet [14], [16], [21].
Oft scheitern Einführungsinitiativen jedoch an der Sorge, das Service Mesh sei ein riskantes „Big Bang“-Ereignis. Technische Teams fürchten dabei nicht nur den Ressourcen-Overhead der Sidecars und potenzielle Latenzen unter Last, sondern vor allem operative Ausfälle durch Fehlkonfigurationen. Ein klassisches Szenario ist das verfrühte Erzwingen von mTLS (Strict Mode), das bestehende, unverschlüsselte Verbindungen abrupt kappt, solange Clients noch nicht vollständig migriert sind [3], [9], [13].
Die zentrale These dieses Blogbeitrags lautet daher: Die Einführung eines Service Mesh muss evolutionär, nicht revolutionär erfolgen. Der Schlüssel liegt in der strikten Entkopplung von technischer Installation und logischer Durchsetzung (Enforcement). Anstatt Traffic sofort zu blockieren, nutzen wir Mechanismen wie den PERMISSIVE-Modus. Dieser erlaubt die Bereitstellung von Identitäten und Verschlüsselung, ohne den produktiven Datenverkehr zu gefährden, bis die Migration vollständig verifiziert ist [13], [20].
Phase 1: Observability First – „Licht anmachen, bevor man umräumt“
Bevor restriktive Sicherheitsrichtlinien erzwungen werden, muss volle Transparenz über die Infrastruktur herrschen. Die technische Basis hierfür bildet die Installation des Service Mesh (z. B. Istio) im PERMISSIVE-Modus. In dieser Konfiguration werden Sidecar-Proxies injiziert, die zwar mTLS-Zertifikate für die interne Kommunikation bereitstellen, jedoch weiterhin unverschlüsselten Plaintext-Traffic akzeptieren. Dieser Ansatz etabliert einen transparenten Proxy, der sofortige Telemetriedaten liefert, ohne bestehende Verbindungen zu Legacy-Clients oder Services außerhalb des Meshs abrupt zu kappen [13], [20].
Der operative Mehrwert dieser Phase liegt im passiven Monitoring. Durch die Aggregation von Telemetrie-Daten in Tools wie Kiali, Grafana und Jaeger wird der tatsächliche Traffic-Fluss sichtbar, noch bevor die erste AuthorizationPolicy greift. Dies ist der entscheidende Schritt, um „versteckte“ Abhängigkeiten zu identifizieren – etwa undokumentierte Service-Aufrufe oder Legacy-Schnittstellen –, die bei einer blinden Umstellung auf STRICT mTLS sofort ausfallen würden [4], [13], [20].
Um dieses „Licht anzumachen“, müssen die Workloads effektiv Teil des Meshs werden – typischerweise initiiert durch Namespace-Labeling und einen anschließenden Pod-Neustart. Hierbei ist ein strategisches Vorgehen essenziell: Sidecars sollten nicht schlagartig („Big Bang“), sondern über kontrollierte Rolling Updates injiziert werden. Ein häufig unterschätztes technisches Risiko sind dabei Race Conditions: Startet der Applikations-Container schneller als der Sidecar-Proxy, schlagen initiale Netzwerkverbindungen fehl (CrashLoopBackOffs). Um dies zu verhindern, sollte global oder per Annotation die Konfiguration holdApplicationUntilProxyStarts: true gesetzt werden. Sie blockiert den Start der Applikation so lange, bis der Proxy bereit ist, und garantiert so einen sauberen Boot-Prozess inklusive korrekter Telemetrie-Erfassung [24].
Phase 2: Hybrid-Networking – Die Brücke zur Legacy-Welt (VMs)
Die Unternehmensrealität verlangt oft, dass moderne Microservices nahtlos mit Legacy-Anwendungen auf virtuellen Maschinen kommunizieren. Um diese Welten zu vereinen, nutzen wir die Mesh Expansion. Hierbei fungieren WorkloadGroup und WorkloadEntry als technisches Bindeglied: Während die WorkloadGroup als logisches Template dient – analog zu einem Kubernetes Deployment –, repräsentiert der WorkloadEntry die spezifische VM-Instanz im Service-Register. Diese Abstraktion erlaubt es uns, Kubernetes-Pods und VMs unter einem gemeinsamen Service-Namen zu vereinen und den Traffic mittels workloadSelector transparent über beide Infrastrukturen hinweg zu verteilen [14], [16], [17].
Technisch wird die VM durch die Installation des Istio-Sidecars zum „First-Class Citizen“. Der Agent wird auf der VM installiert und mittels eines Service Accounts gebootstrappt, wodurch er mTLS, Telemetrie und Traffic-Management bereitstellt – identisch zu den Funktionen innerhalb des Clusters. Eine der größten operativen Hürden ist hierbei oft das DNS-Routing, da VMs standardmäßig keine Kubernetes-Service-Namen auflösen können. Istio löst dies elegant durch einen DNS-Proxy im Sidecar. Dieser fängt DNS-Anfragen der Anwendung ab und löst sie lokal auf, sodass VMs transparent Services im Cluster ansprechen können [16], [17].
Für externe Systeme, die sich technisch nicht durch einen Sidecar in das Mesh integrieren lassen – wie proprietäre Mainframes oder Public-Cloud-APIs –, empfiehlt es sich ServiceEntry-Objekte mit der Location MESH_EXTERNAL zu nutzen. Diese fügen die externen Endpunkte der internen Registry hinzu und machen sie für das Routing sichtbar. In Kombination mit dedizierten Egress-Gateways lässt sich dieser ausgehende Traffic zentralisieren und strikt reglementieren. Ein entscheidender Vorteil ist hierbei die TLS-Origination am Gateway: Der Service im Cluster kommuniziert intern effizient (z. B. via HTTP oder mTLS zum Gateway), während das Egress-Gateway die verschlüsselte HTTPS-Verbindung zum externen Ziel aufbaut. Dies entkoppelt den Anwendungscode vollständig vom komplexen Zertifikatsmanagement externer Drittanbieter [14].
Phase 3: Traffic Shifting & The „Strangler Fig“ Pattern
Sobald die Observability steht und die hybride Konnektivität gewährleistet ist, beginnt die kritische Phase der aktiven Traffic-Steuerung. Die Migration des Ingress-Traffics – oft der heikelste Punkt – erfolgt nicht durch einen harten „Cutover“, sondern durch die Anwendung des „Strangler Fig“-Patterns. Hierbei wird der alte Ingress-Controller (z. B. Nginx) parallel zum neuen Istio Ingress Gateway betrieben. Technisch realisieren wir die Ablösung idealerweise über DNS-Weighted-Routing auf Ebene des externen Load Balancers. Wir leiten zuerst nur einen winzigen Prozentsatz (z. B. 5 %) des Traffics auf das Mesh-Gateway um. Funktioniert das Routing und die Terminierung wie erwartet, erhöhen wir die Last schrittweise auf 10 % und schließlich auf 100 %, während die alten Gateways als Fallback bereitstehen, bis die Stabilität vollends verifiziert ist [12], [15].
Parallel zur Traffic-Migration härten wir die interne Kommunikation, indem wir uns dem Zero-Trust-Ziel nähern. Der Wechsel von PERMISSIVE (wo Plaintext noch erlaubt ist) zu STRICT mTLS ist der entscheidende Schritt, um unverschlüsselte Verbindungen endgültig zu unterbinden. Um hierbei keine legitimen Requests versehentlich zu blockieren („Self-Denial-of-Service“), ist Validierung das oberste Gebot. Wir nutzen hierfür AuthorizationPolicies im Dry-Run-Modus (eine Funktion neuerer Istio-Versionen) oder analysieren detaillierte Audit-Logs. So können wir simulieren, welche Verbindungen durch eine Policy abgelehnt würden, ohne den tatsächlichen Datenfluss zu stören. Erst wenn die Logs bestätigen, dass ausschließlich unerwünschter Traffic betroffen ist, wird der Schalter auf STRICT umgelegt und die Policy scharfgeschaltet [11], [13].
Ein klassischer „Silent Killer“, der oft erst bei der Umstellung auf STRICT mTLS sichtbar wird, sind die Kubernetes Health Probes. Da das Kubelet, welches die Liveness- und Readiness-Checks ausführt, selbst nicht Teil des Meshs ist und keine mTLS-Zertifikate besitzt, scheitern seine HTTP-Checks am nun verschlüsselten Container-Port. Die Folge sind endlose Neustart-Schleifen eigentlich gesunder Pods. Um dies zu verhindern, ohne die Applikationsmanifeste massiv umzubauen, greift Istio standardmäßig auf Probe Rewriting zurück: Der Sidecar-Agent fängt die Health-Check-Requests ab und leitet sie intern am mTLS-Tunnel vorbei direkt an die Applikation weiter [11].
Gleichzeitig bietet diese Phase die Möglichkeit, die Stabilität wackeliger Legacy-Dienste aktiv zu erhöhen. Wir konfigurieren sog. Circuit Breaker, die wie eine Sicherung im Stromkasten funktionieren: Erkennt der Mesh, dass eine Service-Instanz überlastet ist oder Fehler liefert (Outlier Detection), nimmt er sie temporär aus dem Routing. Das verschafft der Instanz eine „Atempause“, anstatt sie durch ständige Retries endgültig in den Absturz zu treiben – ein automatischer Selbstschutz vor kaskadierenden Ausfällen, den alter Anwendungscode oft vermissen lässt [4].
Phase 4: Modernisierung durch Ambient Mesh (Sidecar-less)
Der Ambient Mode revolutioniert die Service-Mesh-Architektur für Brownfield-Umgebungen, indem er invasive Sidecars durch einen effizienten, auf dem Node laufenden ztunnel (für L4-Verschlüsselung/Telemetrie) und optionale Waypoint Proxies (für L7-Policies) ersetzt. Diese Entkopplung ermöglicht eine risikofreie Adoption im laufenden Betrieb: Workloads werden lediglich durch das Labeln des Namespaces (z. B. istio.io/dataplane-mode=ambient) in das Mesh integriert, ohne dass Anwendungs-Pods neu gestartet werden müssen. Dieser Ansatz eliminiert nicht nur Migrations-Downtimes, sondern reduziert auch den operativen Overhead drastisch – in Referenzarchitekturen konnte der Speicherbedarf für das Mesh um über 90 % gesenkt werden (z. B. von 8 GB auf ca. 535 MB bei 200 Pods), während strikte Zero-Trust-Sicherheitsstandards erhalten bleiben [3], [19], [22].
Die operative Umsetzung besticht durch ihre Einfachheit, doch die technische Magie verbirgt sich im Istio CNI-Plugin. Um Workloads in den Mesh aufzunehmen, genügt das Labeln des Namespaces. Das CNI-Plugin erkennt dieses Signal und konfiguriert die Netzwerkregeln des Nodes dynamisch so um, dass der Traffic transparent durch den lokalen ztunnel geleitet wird. Da diese Umleitung rein auf Netzwerkebene erfolgt und die Pod-Architektur selbst unangetastet bleibt (keine Injektion eines zusätzlichen Containers), ist – anders als beim klassischen Ansatz – kein Neustart der Workloads erforderlich. Dieser Ansatz eliminiert zudem effektiv das in Phase 1 beschriebene Risiko von CrashLoopBackOffs: Da empfindliche Legacy-Anwendungen nicht gegen einen startenden Proxy ankämpfen müssen, lassen sie sich nun “geräuschlos“ in das Mesh aufnehmen, während die zuvor für Sidecars reservierten Ressourcen (CPU/RAM) wieder der Stabilität der Business-Logik zugutekommen [6], [9], [19], [22], [24].
Im direkten Vergleich lohnt sich der Ambient Mode besonders für Legacy-Anwendungen, bei denen Kosteneffizienz und operative Einfachheit im Vordergrund stehen, da er die Komplexität durch den Wegfall von Sidecars reduziert und Overprovisioning vermeidet. Da der ztunnel in Rust geschrieben und auf Performance optimiert ist, kann er Latenzen im Vergleich zum Sidecar-Modell signifikant verringern – insbesondere durch effizienteres Connection-Pooling via HTTP/2-Multiplexing und eine drastische Reduktion von Systemaufrufen (Syscalls) um bis zu 60 %. Das klassische Sidecar behält seine Berechtigung vorerst in Szenarien, in denen eine strikte Isolation der Proxy-Instanz pro Pod aus Sicherheits- oder Multi-Tenancy-Gründen zwingend gefordert ist oder spezifische Edge-Cases der Traffic-Steuerung (wie komplexe Envoy-Filter) genutzt werden, für die es im Ambient-Modus noch an reifen APIs mangelt. Für die breite Masse der Enterprise-Workloads bietet Ambient jedoch den effizienteren und ressourcenschonenderen Migrationspfad [3], [5], [6], [9], [19], [22].
Fazit
Die erfolgreiche Einführung eines Service Mesh in komplexen Brownfield-Umgebungen ist kein einmaliges „Big Bang“-Ereignis, sondern ein iterativer Prozess. Wie in den vorangegangenen Phasen dargelegt, ermöglicht die Entkopplung von technischer Installation und logischem Policy-Enforcement eine Migration, bei der Stabilität stets Vorrang vor neuen Features hat. Während Zero-Trust-Sicherheit und tiefe Observability die primären Treiber für die Adoption sind, bleibt die operative Zuverlässigkeit die unverhandelbare Bedingung jeder Phase [5].
Ist das Fundament erst einmal gelegt und der Traffic sicher im Mesh, eröffnet sich ein neues Feld operativer Exzellenz: Technische Teams können nun fortschrittliche Deployment-Strategien wie Canary-Releases präzise über den Mesh steuern, um das Risiko neuer Softwareversionen zu minimieren. Gleichzeitig ermöglicht der Mesh den Einstieg in das Chaos Engineering (Fault Injection), um proaktiv Latenzen oder Ausfälle zu simulieren und so die Resilienz der Architektur zu härten, bevor echte Vorfälle auftreten. Der Service Mesh wandelt sich damit von einer reinen Infrastrukturkomponente zu einem strategischen Enabler für echte Cloud-Native-Agilität [4], [8], [15].
Bremler Barr, A., Lavi, O., Naor, Y., Rampal, S., & Tavori, J. (2024). Technical Report: Performance Comparison of Service Mesh Frameworks: the MTLS Test Case. [Technical Report – v1]. arXiv. Open Access via https://www.arxiv.org/pdf/2411.02267v1.
Chigurupati, M. & Jagtap, A. (2024). Enhancing Microservice Resiliency and Reliability on Kubernetes with Istio: A Site Reliability Engineering Perspective. International Journal of Computer Trends and Technology, 72(11), 17–22. Open Access via https://www.ijcttjournal.org/Volume-72%20Issue-11/IJCTT-V72I11P103.pdf.
Farkiani, B., Liu, F., & Crowley, P. (2024). The Door to Policy Portability might be an IP Overlay. [Technical Report – v2]. arXiv. Open Access via https://arxiv.org/pdf/2510.04052v2.
Sie sehen gerade einen Platzhalterinhalt von Hubspot Embedded Content. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Sie sehen gerade einen Platzhalterinhalt von Hubspot Meetings. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Sie sehen gerade einen Platzhalterinhalt von reCAPTCHA. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.