Erweiterbarkeit der Datenebene mit EnvoyFilter
Mit der EnvoyFilter API können Sie die Funktionen der Datenebene in Cloud Service Mesh erweitern, was mit anderen Istio APIs nicht möglich ist. Mit der EnvoyFilter API können Sie die Envoy-Konfiguration anpassen, die aus anderen Richtlinien generiert wird, die auf die Arbeitslasten angewendet werden. So können Sie beispielsweise der HTTP-Filterkette Filter hinzufügen.
Was Sie bedenken sollten
- Beachten Sie, dass die API-Oberfläche an interne Implementierungsdetails gebunden ist. Daher ist bei der Verwendung dieser Funktion 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 Zuverlässigkeits- und Supportgründen verwendet werden können. Eine vollständige Liste der unterstützten Funktionen in derEnvoyFilterAPI finden Sie unter Unterstützte Funktionen mit Istio APIs (verwaltete Steuerungsebene). - Der von Google angebotene Support beschränkt sich auf die Weitergabe der vom Nutzer bereitgestellten Konfiguration an die Arbeitslasten mit Envoy-Sidecars und erstreckt sich nicht auf die Korrektheit der Konfiguration, die mit APIs pro Erweiterung angegeben wird.
Unterstützte API-Felder
Die EnvoyFilter API wird nur mit der TRAFFIC_DIRECTOR-Implementierung der Steuerungsebene 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 ErweiterungenconfigPatches[].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 sowie der unterstützten API Felder für die verschiedenen Release-Channels. 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) |
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 durch Löschen von erstellten Ressourcen vermeiden. Weitere Informationen finden Sie unter Bereinigen.
Hinweis
- Prüfen Sie, ob für Ihr Projekt die Abrechnung aktiviert ist.
- Stellen Sie Cloud Service Mesh auf einem GKE-Cluster bereit.
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
Wenn Sie es noch nicht getan haben, 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 onlineboutiqueLabeln Sie den Namespace
onlineboutique, 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-App "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 aufrufen
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 die Adresse
EXTERNAL-IPin Ihrem Webbrowser auf. Sie sollten den Online Boutique-Shop in Ihrem Browser sehen.
Konfiguration für Ratenbegrenzung anwenden
In diesem Abschnitt wird eine EnvoyFilter-Ressource angewendet, um den gesamten Traffic zum frontend-Dienst auf 5 Anfragen pro Minute zu begrenzen.
Wenden Sie die CR 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 die
loadgenerator-Bereitstellung, da der Dienst mehrmals aufgerufen wird und dadurch Tokens verbraucht werden:kubectl delete -n onlineboutique deployment loadgeneratorErwartete Ausgabe:
deployment.apps/loadgenerator deletedPrüfen Sie mit
curl, ob in 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 Namespace des Ingress-Gateways:
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.