TL;DR — Kurzzusammenfassung
Envoy Proxy für Service Mesh und Edge Proxy. Behandelt xDS API, Load Balancing, mTLS, Observability, Circuit Breaking und Kubernetes-Sidecar-Konfiguration.
Envoy Proxy ist die Datenebene im Herzen moderner Service Meshes. Ursprünglich bei Lyft entwickelt, um Observability und Zuverlässigkeit von Microservices in großem Maßstab zu lösen, ist Envoy heute der De-facto-Sidecar für Istio, der Edge Proxy vieler Ingress-Controller und ein universeller L3/L4/L7-Proxy, der von Google, AWS und Tausenden von Unternehmen eingesetzt wird. Dieser Leitfaden behandelt Envoys Architektur, statische und dynamische Konfiguration, Load-Balancing-Algorithmen, Observability-Pipeline, TLS-Verwaltung und erweiterte Filter.
Voraussetzungen
- Docker (für eigenständige Tests) oder ein Kubernetes-Cluster.
- Grundlegendes Verständnis von HTTP, TLS und Reverse-Proxy-Konzepten.
- Vertrautheit mit YAML-Konfigurationssyntax.
curlund optionaljqzum Testen von Endpoints.
Envoy-Architektur
Envoy arbeitet als prozessexterner Netzwerkproxy — er läuft neben Ihrer Anwendung, nicht als Bibliothek darin. Das macht den Proxy sprachunabhängig und ermöglicht unabhängige Upgrades.
Hauptkomponenten:
- Listeners — Netzwerkports, an die Envoy gebunden ist (Downstream-Verbindungen kommen hier an).
- Filterketten — Geordnete Liste von Netzwerk- und HTTP-Filtern, die auf jede Verbindung angewendet werden.
- Cluster — Benannte Gruppen von Upstream-Endpoints (Ihre Backend-Services).
- Endpoints — Individuelle IP:Port-Paare innerhalb eines Clusters, entdeckt via EDS oder statischer Konfiguration.
- Routes — Regeln, die eingehende Anfragen basierend auf Pfad, Header oder Abfrageparametern auf Cluster abbilden.
Thread-Modell: Envoy verwendet einen Haupt-Thread für die Verwaltung plus einen Worker-Thread pro CPU-Kern. Jeder Worker-Thread verarbeitet Verbindungen unabhängig mit nicht-blockierendem I/O. Kein Lock-Contention auf dem kritischen Pfad — jeder Worker hat seinen eigenen Connection Pool.
Hot Restart: Envoy unterstützt Zero-Downtime-Binary-Upgrades über einen Shared-Memory-Handshake zwischen altem und neuem Prozess. Der neue Prozess übernimmt vorhandene Verbindungen ohne Trafik zu verlieren.
Statische Konfiguration (envoy.yaml)
Der schnellste Einstieg ist eine statische YAML-Konfiguration mit allen inline definierten Ressourcen:
admin:
address:
socket_address:
address: 0.0.0.0
port_value: 9901
static_resources:
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: backend
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: service_backend
timeout: 15s
retry_policy:
retry_on: "5xx,reset,connect-failure"
num_retries: 3
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
clusters:
- name: service_backend
connect_timeout: 0.5s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: service_backend
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: backend-service
port_value: 8080
health_checks:
- timeout: 1s
interval: 10s
unhealthy_threshold: 2
healthy_threshold: 2
http_health_check:
path: /health
Der admin-Block stellt Envoys Management-API auf Port 9901 bereit. Verwenden Sie ihn, um /stats, /clusters, /config_dump und /healthcheck/fail für Circuit-Breaker-Tests abzufragen.
Dynamische Konfiguration: Die xDS API
Statische Konfigurationen eignen sich für einfache Deployments, werden aber bei großem Maßstab schwer handhabbar. Envoys xDS (x Discovery Service)-Protokoll erlaubt einer Control Plane, Konfigurationsänderungen zur Laufzeit zu übertragen — kein Reload, kein Neustart.
xDS-Ressourcentypen:
| API | Verwaltet |
|---|---|
| LDS (Listener Discovery Service) | Listener und Filterketten |
| RDS (Route Discovery Service) | Virtual Hosts und Routentabellen |
| CDS (Cluster Discovery Service) | Cluster-Definitionen und Richtlinien |
| EDS (Endpoint Discovery Service) | Individuelle Endpoint-Gesundheit IP:Port |
| SDS (Secret Discovery Service) | TLS-Zertifikate und private Schlüssel |
ADS (Aggregated Discovery Service): Kombiniert alle xDS APIs in einem einzigen bidirektionalen gRPC-Stream. Das ist der empfohlene Modus, da er Reihenfolge garantiert — ein neuer Cluster wird immer vor der Route geliefert, die ihn referenziert, was temporäre 503-Fehler bei Updates verhindert.
Delta xDS: Statt bei jeder Aktualisierung den vollständigen Zustand zu senden, übermittelt Delta xDS nur hinzugefügte, geänderte oder entfernte Ressourcen. Essenziell für große Meshes mit Tausenden von Clustern.
Load-Balancing-Algorithmen
Envoy unterstützt sechs pro Cluster wählbare Load-Balancing-Richtlinien:
| Richtlinie | Optimal für |
|---|---|
ROUND_ROBIN | Gleichmäßige Backend-Kapazität, Standardwahl |
LEAST_REQUEST | Variable Anfragedauer, vermeidet überlastete Backends |
RING_HASH | Konsistentes Hashing — Cache-Affinität, zustandsbehaftete Services |
RANDOM | Einfach, geringer Overhead, robust gegen langsame Endpoints |
MAGLEV | Googles konsistentes Hashing — gleichmäßigere Verteilung |
CLUSTER_PROVIDED | Delegiert Entscheidung an Upstream-Cluster-Typ |
Observability
Envoy ist eigensinnig bezüglich Observability — es wurde entwickelt, um verteilte Systeme debuggbar zu machen. Drei integrierte Säulen:
Statistiken: Envoy emittiert Tausende von Zählern, Messgrößen und Histogrammen. Stellen Sie sie Prometheus über den Admin-Endpoint bereit:
curl http://localhost:9901/stats/prometheus
Verteiltes Tracing: Envoy generiert und propagiert automatisch Trace-Kontext-Header für Jaeger, Zipkin und OpenTelemetry. Ihre Anwendung muss diese Header nur weiterleiten — Envoy übernimmt die Trace-Erstellung.
Access Logging: Strukturierte JSON-Access-Logs mit allen Anfrage-Metadaten, einschließlich Upstream-Cluster, Dauer, Response-Code und gesendeten Bytes.
TLS und mTLS mit SDS
Envoys Secret Discovery Service (SDS) löst die manuelle Zertifikatsverteilung: Zertifikate werden zur Laufzeit von einer Control Plane bezogen und ohne Prozess-Neustart rotiert.
Für gegenseitiges TLS zwischen Services erzwingt das Feld match_subject_alt_names die SPIFFE-Identität — nur Verbindungen von Services mit dem erwarteten SPIFFE-URI werden akzeptiert. So implementiert Istio Zero-Trust-Networking: Jede Pod-zu-Pod-Verbindung wird gegenseitig mit kurzlebigen, von SPIRE rotierten Zertifikaten authentifiziert.
Erweiterte Filter
Circuit Breaking: Verhindert Kaskadenausfälle durch Begrenzung ausstehender Anfragen, Wiederholungen und Verbindungen. Konfigurieren Sie max_connections, max_pending_requests, max_requests und max_retries pro Cluster.
Outlier Detection: Entfernt automatisch ungesunde Hosts aus dem Load-Balancing-Pool. Nach fünf aufeinanderfolgenden 5xx-Antworten wird der Endpoint für 30 Sekunden ausgeschlossen. max_ejection_percent verhindert die Ausgrenzung aller Hosts bei globaler Upstream-Degradierung.
Fault Injection: Injiziert Latenz oder Fehler in einen Prozentsatz der Anfragen für Chaos-Testing, pro Route konfigurierbar ohne Änderungen am Anwendungscode.
Externe Autorisierung: Delegiert Autorisierungsentscheidungen an einen externen gRPC-Service (OPA, Ory Keto). Der ext_authz-Filter sendet Anfrage-Header an den Autorisierungs-Service, bevor er upstream weiterleitet.
Wasm-Erweiterungen: Envoy unterstützt WebAssembly-Filter-Plugins für benutzerdefinierte Geschäftslogik in jeder Sprache, die zu Wasm kompiliert (Go, Rust, C++). Wasm-Filter werden ohne Binär-Upgrades hot-reloaded.
Envoy vs. Andere Proxies
| Merkmal | Envoy | Nginx | HAProxy | Traefik | Linkerd | MOSN |
|---|---|---|---|---|---|---|
| Dynamische Konfig | xDS API (kein Reload) | nginx -s reload | Runtime API | Auto-K8s-Discover | xDS (begrenzt) | xDS API |
| Service Mesh | Ja (Istio, Consul) | Nein | Nein | Nein (nur Ingress) | Ja (Linkerd2) | Ja |
| L7-Protokolle | HTTP/1.1, HTTP/2, gRPC, Thrift | HTTP/1.1, HTTP/2 | HTTP/1.1, HTTP/2 | HTTP/1.1, HTTP/2 | HTTP/1.1, HTTP/2, gRPC | HTTP/1.1, HTTP/2, Dubbo |
| Observability | Stats + Tracing integriert | Modulbasiert | Stats-Socket | Prometheus-Plugin | Goldene Signale integriert | Stats integriert |
| mTLS | SDS + SPIFFE | Manuelle Zerts | Manuelle Zerts | Manuelle Zerts | Automatisch | SDS |
| Wasm-Filter | Ja | Nein | Nein | Nein | Nein | Ja |
Praktisches Beispiel: Envoy als Front Proxy
Sie haben drei Microservices (users, orders, products) hinter Envoy als Edge Proxy, mit Traffic-Split zwischen v1 und v2 des Orders-Service für ein Canary-Deployment:
routes:
- match:
prefix: "/orders"
route:
weighted_clusters:
clusters:
- name: orders_v1
weight: 90
- name: orders_v2
weight: 10
total_weight: 100
Diese gewichtete Cluster-Konfiguration sendet 10% des /orders-Traffics an das v2-Canary ohne Änderungen am Anwendungscode.
Fallstricke und Randfälle
- Header-Groß-/Kleinschreibung: HTTP/2-Header sind standardmäßig kleingeschrieben. Envoy normalisiert sie — stellen Sie sicher, dass Ihre Services
content-type,authorizationin Kleinbuchstaben verarbeiten. - Upstream- vs. Route-Timeouts:
connect_timeoutdes Clusters (TCP) undtimeoutder Route (Anfrage) sind unabhängig. Der Standard-Route-Timeout beträgt 15 Sekunden — setzen Sie ihn explizit. - Retry-Budget: Ohne Grenzen bei
retry_onkönnen Wiederholungen unter Last Ausfälle verstärken. Kombinieren Sie Wiederholungen immer mit einem Circuit Breaker.
Fehlerbehebung
| Symptom | Wahrscheinliche Ursache | Lösung |
|---|---|---|
503 upstream_reset_before_response_started | Upstream schloss Verbindung vor Antwort | Health-Check-Pfad prüfen; connect_timeout erhöhen |
| 404 von Envoy (nicht Upstream) | Keine passende Route | /config_dump auf Admin-Port ausführen; Virtual-Host-Domain prüfen |
| Circuit Breaker in Stats offen | Upstream überlastet | max_pending_requests erhöhen oder Upstream skalieren |
| mTLS-Handshake-Fehler | SAN-Mismatch im Zertifikat | Prüfen, ob match_subject_alt_names mit echtem SPIFFE-URI übereinstimmt |
| Hohe P99-Latenz | Thread-Starvation | Worker-Thread-Anzahl mit concurrency im Bootstrap erhöhen |
Zusammenfassung
- Die xDS API ermöglicht vollständig dynamische Konfiguration ohne Neustarts — Cluster, Routen, Listener und Zertifikate werden live aktualisiert.
- Load Balancing bietet sechs Algorithmen einschließlich Ring Hash für Cache-Affinität und Least Request für heterogene Workloads.
- Integrierte Observability liefert Prometheus-Stats, verteilte Tracing-Header und strukturierte JSON-Access-Logs.
- mTLS via SDS + SPIFFE ermöglicht Zero-Trust-Networking mit kurzlebigen, automatisch rotierten Zertifikaten.
- Erweiterte Filter machen Envoy erweiterbar, ohne Anwendungscode anzufassen.