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.
Ein Service Mesh besteht typischerweise aus zwei Hauptkomponenten:
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.
Die Kontrollebene dient als zentrales Management-System für die Datenebene und bietet:
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.
Istio besteht aus mehreren Komponenten:
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: v1Dieses Beispiel zeigt einen VirtualService, der Anfragen an verschiedene Versionen des Reviews-Service basierend auf dem Header “end-user” weiterleitet.
Linkerd ist ein leichtgewichtiges Service Mesh, das von Buoyant entwickelt wurde. Es konzentriert sich auf Einfachheit, geringe Ressourcenanforderungen und einfache Bedienung.
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: 100mDieses Beispiel zeigt eine TrafficSplit-Ressource, die 90% des Verkehrs an Reviews-v1 und 10% an Reviews-v2 leitet.
Consul Connect ist das Service Mesh von HashiCorp, das auf ihrer Service-Discovery-Lösung Consul aufbaut. Es bietet:
Kuma ist ein Service Mesh, das von Kong entwickelt wurde. Es bietet:
Istio herunterladen und entpacken
curl -L https://istio.io/downloadIstio | sh -
cd istio-*
export PATH=$PWD/bin:$PATHIstio installieren
istioctl install --set profile=demo -yNamespace für Injektion konfigurieren
kubectl label namespace default istio-injection=enabledBookinfo-Anwendung deployen
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yamlGateway und VirtualService konfigurieren
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yamlÜberprüfen, ob die Anwendung läuft
kubectl get services
kubectl get podsIP-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_PORTAnwendung testen
curl -s http://${GATEWAY_URL}/productpageDashboard öffnen (Kiali, Grafana, Jaeger)
istioctl dashboard kialiMit 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: 20Circuit 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: 100Fault 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: v1Aktivieren 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: STRICTSchrittweise Einführung: Beginnen Sie mit einem begrenzten Umfang und erweitern Sie das Service Mesh nach und nach.
Ressourcenplanung: Service Meshes fügen zusätzliche Rechenressourcen und Latenz hinzu. Planen Sie entsprechend.
Observability-First-Ansatz: Nutzen Sie die Beobachtbarkeitsfeatures, um Probleme zu identifizieren und zu beheben.
Sicherheit in Schichten: Betrachten Sie mTLS als eine Schicht in Ihrer gesamten Sicherheitsstrategie.
Automatisierung: Automatisieren Sie die Konfiguration und das Management des Service Mesh mit CI/CD-Pipelines.
Sidecar-Ressourcen: Konfigurieren Sie angemessene Ressourcenbeschränkungen für Sidecar-Proxies.
Ein Service Mesh ist besonders nützlich in folgenden Szenarien:
Ein Service Mesh ist möglicherweise nicht erforderlich für:
Das Service Mesh Interface (SMI) ist eine Standard-API für Service Meshes auf Kubernetes. Es bietet: