54 Service Mesh in Kubernetes

Ein Service Mesh ist eine dedizierte Infrastrukturschicht, die in moderne, containerisierte Anwendungsumgebungen integriert wird, um die Kommunikation zwischen Microservices zu verwalten und zu optimieren. Es bietet leistungsstarke Funktionen für Verkehrsmanagement, Sicherheit, Beobachtbarkeit und Zuverlässigkeit, ohne dass Änderungen am Anwendungscode erforderlich sind. In Kubernetes-Umgebungen hat sich das Service Mesh zu einer entscheidenden Komponente für die Verwaltung komplexer Microservices-Architekturen entwickelt.

54.1 Grundkonzepte eines Service Mesh

Ein Service Mesh besteht typischerweise aus zwei Hauptkomponenten:

54.1.1 1. Data Plane (Datenebene)

Die Datenebene besteht aus einer Reihe von Proxies (oft als “Sidecars” bezeichnet), die neben jedem Service-Container ausgeführt werden. Diese Proxies:

Der am häufigsten verwendete Proxy in Service-Mesh-Implementierungen ist Envoy, ein hochleistungsfähiger C++-Proxy, der ursprünglich von Lyft entwickelt wurde.

54.1.2 2. Control Plane (Kontrollebene)

Die Kontrollebene dient als zentrales Management-System für die Datenebene und bietet:

54.2 Service Mesh Funktionen und Vorteile

54.2.1 Verkehrsmanagement

54.2.2 Sicherheit

54.2.3 Beobachtbarkeit

54.2.4 Zuverlässigkeit

54.3 Bekannte Service Mesh Implementierungen

54.3.1 Istio

Istio ist eine der bekanntesten Service-Mesh-Lösungen, die von Google, IBM und Lyft entwickelt wurde. Es bietet eine umfassende Lösung mit einer Vielzahl von Funktionen für Verkehrsmanagement, Sicherheit und Beobachtbarkeit.

54.3.1.1 Architektur von Istio

Istio besteht aus mehreren Komponenten:

54.3.1.2 Beispiel: Istio Virtual Service

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1

Dieses Beispiel zeigt einen VirtualService, der Anfragen an verschiedene Versionen des Reviews-Service basierend auf dem Header “end-user” weiterleitet.

54.3.2 Linkerd

Linkerd ist ein leichtgewichtiges Service Mesh, das von Buoyant entwickelt wurde. Es konzentriert sich auf Einfachheit, geringe Ressourcenanforderungen und einfache Bedienung.

54.3.2.1 Funktionen von Linkerd

54.3.2.2 Beispiel: Linkerd Traffic Split

apiVersion: split.smi-spec.io/v1alpha1
kind: TrafficSplit
metadata:
  name: reviews-split
spec:
  service: reviews
  backends:
  - service: reviews-v1
    weight: 900m
  - service: reviews-v2
    weight: 100m

Dieses Beispiel zeigt eine TrafficSplit-Ressource, die 90% des Verkehrs an Reviews-v1 und 10% an Reviews-v2 leitet.

54.3.3 Consul Connect

Consul Connect ist das Service Mesh von HashiCorp, das auf ihrer Service-Discovery-Lösung Consul aufbaut. Es bietet:

54.3.4 Kuma

Kuma ist ein Service Mesh, das von Kong entwickelt wurde. Es bietet:

54.4 Implementierung eines Service Mesh in Kubernetes

54.4.1 Installation von Istio

  1. Istio herunterladen und entpacken

    curl -L https://istio.io/downloadIstio | sh -
    cd istio-*
    export PATH=$PWD/bin:$PATH
  2. Istio installieren

    istioctl install --set profile=demo -y
  3. Namespace für Injektion konfigurieren

    kubectl label namespace default istio-injection=enabled

54.4.2 Beispielanwendung deployen

  1. Bookinfo-Anwendung deployen

    kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
  2. Gateway und VirtualService konfigurieren

    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
  3. Überprüfen, ob die Anwendung läuft

    kubectl get services
    kubectl get pods

54.4.3 Funktionen testen

  1. IP-Adresse des Ingress-Gateways abrufen

    export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
    export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
  2. Anwendung testen

    curl -s http://${GATEWAY_URL}/productpage
  3. Dashboard öffnen (Kiali, Grafana, Jaeger)

    istioctl dashboard kiali

54.5 Fortgeschrittene Service Mesh Konfigurationen

54.5.1 Traffic Shifting und Canary Deployments

Mit einem Service Mesh können Sie schrittweise Verkehr von einer Version eines Services zu einer anderen verschieben:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 80
    - destination:
        host: reviews
        subset: v2
      weight: 20

54.5.2 Circuit Breaking

Circuit Breaking verhindert Kaskadenausfälle in Microservices-Architekturen:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    connectionPool:
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
    outlierDetection:
      consecutiveErrors: 1
      interval: 1s
      baseEjectionTime: 3m
      maxEjectionPercent: 100

54.5.3 Fault Injection

Fault Injection ermöglicht das Testen der Resilienz Ihrer Anwendung:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - fault:
      delay:
        percentage:
          value: 10
        fixedDelay: 5s
    route:
    - destination:
        host: ratings
        subset: v1

54.5.4 mTLS-Konfiguration

Aktivieren Sie mTLS für die sichere Service-zu-Service-Kommunikation:

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: istio-system
spec:
  mtls:
    mode: STRICT

54.6 Best Practices für Service Mesh

  1. Schrittweise Einführung: Beginnen Sie mit einem begrenzten Umfang und erweitern Sie das Service Mesh nach und nach.

  2. Ressourcenplanung: Service Meshes fügen zusätzliche Rechenressourcen und Latenz hinzu. Planen Sie entsprechend.

  3. Observability-First-Ansatz: Nutzen Sie die Beobachtbarkeitsfeatures, um Probleme zu identifizieren und zu beheben.

  4. Sicherheit in Schichten: Betrachten Sie mTLS als eine Schicht in Ihrer gesamten Sicherheitsstrategie.

  5. Automatisierung: Automatisieren Sie die Konfiguration und das Management des Service Mesh mit CI/CD-Pipelines.

  6. Sidecar-Ressourcen: Konfigurieren Sie angemessene Ressourcenbeschränkungen für Sidecar-Proxies.

54.7 Wann ein Service Mesh einsetzen?

Ein Service Mesh ist besonders nützlich in folgenden Szenarien:

Ein Service Mesh ist möglicherweise nicht erforderlich für:

54.8 Herausforderungen und Einschränkungen

54.9 Service Mesh Interface (SMI)

Das Service Mesh Interface (SMI) ist eine Standard-API für Service Meshes auf Kubernetes. Es bietet: