Erweiterbarkeit der Datenebene mit EnvoyFilter
Mit der EnvoyFilter API können Sie die Funktionen der Datenebene in Cloud Service Mesh erweitern, die sonst mit anderen Istio APIs nicht erreicht werden können. Mit der EnvoyFilter API können Sie die Envoy-Konfiguration anpassen, die aus anderen Richtlinien generiert wird, die auf die Arbeitslasten angewendet werden, z. B. durch Hinzufügen von Filtern zur HTTP-Filterkette.
Was Sie bedenken sollten
- Beachten Sie, dass die API-Oberfläche an interne Implementierungsdetails gebunden ist. Daher ist bei der Verwendung dieses Features besondere Vorsicht geboten, da falsche Konfigurationen das Mesh destabilisieren können. Verwenden Sie die
EnvoyFilterAPI nur, wenn andere Istio APIs nicht Ihren Anforderungen entsprechen. - Die
EnvoyFilterAPI wird mit bestimmten Einschränkungen unterstützt, welche Felder und Erweiterungen aus Gründen der Zuverlässigkeit und des Supports verwendet werden dürfen. Eine vollständige Liste der unterstützten Features in derEnvoyFilterAPI finden Sie unter Unterstützte Features mit Istio APIs (verwaltete Steuerungsebene). - Der Support von Google beschränkt sich auf die Weitergabe der vom Nutzer bereitgestellten Konfiguration an die Arbeitslasten mit Envoy-Sidecars und erstreckt sich nicht auf die Richtigkeit der Konfiguration, die über erweiterungsspezifische APIs angegeben wird.
Unterstützte API-Felder
Die EnvoyFilter API wird mit der TRAFFIC_DIRECTOR-Implementierung der Steuerungsebene nur mit eingeschränktem Support unterstützt:
targetRefs: Nicht unterstütztconfigPatches[].applyTo: NurHTTP_FILTERwird unterstütztconfigPatches[].patch.operation: NurINSERT_FIRSTundINSERT_BEFOREwerden unterstützt, wenn sie mit dem Routenfilter verwendet werden.configPatches[].patch.value.type_url: Weitere Informationen finden Sie unter Unterstützte Erweiterungen.configPatches[].patch.filterClass: Nicht unterstütztconfigPatches[].match.proxy: Nicht unterstütztconfigPatches[].match.routeConfiguration: Nicht unterstütztconfigPatches[].match.cluster: Nicht unterstützt- Die folgenden Felder werden nur für den Vorgang
INSERT_BEFOREunterstützt:configPatches[].match.listener: Nurfilterwird unterstützt.configPatches[].match.listener.filter.name: Nurenvoy.filters.network.http_connection_managerwird unterstützt.configPatches[].match.listener.filter.subFilter.name: Nurenvoy.filters.http.routerwird unterstützt.
Unterstützte Erweiterungen
Im Folgenden finden Sie eine Liste der unterstützten Erweiterungen und der unterstützten API-Felder für die verschiedenen Release-Versionen. Die API-Definition und ihre Semantik finden Sie in der offiziellen Envoy-Dokumentation.
type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit
| Feld | Rapid | Regulär | Stabil |
|---|---|---|---|
stat_prefix |
|||
status |
|||
token_bucket |
|||
filter_enabled |
|||
filter_enforced |
|||
response_headers_to_add |
|||
request_headers_to_add_when_not_enforced |
|||
local_rate_limit_per_downstream_connection |
|||
enable_x_ratelimit_headers |
type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb
| Feld | Rapid | Regulär | Stabil |
|---|---|---|---|
| (Keine Felder) |
type.googleapis.com/envoy.extensions.filters.http.compressor.v3.Compressor
| Feld | Rapid | Regulär | Stabil |
|---|---|---|---|
compressor_library |
|||
choose_first |
|||
response_direction_config.common_config.min_content_length |
|||
response_direction_config.common_config.content_type |
|||
response_direction_config.common_config.enabled |
|||
response_direction_config.disable_on_etag_header |
|||
response_direction_config.remove_accept_encoding_header |
|||
response_direction_config.uncompressible_response_codes |
|||
request_direction_config.common_config.min_content_length |
|||
request_direction_config.common_config.content_type |
|||
request_direction_config.common_config.enabled |
Informationen zum Aktualisieren Ihrer EnvoyFilter-Kompressorkonfiguration, damit sie vollständig unterstützt wird, finden Sie unter EnvoyFilter-Kompressorkonfigurationen modernisieren.
type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
| Feld | Rapid | Regulär | Stabil |
|---|---|---|---|
stat_prefix |
|||
default_source_code.inline_string† |
† Wichtige Überlegungen und Einschränkungen für Inline-Lua-Skripts:
- Aus Sicherheits- und Stabilitätsgründen ist nur ein Teil der Lua-Features und Envoy-Lua-Wrapper zulässig. Wenn Sie nicht unterstützte Funktionen verwenden oder die dokumentierten Limits in einem bestimmten Patch überschreiten, wird dieser Patch verworfen und nicht verarbeitet. Wenn alle Patches innerhalb der
EnvoyFilternicht unterstützte Features verwenden oder Limits überschreiten, wird die gesamteEnvoyFilter-Ressource abgelehnt. - Komplexe Lua-Skripts können die Leistung beeinträchtigen. Testen Sie die Ressourcennutzung Ihrer Skripts gründlich.
Nicht unterstützte Lua-Funktionen:
Die folgenden Lua-Funktionen und von Envoy bereitgestellten Lua-Wrapper werden nicht unterstützt:
- Envoy-Wrapper:
httpCallfilterContext
- Lua-Standardbibliothek:
- Basic-Paket:
collectgarbage,dofile,getmetatable,loadfile,rawset,setfenv,setmetatable - Module:
module - Betriebssystempaket:
execute,remove,rename,setlocale - E/A- und Debugging-Bibliotheken:
io,debug
- Basic-Paket:
- LuaJIT-Erweiterungen:
ffi,jit
Script Size and Count Limits:
- Größe einzelner Skripts: Ein einzelnes Lua-Inline-Skript in
default_source_code.inline_stringdarf 50 KB nicht überschreiten. - Gesamte Skriptgröße: Die Gesamtgröße aller Lua-Skripts für alle EnvoyFilter-Ressourcen innerhalb eines einzelnen Clusters darf 100 KB nicht überschreiten.
- Patch-Anzahl: Die Gesamtzahl der Lua-EnvoyFilter-
configPatchesfür alle EnvoyFilter-Ressourcen innerhalb eines einzelnen Clusters ist auf 10 begrenzt.
Konfigurations-Patch-Bewertung und teilweise Verarbeitung
Wenn Sie eine EnvoyFilter-Ressource mit mehreren configPatches konfigurieren, wertet Cloud Service Mesh jeden Patch unabhängig aus.
- Teilweise gültige Konfigurationen: Wenn Ihre
EnvoyFilter-Ressource sowohl gültige Patches als auch Patches mit nicht unterstützten Feldern oder Fehlern enthält, wird die gesamte Ressource akzeptiert. Cloud Service Mesh verwirft die nicht unterstützten oder ungültigen Patches und verarbeitet nur die gültigen. In diesem Fall wird für die Ressource der StatusbedingungWarningangezeigt, in der die nicht unterstützten Felder aufgeführt sind, die dazu geführt haben, dass einige Patches verworfen wurden. - Vollständig ungültige Konfigurationen: Wenn keine der
configPatchesin derEnvoyFiltergültig ist, wird die gesamte Ressource mit einem Fehler abgelehnt.
Verwendungsbeispiel
In dieser Anleitung erfahren Sie, wie Sie die integrierte lokale Ratenbegrenzung von Envoy verwenden, um den Traffic zu einem Dienst mithilfe der EnvoyFilter API dynamisch zu begrenzen.
Kosten
In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloudverwendet:
Nach Abschluss dieser Anleitung können Sie weitere Kosten vermeiden, wenn Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.
Hinweis
- Prüfen Sie, ob für Ihr Projekt die Abrechnung aktiviert ist.
- Cloud Service Mesh auf einem GKE-Cluster bereitstellen
Klonen Sie das Repository:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples cd anthos-service-mesh-samples
Ingress-Gateway bereitstellen
Legen Sie den aktuellen Kontext für
kubectlauf den Cluster fest:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATIONErstellen Sie einen Namespace für Ihr Ingress-Gateway:
kubectl create namespace asm-ingressAktivieren Sie den Namespace für die Injektion. Die Schritte hängen von Ihrer Implementierung der Steuerungsebene ab.
Wenden Sie das Standard-Einschleusungslabel auf den Namespace an.
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwriteStellen Sie das Beispiel-Gateway im Repository
anthos-service-mesh-samplesbereit:kubectl apply -n asm-ingress \ -f docs/shared/asm-ingress-gatewayErwartete Ausgabe:
serviceaccount/asm-ingressgateway configured service/asm-ingressgateway configured deployment.apps/asm-ingressgateway configured gateway.networking.istio.io/asm-ingressgateway configured
Beispielanwendung für Online-Boutique bereitstellen
Falls nicht, legen Sie den aktuellen Kontext für
kubectlauf den Cluster fest:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATIONErstellen Sie den Namespace für die Beispielanwendung:
kubectl create namespace onlineboutiqueFügen Sie dem Namespace
onlineboutiqueein Label hinzu, um Envoy-Proxys automatisch einzufügen:kubectl label namespace onlineboutique \ istio.io/rev- istio-injection=enabled --overwriteStellen Sie die Beispielanwendung, den
VirtualServicefür das Frontend und Dienstkonten für die Arbeitslasten bereit. Im Rahmen dieser Anleitung stellen Sie die Mikrodienst-Demo-Anwendung „Online Boutique“ bereit.kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/virtual-service.yamlkubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/service-accounts
Dienste ansehen
Rufen Sie die Pods im Namespace
onlineboutiqueauf:kubectl get pods -n onlineboutiqueErwartete Ausgabe:
NAME READY STATUS RESTARTS AGE adservice-85598d856b-m84m6 2/2 Running 0 2m7s cartservice-c77f6b866-m67vd 2/2 Running 0 2m8s checkoutservice-654c47f4b6-hqtqr 2/2 Running 0 2m10s currencyservice-59bc889674-jhk8z 2/2 Running 0 2m8s emailservice-5b9fff7cb8-8nqwz 2/2 Running 0 2m10s frontend-77b88cc7cb-mr4rp 2/2 Running 0 2m9s loadgenerator-6958f5bc8b-55q7w 2/2 Running 0 2m8s paymentservice-68dd9755bb-2jmb7 2/2 Running 0 2m9s productcatalogservice-84f95c95ff-c5kl6 2/2 Running 0 114s recommendationservice-64dc9dfbc8-xfs2t 2/2 Running 0 2m9s redis-cart-5b569cd47-cc2qd 2/2 Running 0 2m7s shippingservice-5488d5b6cb-lfhtt 2/2 Running 0 2m7sAlle Pods für Ihre Anwendung sollten mit dem Wert
2/2in der SpalteREADYausgeführt werden. Dieser Wert weist darauf hin, dass die Pods einen Envoy-Sidecar-Proxy erfolgreich eingefügt haben. Wenn nach einigen Minuten nicht2/2angezeigt wird, lesen Sie die Anleitung zur Fehlerbehebung.Rufen Sie die externe IP-Adresse ab und legen Sie sie auf eine Variable fest:
kubectl get services -n asm-ingress export FRONTEND_IP=$(kubectl --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \ )Die Ausgabe sollte in etwa so aussehen:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE asm-ingressgateway LoadBalancer 10.19.247.233 35.239.7.64 80:31380/TCP,443:31390/TCP,31400:31400/TCP 27mRufen Sie in Ihrem Webbrowser die Adresse
EXTERNAL-IPauf. Sie sollten den Online Boutique-Shop in Ihrem Browser sehen.
Ratenbegrenzungskonfiguration anwenden
In diesem Abschnitt wird eine EnvoyFilter-Ressource angewendet, um den gesamten Traffic zum frontend-Dienst auf 5 Anfragen/Minute zu beschränken.
Wenden Sie die benutzerdefinierte Ressource auf den
frontend-Dienst an:kubectl apply -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: frontend-local-ratelimit namespace: onlineboutique spec: workloadSelector: labels: app: frontend configPatches: - applyTo: HTTP_FILTER match: context: SIDECAR_INBOUND listener: filterChain: filter: name: "envoy.filters.network.http_connection_manager" subFilter: name: "envoy.filters.http.router" patch: operation: INSERT_BEFORE value: name: envoy.filters.http.local_ratelimit typed_config: "@type": type.googleapis.com/udpa.type.v1.TypedStruct type_url: type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit value: stat_prefix: http_local_rate_limiter token_bucket: max_tokens: 5 tokens_per_fill: 5 fill_interval: 60s filter_enabled: runtime_key: local_rate_limit_enabled default_value: numerator: 100 denominator: HUNDRED filter_enforced: runtime_key: local_rate_limit_enforced default_value: numerator: 100 denominator: HUNDRED EOFErwartete Ausgabe:
envoyfilter.networking.istio.io/frontend-local-ratelimit createdPrüfen Sie, ob der CR-Status Fehler meldet:
kubectl get envoyfilter -n onlineboutique frontend-local-ratelimit -o yamlErwartete Ausgabe:
... status: conditions: - lastTransitionTime: "2025-06-30T14:29:25.467017594Z" message: This resource has been accepted. This does not mean it has been propagated to all proxies yet reason: Accepted status: "True" type: AcceptedEntfernen Sie das Deployment
loadgenerator, da es den Dienst mehrmals aufruft und dadurch Tokens verbraucht:kubectl delete -n onlineboutique deployment loadgeneratorErwartete Ausgabe:
deployment.apps/loadgenerator deletedPrüfen Sie mit
curl, ob innerhalb von 60 Sekunden nicht mehr als 5 Anfragen zulässig sind. Der Code429gibt an, dass die Ratenbegrenzung erzwungen wird.for i in {1..10}; do curl -s http://${FRONTEND_IP} -o /dev/null -w "%{http_code}\n"; sleep 1; doneErwartete Ausgabe:
200 200 200 200 200 429 429 429 429 429
Bereinigen
Damit Ihrem Google Cloud -Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, können Sie entweder das Projekt löschen oder die einzelnen Ressourcen entfernen.
Projekt löschen
Löschen Sie das Projekt in Cloud Shell:
gcloud projects delete PROJECT_ID
Ressourcen löschen
Wenn Sie den Cluster behalten und das Online Boutique-Beispiel entfernen möchten:
Löschen Sie die Anwendungs-Namespaces:
kubectl delete namespace onlineboutiqueErwartete Ausgabe:
namespace "onlineboutique" deletedLöschen Sie den Ingress-Gateway-Namespace:
kubectl delete namespace asm-ingressErwartete Ausgabe:
namespace "asm-ingress" deleted
Wenn Sie zusätzliche Gebühren vermeiden möchten, löschen Sie den Cluster:
gcloud container clusters delete CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Fehlerbehebung
Weitere Informationen finden Sie unter Probleme mit der Erweiterbarkeit der Datenebene beheben.