Estensibilità del piano dati con EnvoyFilter
Puoi utilizzare l'API EnvoyFilter per estendere le funzionalità del data plane in
Cloud Service Mesh che altrimenti non sono realizzabili utilizzando altre
API Istio. Con l'API EnvoyFilter, puoi personalizzare la configurazione di Envoy generata da altre norme applicate ai carichi di lavoro, ad esempio aggiungendo filtri alla catena di filtri HTTP.
Considerazioni importanti
- Tieni presente che la superficie API è legata ai dettagli di implementazione interni, pertanto
è necessario prestare particolare attenzione quando si utilizza questa funzionalità, poiché configurazioni
errate potrebbero destabilizzare la mesh. Utilizza l'API
EnvoyFiltersolo se le altre API Istio non soddisfano le tue esigenze. - L'API
EnvoyFilterè supportata con limitazioni specifiche sui campi e sulle estensioni che possono essere utilizzate per motivi di affidabilità e supporto. Per un elenco esaustivo delle funzionalità supportate nell'APIEnvoyFilter, consulta Funzionalità supportate che utilizzano le API Istio (control plane gestito). - L'ambito dell'assistenza offerta da Google è limitato alla propagazione della configurazione fornita dall'utente ai workload con sidecar Envoy e non si estende alla correttezza della configurazione specificata utilizzando le API per estensione.
Campi API supportati
L'API EnvoyFilter è supportata con l'implementazione del control plane TRAFFIC_DIRECTOR solo con supporto limitato come segue:
targetRefs: non supportatoconfigPatches[].applyTo: è supportato soloHTTP_FILTERconfigPatches[].patch.operation: sono supportati soloINSERT_FIRSTeINSERT_BEFOREse utilizzati con il filtro percorso.configPatches[].patch.value.type_url: consulta la sezione Estensioni supportateconfigPatches[].patch.filterClass: non supportatoconfigPatches[].match.proxy: non supportatoconfigPatches[].match.routeConfiguration: non supportatoconfigPatches[].match.cluster: non supportato- I seguenti campi sono supportati solo per l'operazione
INSERT_BEFORE:configPatches[].match.listener: è supportato solofilter.configPatches[].match.listener.filter.name: è supportato soloenvoy.filters.network.http_connection_manager.configPatches[].match.listener.filter.subFilter.name: è supportato soloenvoy.filters.http.router.
Estensioni supportate
Di seguito è riportato l'elenco delle estensioni supportate insieme ai relativi campi API supportati nei vari canali di rilascio. La definizione dell'API e la relativa semantica sono disponibili nella documentazione ufficiale di Envoy.
type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit
| Campo | Rapido | Normale | Stabile |
|---|---|---|---|
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
| Campo | Rapido | Normale | Stabile |
|---|---|---|---|
| (Nessun campo) |
Esempi di utilizzo
In questo tutorial imparerai a utilizzare la limitazione di frequenza locale integrata di Envoy
per limitare dinamicamente il traffico a un servizio utilizzando l'API EnvoyFilter.
Costi
Questo tutorial utilizza i seguenti componenti fatturabili di Google Cloud:
Al termine di questo tutorial, puoi evitare l'addebito di costi ricorrenti eliminando le risorse create. Per ulteriori informazioni, consulta Esegui la pulizia.
Prima di iniziare
- Assicurati che la fatturazione sia attivata per il tuo progetto.
- Esegui il provisioning di Cloud Service Mesh su un cluster GKE.
Clona il repository:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples cd anthos-service-mesh-samples
Esegui il deployment di un gateway in entrata
Imposta il contesto attuale per
kubectlsul cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATIONCrea uno spazio dei nomi per il gateway in entrata:
kubectl create namespace asm-ingressAbilita lo spazio dei nomi per l'inserimento. I passaggi dipendono dall'implementazione del control plane.
Applica l'etichetta di inserimento predefinita allo spazio dei nomi:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwriteEsegui il deployment del gateway di esempio nel repository
anthos-service-mesh-samples:kubectl apply -n asm-ingress \ -f docs/shared/asm-ingress-gatewayOutput previsto:
serviceaccount/asm-ingressgateway configured service/asm-ingressgateway configured deployment.apps/asm-ingressgateway configured gateway.networking.istio.io/asm-ingressgateway configured
Deployment dell'applicazione di esempio Online Boutique
Se non l'hai ancora fatto, imposta il contesto attuale per
kubectlsul cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATIONCrea lo spazio dei nomi per l'applicazione di esempio:
kubectl create namespace onlineboutiqueEtichetta lo spazio dei nomi
onlineboutiqueper inserire automaticamente i proxy Envoy:kubectl label namespace onlineboutique \ istio.io/rev- istio-injection=enabled --overwriteEsegui il deployment dell'app di esempio, di
VirtualServiceper il frontend e dei service account per i workload. Per questo tutorial, eseguirai il deployment di Online Boutique, un'app demo di microservizi.kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/virtual-service.yamlkubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/service-accounts
Visualizzare i tuoi servizi
Visualizza i pod nello spazio dei nomi
onlineboutique:kubectl get pods -n onlineboutiqueOutput previsto:
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 2m7sTutti i pod per la tua applicazione devono essere in esecuzione, con un
2/2nella colonnaREADY. Ciò indica che i pod hanno un proxy sidecar Envoy inserito correttamente. Se dopo un paio di minuti non viene visualizzato2/2, consulta la Guida alla risoluzione dei problemi.Ottieni l'IP esterno e impostalo su una variabile:
kubectl get services -n asm-ingress export FRONTEND_IP=$(kubectl --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \ )Vedrai un output simile al seguente:
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 27mVisita l'indirizzo
EXTERNAL-IPnel browser web. Dovresti vedere il negozio Online Boutique nel browser.
Applica configurazione limite di frequenza
Questa sezione applica una risorsa EnvoyFilter per limitare tutto il traffico al servizio
frontend a 5 richieste/minuto.
Applica la CR al servizio
frontend: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 EOFOutput previsto:
envoyfilter.networking.istio.io/frontend-local-ratelimit createdVerifica che lo stato di CR non segnali errori:
kubectl get envoyfilter -n onlineboutique frontend-local-ratelimit -o yamlOutput previsto:
... 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: AcceptedRimuovi il deployment
loadgeneratorperché chiama il servizio più volte, consumando token:kubectl delete -n onlineboutique deployment loadgeneratorOutput previsto:
deployment.apps/loadgenerator deletedUtilizzando
curl, verifica che non siano consentite più di 5 richieste in 60 secondi. Il codice429indica che viene applicata la limitazione di frequenza.for i in {1..10}; do curl -s http://${FRONTEND_IP} -o /dev/null -w "%{http_code}\n"; sleep 1; doneOutput previsto:
200 200 200 200 200 429 429 429 429 429
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi continui per le risorse utilizzate in questo tutorial, puoi eliminare il progetto o le singole risorse.
Elimina il progetto
In Cloud Shell, elimina il progetto:
gcloud projects delete PROJECT_ID
Elimina le risorse
Se vuoi conservare il cluster e rimuovere l'esempio Online Boutique:
Elimina gli spazi dei nomi dell'applicazione:
kubectl delete namespace onlineboutiqueOutput previsto:
namespace "onlineboutique" deletedElimina lo spazio dei nomi del gateway in entrata:
kubectl delete namespace asm-ingressOutput previsto:
namespace "asm-ingress" deleted
Se vuoi evitare addebiti aggiuntivi, elimina il cluster:
gcloud container clusters delete CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Risoluzione dei problemi
Consulta Risolvere i problemi di estensibilità del data plane.