Extensibilidade do plano de dados com EnvoyFilter
É possível usar a API EnvoyFilter para estender os recursos do plano de dados no Cloud Service Mesh que não podem ser alcançados usando outras APIs do Istio. Com a API EnvoyFilter, é possível personalizar a configuração do Envoy gerada por outras políticas aplicadas às cargas de trabalho, como adicionar filtros à cadeia de filtros HTTP.
Considerações importantes
- A superfície da API está vinculada a detalhes de implementação internos. Portanto, é preciso ter cuidado ao usar esse recurso, já que configurações incorretas podem desestabilizar a malha. Use a API
EnvoyFiltersomente se outras APIs do Istio não atenderem às suas necessidades. - A API
EnvoyFilteré compatível com restrições específicas sobre quais campos e extensões podem ser usados para fins de confiabilidade e capacidade de suporte. Para uma lista completa de recursos compatíveis com a APIEnvoyFilter, consulte Recursos compatíveis com as APIs do Istio (plano de controle gerenciado). - O escopo do suporte oferecido pelo Google se limita à propagação da configuração fornecida pelo usuário para as cargas de trabalho com sidecars do Envoy e não se estende à correção da configuração especificada usando APIs por extensão.
Campos da API compatíveis
A API EnvoyFilter é compatível com a implementação do plano de controle TRAFFIC_DIRECTOR apenas com suporte limitado da seguinte maneira:
targetRefs: indisponívelconfigPatches[].applyTo: apenasHTTP_FILTERé compatívelconfigPatches[].patch.operation: somenteINSERT_FIRSTeINSERT_BEFOREsão compatíveis quando usados com o filtro de rota.configPatches[].patch.value.type_url: consulte Extensões compatíveisconfigPatches[].patch.filterClass: indisponívelconfigPatches[].match.proxy: indisponívelconfigPatches[].match.routeConfiguration: indisponívelconfigPatches[].match.cluster: indisponível- Os campos a seguir são aceitos apenas para a operação
INSERT_BEFORE:configPatches[].match.listener: apenasfilteré aceito.configPatches[].match.listener.filter.name: apenasenvoy.filters.network.http_connection_manageré aceito.configPatches[].match.listener.filter.subFilter.name: apenasenvoy.filters.http.routeré aceito.
Extensões compatíveis
A seguir, confira a lista de extensões compatíveis e os campos de API compatíveis em vários canais de lançamento. A definição da API e a semântica dela podem ser encontradas na documentação oficial do Envoy.
type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit
| Campo | Rápido | Normal | Estável |
|---|---|---|---|
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 | Rápido | Normal | Estável |
|---|---|---|---|
| (Nenhum campo) |
Exemplo de uso
Neste tutorial, você vai aprender a usar a limitação de taxa local integrada do Envoy
para limitar dinamicamente o tráfego a um serviço usando a API EnvoyFilter.
Custos
Neste tutorial, usamos os seguintes componentes faturáveis do Google Cloud:
Ao concluir este tutorial, exclua os recursos criados para evitar custos contínuos. Para mais informações, consulte Limpeza.
Antes de começar
- Verifique se o faturamento está ativado no projeto.
- Provisione o Cloud Service Mesh em um cluster do GKE.
Clone o repositório:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples cd anthos-service-mesh-samples
Implantar um gateway de entrada
Defina o contexto atual de
kubectlpara o cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATIONCrie um namespace para seu gateway de entrada:
kubectl create namespace asm-ingressAtivar o namespace para injeção. As etapas dependem da sua implementação do plano de controle.
Aplique o rótulo de injeção padrão ao namespace:
kubectl label namespace asm-ingress \ istio.io/rev- istio-injection=enabled --overwriteImplante o gateway de exemplo no repositório
anthos-service-mesh-samples:kubectl apply -n asm-ingress \ -f docs/shared/asm-ingress-gatewaySaída esperada:
serviceaccount/asm-ingressgateway configured service/asm-ingressgateway configured deployment.apps/asm-ingressgateway configured gateway.networking.istio.io/asm-ingressgateway configured
Implantar o aplicativo de amostra Online Boutique
Caso contrário, defina o contexto atual de
kubectlpara o cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATIONCrie o namespace do aplicativo de amostra:
kubectl create namespace onlineboutiqueRotule o namespace
onlineboutiquepara injetar automaticamente proxies do Envoy:kubectl label namespace onlineboutique \ istio.io/rev- istio-injection=enabled --overwriteImplante o aplicativo de amostra, o
VirtualServicepara o front-end e as contas de serviço para as cargas de trabalho. Neste tutorial, você vai implantar o Online Boutique, um app de demonstração de microsserviços.kubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/virtual-service.yamlkubectl apply \ -n onlineboutique \ -f docs/shared/online-boutique/service-accounts
Ver seus serviços
Veja os pods no namespace
onlineboutique:kubectl get pods -n onlineboutiqueSaída esperada:
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 2m7sTodos os pods do aplicativo devem estar em execução, com um
2/2na colunaREADY. Isso indica que os pods têm um proxy sidecar do Envoy injetado com sucesso. Se ele não mostrar2/2após alguns minutos, acesse o Guia de solução de problemas.Defina o IP externo e uma variável:
kubectl get services -n asm-ingress export FRONTEND_IP=$(kubectl --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \ )Você verá uma saída semelhante a esta:
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 27mAcesse o endereço
EXTERNAL-IPno navegador da Web. Você verá a loja Online Boutique no seu navegador.
Aplicar configuração de limitação de taxa
Esta seção aplica um recurso EnvoyFilter para limitar todo o tráfego ao serviço
frontend a 5 solicitações/min.
Aplique o CR ao serviço
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 EOFSaída esperada:
envoyfilter.networking.istio.io/frontend-local-ratelimit createdVerifique se o status do CR não informa erros:
kubectl get envoyfilter -n onlineboutique frontend-local-ratelimit -o yamlSaída esperada:
... 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: AcceptedRemova a implantação
loadgenerator, porque ela chama o serviço várias vezes, o que consome tokens:kubectl delete -n onlineboutique deployment loadgeneratorSaída esperada:
deployment.apps/loadgenerator deletedUsando
curl, verifique se não são permitidas mais de cinco solicitações em 60 segundos. O código429indica que a limitação de taxa está sendo aplicada.for i in {1..10}; do curl -s http://${FRONTEND_IP} -o /dev/null -w "%{http_code}\n"; sleep 1; doneSaída esperada:
200 200 200 200 200 429 429 429 429 429
Limpar
Para evitar cobranças recorrentes na sua conta do Google Cloud pelos recursos usados neste tutorial, é possível excluir o projeto ou excluir os recursos individuais.
Excluir o projeto
No Cloud Shell, exclua o projeto:
gcloud projects delete PROJECT_ID
Excluir os recursos
Se quiser manter o cluster e remover o aplicativo de amostra do Online Boutique:
Exclua os namespaces do aplicativo:
kubectl delete namespace onlineboutiqueSaída esperada:
namespace "onlineboutique" deletedExclua o namespace do gateway de entrada:
kubectl delete namespace asm-ingressSaída esperada:
namespace "asm-ingress" deleted
Se quiser evitar cobranças adicionais, exclua o cluster:
gcloud container clusters delete CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Solução de problemas
Consulte Como resolver problemas de extensibilidade do plano de dados.