Zum Inhalt springen

Service-Mesh-Grundlagen: Istio und Linkerd in der Praxis

Service-Mesh-Architektur mit Istio und Linkerd: Traffic-Management, mutual TLS, Observability, Circuit Breaking — und wann es sich nicht lohnt.

4 Min. Lesezeit
Diagramm eines Kubernetes-Clusters mit Sidecar-Proxys, die an Service-Pods angehängt sind, sowie Traffic-Routing-Regeln und mTLS-Verbindungen

Ein Service Mesh verlagert Netzwerkbelange – Retries, Timeouts, Verschlüsselung, Observability – aus dem Anwendungscode in die Infrastruktur. Statt dass jeder Dienst seine eigene HTTP-Retry-Logik und TLS-Zertifikatsverwaltung implementiert, übernimmt ein Sidecar-Proxy das transparent. Das Versprechen ist überzeugend: einheitliches Netzwerkverhalten über alle Dienste hinweg, ohne den Anwendungscode anzufassen.

Die Realität ist differenzierter. Service Meshes bringen operative Komplexität, zusätzlichen Ressourcenverbrauch und eine weitere Abstraktionsschicht mit sich, die im Fehlerfall analysiert werden muss. Für zehn Microservices ist ein Service Mesh wahrscheinlich übertrieben. Für hundert Dienste, die von dreißig Teams mit jeweils eigener Retry-Logik gepflegt werden, ist es ein echter Wendepunkt. Wer versteht, wann und wie man eines einsetzt, vermeidet sowohl zu wenig als auch zu viel Engineering.

Wie Sidecar-Proxys funktionieren

Jeder Pod erhält einen Sidecar-Proxy (Envoy bei Istio, linkerd2-proxy bei Linkerd), der den gesamten Netzwerkverkehr abfängt. Die Anwendung spricht mit localhost; alles Weitere übernimmt der Proxy.

ymlyaml
# What happens when you add a service mesh:
# Before: Service A → Network → Service B
# After:  Service A → Sidecar Proxy A → Network → 
#         Sidecar Proxy B → Service B
 
# Istio sidecar injection: add label to namespace
apiVersion: v1
kind: Namespace
metadata:
  name: production
  labels:
    istio-injection: enabled
    # Every pod in this namespace gets an Envoy sidecar
 
---
# Your deployment doesn't change — sidecar is injected automatically
apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-service
  namespace: production
spec:
  replicas: 3
  selector:
    matchLabels:
      app: order-service
  template:
    metadata:
      labels:
        app: order-service
    spec:
      containers:
        - name: order-service
          image: myregistry/order-service:v2.1
          ports:
            - containerPort: 8080
          # No TLS config, no retry logic, no circuit breakers
          # The sidecar handles all of it
ymlyaml
# Linkerd injection: annotate the deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-service
  annotations:
    linkerd.io/inject: enabled
spec:
  template:
    spec:
      containers:
        - name: order-service
          image: myregistry/order-service:v2.1
          ports:
            - containerPort: 8080

Traffic-Management: Canary-Deployments und Routing

Das Feature, das sich am schnellsten bezahlt macht: Traffic anhand von Regeln zu routen, ohne den Anwendungscode zu ändern. Das ermöglicht Canary-Deployments, A/B-Tests und schrittweise Rollouts.

ymlyaml
# Istio: canary deployment — route 5% of traffic to v2
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: order-service
spec:
  hosts:
    - order-service
  http:
    - route:
        - destination:
            host: order-service
            subset: v1
          weight: 95
        - destination:
            host: order-service
            subset: v2
          weight: 5
 
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: order-service
spec:
  host: order-service
  subsets:
    - name: v1
      labels:
        version: v1
    - name: v2
      labels:
        version: v2
ymlyaml
# Istio: header-based routing for testing
# Route requests with X-Debug: true header to v2
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: order-service
spec:
  hosts:
    - order-service
  http:
    - match:
        - headers:
            x-debug:
              exact: "true"
      route:
        - destination:
            host: order-service
            subset: v2
    - route:
        - destination:
            host: order-service
            subset: v1

Mutual TLS: Verschlüsselung ohne Codeänderungen

Die Verschlüsselung der Kommunikation zwischen Diensten erfordert normalerweise, dass jeder Dienst seine eigenen Zertifikate verwaltet. Ein Service Mesh automatisiert den gesamten Lebenszyklus dieser Zertifikate.

ymlyaml
# Istio: enforce mTLS for all services in the mesh
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: production
spec:
  mtls:
    mode: STRICT
    # STRICT: only accept mTLS connections
    # PERMISSIVE: accept both plain and mTLS (migration mode)
 
---
# Authorization: only allow specific services to communicate
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: order-service-policy
  namespace: production
spec:
  selector:
    matchLabels:
      app: order-service
  rules:
    - from:
        - source:
            principals:
              - "cluster.local/ns/production/sa/api-gateway"
              - "cluster.local/ns/production/sa/admin-service"
      to:
        - operation:
            methods: ["GET", "POST"]
            paths: ["/api/orders/*"]
