Die Welt von Envoy und Kong: Erkundung fortgeschrittener Muster für Verkehrsmanagement, Sicherheit und Leistungsoptimierung. Erfahren Sie mehr über Multi-Tenant-Routing, benutzerdefinierte Plugins und wie Sie eine Zero-Trust-Architektur implementieren, die selbst den paranoidesten Sicherheitsexperten zufriedenstellt.
Verkehrsmanagement: Den wilden Westen der Anfragen zähmen
Beginnen wir mit dem Verkehrsmanagement. In der Welt der Microservices ist das Management von Verkehr wie das Hüten von Katzen – chaotisch, unvorhersehbar und gelegentlich urkomisch.
Lastverteilung: Nicht nur für Fitnessbegeisterte
Envoy und Kong bieten ausgeklügelte Lastverteilungsfunktionen, die über einfache Round-Robin-Strategien hinausgehen. Schauen wir uns einige fortgeschrittene Techniken an:
- Wenigste Anfragen: Leitet Anfragen an die Instanz mit den wenigsten aktiven Anfragen weiter. Perfekt, wenn Sie Dienste haben, die so launisch sind wie ein Teenager.
- Gewichtetes Round Robin: Ermöglicht es Ihnen, verschiedenen Instanzen unterschiedliche Gewichte zuzuweisen. Nützlich, wenn Sie einen leistungsstarken Server haben, der mehr Last bewältigen kann als seine schwächeren Geschwister.
- Ring-Hash: Ordnet Anfragen konsistent derselben Instanz basierend auf einem Schlüssel zu. Ideal für Caching und wenn Sie möchten, dass Anfragen desselben Benutzers immer denselben Server erreichen.
Hier ist ein kurzes Beispiel, wie Sie gewichtete Lastverteilung in Envoy konfigurieren könnten:
clusters:
- name: my_backend_service
type: STRICT_DNS
lb_policy: WEIGHTED_ROUND_ROBIN
load_assignment:
cluster_name: my_backend_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: backend1.example.com
port_value: 8080
load_balancing_weight: 75
- endpoint:
address:
socket_address:
address: backend2.example.com
port_value: 8080
load_balancing_weight: 25
Circuit Breaking: Manchmal muss man wissen, wann man aufhören sollte
Circuit Breaking ist wie ein Türsteher für Ihre Dienste. Es verhindert, dass ein fehlerhafter Dienst das gesamte System lahmlegt. Sowohl Envoy als auch Kong unterstützen Circuit Breaking, aber schauen wir uns die Implementierung von Envoy an:
clusters:
- name: my_backend_service
type: STRICT_DNS
circuit_breakers:
thresholds:
- priority: DEFAULT
max_connections: 1000
max_pending_requests: 1000
max_requests: 1000
max_retries: 3
Diese Konfiguration legt Schwellenwerte für Circuit Breaking für Verbindungen, ausstehende Anfragen, aktive Anfragen und Wiederholungen fest. Wenn diese Schwellenwerte überschritten werden, beginnt Envoy, Anfragen abzulehnen, um das System zu schützen.
Multi-Tenant-Routing: Gut mit anderen auskommen
In einer Multi-Tenant-Umgebung müssen Sie sicherstellen, dass der Verkehr verschiedener Mandanten isoliert und korrekt weitergeleitet wird. Kong glänzt in diesem Bereich mit seinen leistungsstarken Routing-Funktionen.
Der Weg zum Glück
Hier ist ein Beispiel, wie Sie Multi-Tenant-Routing in Kong einrichten könnten:
# Erstellen Sie einen Dienst
curl -i -X POST http://localhost:8001/services \
--data name=myservice \
--data url='http://myservice.com'
# Erstellen Sie eine Route für Mandant A
curl -i -X POST http://localhost:8001/services/myservice/routes \
--data 'hosts[]=tenanta.myapi.com' \
--data 'paths[]=/v1/tenanta'
# Erstellen Sie eine Route für Mandant B
curl -i -X POST http://localhost:8001/services/myservice/routes \
--data 'hosts[]=tenantb.myapi.com' \
--data 'paths[]=/v1/tenantb'
Diese Einrichtung stellt sicher, dass Anfragen für Mandant A und Mandant B korrekt an ihre jeweiligen Endpunkte weitergeleitet werden, selbst wenn sie denselben zugrunde liegenden Dienst ansprechen.
Anfrage-Transformation: Ihre APIs umformen
Manchmal sprechen Ihre Backend-Dienste einen anderen Dialekt als Ihre Clients. Hier kommt die Anfrage-Transformation ins Spiel. Kongs request-transformer-Plugin ist wie ein Universalübersetzer für Ihre APIs.
Verloren in der Übersetzung? Nicht mehr!
So könnten Sie das request-transformer-Plugin verwenden, um Header und Abfrageparameter zu ändern:
curl -X POST http://localhost:8001/routes/{route_id}/plugins \
--data "name=request-transformer" \
--data "config.add.headers=x-tenant-id:$(tenant_id)" \
--data "config.add.querystring=version:v2" \
--data "config.rename.headers=x-old-header:x-new-header"
Diese Konfiguration fügt einen Mandanten-ID-Header hinzu, hängt einen Versionsabfrageparameter an und benennt einen vorhandenen Header um. Es ist, als würden Sie Ihren Anfragen ein Makeover geben, bevor sie Ihre Backend-Dienste erreichen.
Erweiterte Ratenbegrenzung: Die Party unter Kontrolle halten
Ratenbegrenzung ist entscheidend, um Ihre APIs vor Missbrauch zu schützen und eine faire Nutzung sicherzustellen. Aber grundlegende Ratenbegrenzung ist so was von gestern. Schauen wir uns einige fortgeschrittene Techniken zur Ratenbegrenzung mit Kong an.
Ratenbegrenzung auf Steroiden
Kongs Ratenbegrenzungs-Plugin bietet erweiterte Funktionen wie die Begrenzung nach Header-Wert oder Verbrauchergruppen. Hier ist eine Beispielkonfiguration:
curl -X POST http://localhost:8001/plugins \
--data "name=rate-limiting" \
--data "config.limit=5" \
--data "config.window_size=30" \
--data "config.limit_by=header" \
--data "config.header_name=x-consumer-group"
Diese Einrichtung begrenzt Anfragen basierend auf einem Verbrauchergruppen-Header, sodass Sie eine gestufte Ratenbegrenzung für verschiedene Benutzertypen oder Mandanten implementieren können.
Entwicklung benutzerdefinierter Plugins: Manchmal muss man es selbst machen
Fertige Plugins sind großartig, aber manchmal brauchen Sie etwas Maßgeschneidertes. Sowohl Envoy als auch Kong ermöglichen es Ihnen, benutzerdefinierte Plugins zu entwickeln, um ihre Funktionalität zu erweitern.
Ihr eigenes Kong-Plugin entwickeln
Hier ist ein Vorgeschmack darauf, wie ein benutzerdefiniertes Kong-Plugin aussehen könnte:
local CustomPlugin = {
PRIORITY = 1000,
VERSION = "1.0.0",
}
function CustomPlugin:access(conf)
-- Ihre benutzerdefinierte Logik hier
kong.log.debug("Hallo vom CustomPlugin!")
local headers = kong.request.get_headers()
if not headers["x-api-key"] then
return kong.response.exit(401, { message = "Fehlender API-Schlüssel" })
end
end
return CustomPlugin
Dieses einfache Plugin überprüft das Vorhandensein eines API-Schlüssels und gibt eine 401 zurück, wenn er fehlt. Die Möglichkeiten sind endlos – Sie könnten benutzerdefinierte Authentifizierung, komplexe Transformationen oder sogar die Integration mit externen Diensten implementieren.
Sicherheits-Best-Practices: Paranoia als Dienstleistung
In der Welt der APIs ist Sicherheit nicht nur wichtig – sie ist entscheidend. Lassen Sie uns einige fortgeschrittene Sicherheitsmuster erkunden, die Sie mit Envoy und Kong implementieren können.
mTLS: Weil Vertrauensprobleme in der Technik gesund sind
Mutual TLS (mTLS) stellt sicher, dass sowohl der Client als auch der Server die Zertifikate des jeweils anderen überprüfen. So könnten Sie mTLS in Envoy konfigurieren:
listeners:
- address:
socket_address:
address: 0.0.0.0
port_value: 8443
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
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
require_client_certificate: true
common_tls_context:
tls_certificates:
- certificate_chain:
filename: "/etc/envoy/certs/server.crt"
private_key:
filename: "/etc/envoy/certs/server.key"
validation_context:
trusted_ca:
filename: "/etc/envoy/certs/ca.crt"
JWT-Verifizierung: Wer geht da?
JSON Web Tokens (JWTs) sind eine beliebte Methode für Authentifizierung und Autorisierung. Kongs jwt-Plugin macht es einfach, JWTs zu überprüfen:
curl -X POST http://localhost:8001/routes/{route_id}/plugins \
--data "name=jwt" \
--data "config.secret_is_base64=false" \
--data "config.claims_to_verify=exp"
Diese Konfiguration aktiviert die JWT-Verifizierung auf einer bestimmten Route und überprüft den Ablaufanspruch des Tokens.
Zero-Trust-Architektur: Vertraue niemandem, nicht einmal dir selbst
Die Implementierung einer Zero-Trust-Architektur mit API-Gateways umfasst mehrere Komponenten:
- Identitätsbasierter Zugriff: Verwenden Sie eine starke Authentifizierung für jede Anfrage.
- Mikrosegmentierung: Implementieren Sie feingranulare Zugriffskontrollen auf Dienstebene.
- Kontinuierliche Überwachung: Nutzen Sie die Protokollierungs- und Überwachungsfunktionen von Envoy und Kong, um Anomalien zu erkennen.
Hier ist ein Beispiel, wie Sie identitätsbasierten Zugriff mit Kongs key-auth-Plugin in Kombination mit ACL implementieren könnten:
# Schlüssel-Authentifizierung aktivieren
curl -X POST http://localhost:8001/routes/{route_id}/plugins \
--data "name=key-auth"
# Einen Verbraucher erstellen
curl -X POST http://localhost:8001/consumers \
--data "username=alice"
# Einen Schlüssel für den Verbraucher erstellen
curl -X POST http://localhost:8001/consumers/alice/key-auth \
--data "key=secret_key_123"
# ACL-Plugin aktivieren
curl -X POST http://localhost:8001/routes/{route_id}/plugins \
--data "name=acl" \
--data "config.whitelist=group_a"
# Den Verbraucher einer Gruppe zuweisen
curl -X POST http://localhost:8001/consumers/alice/acls \
--data "group=group_a"
Diese Einrichtung stellt sicher, dass nur authentifizierte Benutzer mit der richtigen Gruppenmitgliedschaft auf die geschützte Route zugreifen können.
Debugging und Leistungsoptimierung: Wenn die Dinge schiefgehen
Selbst mit den besten Plänen können Dinge schiefgehen. Lassen Sie uns einige Strategien zum Debuggen und Optimieren Ihrer API-Gateway-Einrichtung betrachten.
Protokollierung wie ein Profi
Sowohl Envoy als auch Kong bieten umfangreiche Protokollierungsfunktionen. So könnten Sie detaillierte Zugriffsprotokolle in Envoy konfigurieren:
static_resources:
listeners:
- address:
socket_address:
address: 0.0.0.0
port_value: 8080
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
access_log:
- name: envoy.access_loggers.file
typed_config:
"@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
path: "/var/log/envoy/access.log"
log_format:
json_format:
time: "%START_TIME%"
protocol: "%PROTOCOL%"
duration: "%DURATION%"
request_method: "%REQ(:METHOD)%"
request_host: "%REQ(HOST)%"
path: "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%"
response_code: "%RESPONSE_CODE%"
response_flags: "%RESPONSE_FLAGS%"
bytes_received: "%BYTES_RECEIVED%"
bytes_sent: "%BYTES_SENT%"
upstream_host: "%UPSTREAM_HOST%"
upstream_cluster: "%UPSTREAM_CLUSTER%"
upstream_local_address: "%UPSTREAM_LOCAL_ADDRESS%"
Diese Konfiguration richtet detaillierte, JSON-formatierte Zugriffsprotokolle ein, die für Debugging und Leistungsanalyse von unschätzbarem Wert sein können.
Leistungsoptimierung: Jeden letzten Tropfen herausquetschen
Bei der Leistungsoptimierung gibt es mehrere Bereiche, auf die Sie sich konzentrieren sollten:
- Verbindungspooling: Konfigurieren Sie Verbindungspools richtig, um das Gleichgewicht zwischen Ressourcennutzung und Leistung zu halten.
- Caching: Implementieren Sie Caching auf Gateway-Ebene, um die Belastung der Backend-Dienste zu reduzieren.
- Timeout- und Wiederholungsrichtlinien: Optimieren Sie diese Einstellungen, um das Gleichgewicht zwischen Resilienz und Reaktionsfähigkeit zu halten.
Hier ist ein Beispiel, wie Sie Verbindungspooling in Envoy konfigurieren könnten:
clusters:
- name: my_backend_service
type: STRICT_DNS
connect_timeout: 0.25s
lb_policy: ROUND_ROBIN
http2_protocol_options: {}
upstream_connection_options:
tcp_keepalive:
keepalive_time: 300
max_requests_per_connection: 1000
circuit_breakers:
thresholds:
- priority: DEFAULT
max_connections: 100
max_pending_requests: 1000
max_requests: 1000
health_checks:
- timeout: 1s
interval: 10s
unhealthy_threshold: 3
healthy_threshold: 2
http_health_check:
path: "/healthz"
Diese Konfiguration richtet Verbindungspooling mit Keep-Alive ein, begrenzt die Anzahl der Anfragen pro Verbindung, konfiguriert Circuit Breaker und richtet Gesundheitsprüfungen für den Backend-Dienst ein.
Zusammenfassung: Das Tor zum API-Nirvana
Wir haben die fortgeschrittenen Bereiche der API-Gateway-Muster mit Envoy und Kong durchquert und alles von ausgeklügeltem Verkehrsmanagement bis hin zu eisenharten Sicherheitspraktiken erkundet. Denken Sie daran, mit großer Macht kommt große Verantwortung – und auch das Potenzial für einige wirklich coole API-Setups.
Wenn Sie diese Muster implementieren, denken Sie daran, dass jedes System einzigartig ist. Was für das eine funktioniert, muss nicht unbedingt für das andere funktionieren. Testen, messen und iterieren Sie immer. Und vor allem, haben Sie Spaß! Schließlich, wenn Sie keinen Spaß daran haben, Ihre API-Infrastruktur aufzubauen, machen Sie wahrscheinlich etwas falsch.
Gehen Sie nun hinaus und erobern Sie das API-Universum, bewaffnet mit Ihrem neu erworbenen Wissen über fortgeschrittene Gateway-Muster. Mögen Ihre Anfragen schnell, Ihre Sicherheit straff und Ihre Dienste immer verfügbar sein!
"Der einzige Weg, großartige Arbeit zu leisten, ist, zu lieben, was man tut." - Steve Jobs
(Und natürlich ein wirklich großartiges API-Gateway-Setup zu haben.)