ymlyaml
# Linkerd: mTLS is enabled by default when injected
# Verify with:
# linkerd viz edges deployment -n production
#
# Output:
# SRC              DST              SRC_NS      DST_NS      SECURED
# api-gateway      order-service    production  production  √
# order-service    payment-service  production  production  √
# order-service    inventory-svc    production  production  √

Observability: Metriken ohne Instrumentierung

Der Sidecar-Proxy sieht jede einzelne Anfrage und kann Metriken, Traces und Zugriffsprotokolle liefern, ohne dass sich am Anwendungscode etwas ändert.

ymlyaml
# Istio gives you these metrics automatically:
# - Request rate (requests/second per service)
# - Error rate (percentage of 5xx responses)
# - Latency distribution (p50, p90, p99)
# - Connection pool metrics
# - Circuit breaker trip counts
 
# Query with Prometheus:
# Request rate:
# rate(istio_requests_total{destination_service="order-service"}[5m])
 
# Error rate:
# rate(istio_requests_total{destination_service="order-service",
#   response_code=~"5.."}[5m])
# /
# rate(istio_requests_total{destination_service="order-service"}[5m])
 
# P99 latency:
# histogram_quantile(0.99,
#   rate(istio_request_duration_milliseconds_bucket{
#     destination_service="order-service"}[5m]))
ymlyaml
# Linkerd: built-in dashboard with golden signals
# Install viz extension:
# linkerd viz install | kubectl apply -f -
# linkerd viz dashboard
#
# Shows per-route metrics:
# Route               Success Rate  RPS   P50   P99
# POST /api/orders    99.8%         245   12ms  89ms
# GET  /api/orders/:id 100%         1.2k  3ms   15ms
# GET  /api/orders     99.9%        890   8ms   45ms

Circuit Breaking und Retries

Resilienzmuster werden auf Infrastrukturebene konfiguriert, statt sie in jedem Dienst einzeln zu implementieren.

ymlyaml
# Istio: circuit breaker configuration
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: payment-service
spec:
  host: payment-service
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100
      http:
        h2UpgradePolicy: DEFAULT
        http1MaxPendingRequests: 50
        http2MaxRequests: 100
    outlierDetection:
      # Eject hosts that fail too frequently
      consecutive5xxErrors: 3
      interval: 30s
      baseEjectionTime: 30s
      maxEjectionPercent: 50
 
---
# Istio: retry policy
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: payment-service
spec:
  hosts:
    - payment-service
  http:
    - route:
        - destination:
            host: payment-service
      retries:
        attempts: 3
        perTryTimeout: 2s
        retryOn: 5xx,reset,connect-failure,retriable-4xx
      timeout: 10s

Istio vs. Linkerd: die richtige Wahl treffen

markdownmarkdown
## Linkerd
- Lighter resource footprint (~10MB RAM per sidecar)
- Simpler configuration — fewer knobs to turn
- Faster startup time
- Written in Rust (linkerd2-proxy)
- Best for: teams that want automatic mTLS, 
  observability, and basic traffic management 
  without deep configuration
 
## Istio
- More features (Wasm extensibility, complex routing)
- Heavier resource usage (~50MB+ RAM per sidecar)
- Steeper learning curve
- Envoy-based (C++)
- Best for: teams that need fine-grained traffic 
  control, complex authorization policies, or 
  multi-cluster mesh
 
## When to use neither:
- Fewer than 10 services
- Team doesn't have Kubernetes operational experience
- Networking concerns are handled well by application 
  libraries (if you already have consistent retry/TLS)
- Latency budget is extremely tight (sidecar adds 
  ~1ms P99)

Das Wichtigste in Kürze

Ein Service Mesh verlagert Retries, Timeouts, Verschlüsselung und Observability aus dem Anwendungscode in Sidecar-Proxys: Jeder Pod bekommt einen Proxy, der das Netzwerk transparent verwaltet, sodass Ihre Dienste mit localhost sprechen, während das Mesh alles jenseits der Pod-Grenze übernimmt. Fangen Sie mit mTLS und Observability an – das bringt sofortigen Nutzen, weil der gesamte Service-zu-Service-Traffic automatisch verschlüsselt wird und Sie pro Route Erfolgsraten, Latenz-Perzentile und Fehlerraten erhalten, ohne eine einzige Zeile Anwendungscode zu ändern. Traffic-Management ermöglicht Canary-Deployments und headerbasiertes Routing über Konfiguration statt Code – leiten Sie 5 % des Traffics auf eine neue Version, beobachten Sie die Fehlerraten im Mesh-Dashboard und befördern oder verwerfen Sie die Version, ohne neu zu deployen. Wählen Sie Linkerd für einfacheren Betrieb und geringeren Ressourcenverbrauch, Istio für komplexes Routing und feingranulare Autorisierungsrichtlinien, und keins von beiden, wenn Sie weniger als zehn Dienste haben – die operative Komplexität eines Service Mesh muss durch die Konsistenz- und Observability-Probleme gerechtfertigt sein, die es löst.

Wilfredo Rujel

Wilfredo Rujel

Full-Stack-Softwareentwickler

Diesen Beitrag teilenX