Para proteger seus serviços contra picos de tráfego, sobrecargas, exaustão de recursos ou ataques maliciosos, configure a limitação de taxa local no centro de gerenciamento de tráfego. Esse recurso mantém o tráfego dentro de um limiar controlável, garantindo a disponibilidade do serviço e o desempenho estável. O proxy Envoy implementa a limitação de taxa local usando um algoritmo de token bucket para controlar a taxa de requisições aos seus serviços. Esse algoritmo adiciona tokens a um bucket em intervalos regulares. Cada requisição consome um token. Quando o bucket fica sem tokens, novas requisições são temporariamente rejeitadas, evitando que o serviço seja sobrecarregado.
Pré-requisitos
-
Uma instância ASM criada que atenda aos seguintes requisitos:
Para ASM Enterprise Edition (Professional ou Ultimate), a versão da instância deve ser 1.14.3 ou posterior. Para obter mais informações sobre como atualizar uma instância ASM, consulte Upgrade an ASM instance.
Para ASM Standard Edition, a versão da instância deve ser 1,9 ou posterior. Use apenas o método nativo do Istio para configurar a limitação de taxa local. A documentação varia conforme a versão do Istio. Para obter as informações mais recentes, consulte a documentação do Istio Enabling Rate Limits using Envoy.
A injeção automática de proxy sidecar está ativada para o namespace
defaultno cluster Kubernetes. Para obter mais informações, consulte Enable automatic sidecar proxy injection.Os serviços de exemplo httpbin e sleep estão implantados, e o serviço sleep consegue acessar o serviço httpbin. Para obter mais informações, consulte Deploy the httpbin application.
Cenário 1: Aplicar limitação de taxa a uma porta de serviço
Este cenário demonstra como aplicar a limitação de taxa local à porta 8000 do serviço httpbin. Após a configuração, a regra se aplica a todas as requisições enviadas para essa porta específica.
-
Crie uma regra de limitação de taxa local.
Faça login no console ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha . Na página exibida, clique em Create.
-
Na página Create, configure os parâmetros e clique em OK.
Seção
Parâmetro
Descrição
Basic Information About Throttling
Namespace
Namespace da carga de trabalho afetada pela limitação de taxa local. Neste exemplo, selecione default.
Name
Nome personalizado para a configuração de limitação de taxa local. Neste exemplo, insira httpbin.
Type of Effective Workload
Tipo de carga de trabalho ao qual a regra de limitação se aplica. Valores válidos: Application Service e Gateway. Neste exemplo, selecione Applicable Application.
Relevant Workload
Insira pares chave-valor de rótulo para selecionar uma carga de trabalho específica. Neste exemplo, defina Label Name como app e Label Value como httpbin.
List of Throttling Rules
Service Port
Número da porta declarado no Kubernetes Service do serviço. Deve ser uma porta HTTP. Neste exemplo, insira a porta HTTP 8000 do serviço httpbin.
Throttling Configuration
Especifique a janela de tempo e o número máximo de requisições permitidas nessa janela para o algoritmo de token bucket. Se o volume de requisições na janela de tempo exceder esse limite, as requisições subsequentes serão limitadas. Este exemplo usa a seguinte configuração:
-
Defina Time Window for Throttling Detection como 60s.
-
Defina Allowed requests in window como 10.
Essa configuração limita a carga de trabalho do serviço a, no máximo, 10 requisições em qualquer janela de 60 segundos.
O arquivo YAML a seguir exemplifica a configuração de limitação de taxa local.
-
-
Verifique a regra de limitação de taxa local.
-
Execute o comando a seguir para iniciar uma sessão bash no contêiner sleep:
kubectl exec -it deploy/sleep -- sh -
Execute o comando a seguir para enviar 10 requisições:
for i in $(seq 1 10); do curl -v http://httpbin:8000/headers; done -
Execute o comando a seguir para enviar uma 11ª requisição:
curl -v http://httpbin:8000/headersSaída esperada:
* Trying 172.16.245.130:8000... * Connected to httpbin (172.16.245.130) port 8000 > GET /headers HTTP/1.1 > Host: httpbin:8000 > User-Agent: curl/8.5.0 > Accept: */* > < HTTP/1.1 429 Too Many Requests < x-local-rate-limit: true < content-length: 18 < content-type: text/plain < date: Tue, 26 Dec 2023 08:02:58 GMT < server: envoy < x-envoy-upstream-service-time: 2A saída exibe o código de status HTTP 429, indicando que a requisição foi limitada.
-
Cenário 2: Aplicar limitação de taxa a um caminho de requisição
Este cenário demonstra como aplicar a limitação de taxa local a requisições enviadas para o caminho /headers na porta 8000 do serviço httpbin. Após a configuração, a regra se aplica apenas a requisições correspondentes a esse caminho e porta específicos.
-
Crie uma regra de limitação de taxa local.
Faça login no console ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha . Na página exibida, clique em Create.
-
Na página Create, configure os parâmetros e clique em OK.
Seção
Parâmetro
Descrição
Basic Information About Throttling
Namespace
Namespace da carga de trabalho afetada pela limitação de taxa local. Neste exemplo, selecione default.
Name
Nome personalizado para a configuração de limitação de taxa local. Neste exemplo, insira httpbin.
Type of Effective Workload
Tipo de carga de trabalho ao qual a regra de limitação se aplica. Valores válidos: Application Service e Gateway. Neste exemplo, selecione Applicable Application.
Relevant Workload
Insira pares chave-valor de rótulo para selecionar uma carga de trabalho específica. Neste exemplo, defina Label Name como app e Label Value como httpbin.
List of Throttling Rules
Service Port
Número da porta declarado no Kubernetes Service do serviço. Deve ser uma porta HTTP. Neste exemplo, insira a porta HTTP 8000 do serviço httpbin.
Match Request Attributes
Defina as condições de correspondência para requisições. A regra aplica-se apenas a requisições que atendam a essas condições. Este exemplo usa a seguinte configuração:
-
Defina Matched Attributes como Request Path.
-
Defina Matching Method como Prefix Match.
-
Defina Matched Content como
/headers.
Throttling Configuration
Especifique a janela de tempo e o número máximo de requisições permitidas nessa janela para o algoritmo de token bucket. Se o volume de requisições na janela de tempo exceder esse limite, as requisições subsequentes serão limitadas. Este exemplo usa a seguinte configuração:
-
Defina Time Window for Throttling Detection como 60s.
-
Defina Allowed requests in window como 10.
Essa configuração limita a carga de trabalho do serviço a, no máximo, 10 requisições em qualquer janela de 60 segundos.
-
-
Verifique a regra de limitação de taxa local.
-
Execute o comando a seguir para iniciar uma sessão bash no contêiner sleep:
kubectl exec -it deploy/sleep -- sh -
Execute o comando a seguir para enviar 10 requisições:
for i in $(seq 1 10); do curl -v http://httpbin:8000/headers; done -
Execute o comando a seguir para enviar uma 11ª requisição:
curl -v http://httpbin:8000/headersSaída esperada:
* Trying 172.16.245.130:8000... * Connected to httpbin (172.16.245.130) port 8000 > GET /headers HTTP/1.1 > Host: httpbin:8000 > User-Agent: curl/8.5.0 > Accept: */* > < HTTP/1.1 429 Too Many Requests < x-local-rate-limit: true < content-length: 18 < content-type: text/plain < date: Tue, 26 Dec 2023 08:02:58 GMT < server: envoy < x-envoy-upstream-service-time: 2A saída exibe o código de status HTTP 429, indicando que a requisição foi limitada.
-
Execute o comando a seguir para enviar uma requisição ao caminho
/getdo serviço httpbin:curl -v http://httpbin:8000/getSaída esperada:
* Trying 192.168.243.21:8000... * Connected to httpbin (192.168.243.21) port 8000 (#0) > GET /get HTTP/1.1 > Host: httpbin:8000 > User-Agent: curl/8.1.2 > Accept: */* > < HTTP/1.1 200 OK < server: envoy < date: Thu, 11 Jan 2024 03:46:11 GMT < content-type: application/json < content-length: 431 < access-control-allow-origin: * < access-control-allow-credentials: true < x-envoy-upstream-service-time: 1 < { "args": {}, "headers": { "Accept": "*/*", "Host": "httpbin:8000", "User-Agent": "curl/8.1.2", "X-Envoy-Attempt-Count": "1", "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/default/sa/httpbin;Hash=be10819991ba1a354a89e68b3bed1553c12a4fba8b65fbe0f16299d552680b29;Subject=\"\";URI=spiffe://cluster.local/ns/default/sa/sleep" }, "origin": "127.0.0.6", "url": "http://httpbin:8000/get" }A saída exibe o código de status 200 OK. Isso confirma que requisições para outros caminhos do serviço httpbin não são afetadas pela regra de limitação de taxa.
-
Operações relacionadas
Visualize métricas de limitação de taxa local
O recurso de limitação de taxa local gera as seguintes métricas:
|
Métrica |
Descrição |
|
envoy_http_local_rate_limiter_http_local_rate_limit_enabled |
Número total de requisições que acionaram o filtro de limitação de taxa. |
|
envoy_http_local_rate_limiter_http_local_rate_limit_ok |
Número total de requisições permitidas devido à disponibilidade de um token. |
|
envoy_http_local_rate_limiter_http_local_rate_limit_rate_limited |
Número total de requisições marcadas para limitação devido à indisponibilidade de um token. Isso não significa necessariamente que a requisição foi rejeitada. |
|
envoy_http_local_rate_limiter_http_local_rate_limit_enforced |
Número total de requisições efetivamente limitadas, por exemplo, com resposta 429. |
Configure a definição proxyStatsMatcher no proxy sidecar para relatar essas métricas. Em seguida, use o Prometheus para coletá-las e visualizá-las.
-
Configure o proxy sidecar para relatar métricas de limitação de taxa usando
proxyStatsMatcher.Ao configurar
proxyStatsMatcher, selecione Regular Expression Match e defina como.*http_local_rate_limit.*. Alternativamente, clique em Add Local Throttling Metrics. Para obter mais informações, consulte proxyStatsMatcher. Reimplante o serviço httpbin. Para obter mais informações, consulte Redeploy workloads.
Conclua a configuração de limitação de taxa local e envie requisições de teste conforme descrito em Scenario 1 ou Scenario 2.
-
Execute o comando a seguir para visualizar as métricas de limitação de taxa local do serviço httpbin:
kubectl exec -it deploy/httpbin -c istio-proxy -- curl localhost:15020/stats/prometheus|grep http_local_rate_limitSaída esperada:
envoy_http_local_rate_limiter_http_local_rate_limit_enabled{} 37 envoy_http_local_rate_limiter_http_local_rate_limit_enforced{} 17 envoy_http_local_rate_limiter_http_local_rate_limit_ok{} 20 envoy_http_local_rate_limiter_http_local_rate_limit_rate_limited{} 17
Configurar coleta de métricas e alertas
Após configurar o relatório de métricas, defina a coleta no Prometheus e crie regras de alerta com base nas métricas principais para receber notificações oportunas quando ocorrer limitação de taxa. O exemplo a seguir utiliza o Managed Service for Prometheus.
No Managed Service for Prometheus, adicione o componente Alibaba Cloud ASM ao seu cluster de plano de dados ou atualize-o para a versão mais recente. Isso garante que o Managed Service for Prometheus possa coletar as métricas de limitação de taxa local expostas. Para obter mais informações, consulte Integration management. Caso já tenha integrado uma instância Prometheus autogerenciada para coletar métricas da malha de serviço, ignore esta etapa. Para obter mais informações, consulte Integrate a self-managed Prometheus instance for mesh monitoring.
-
Crie uma regra de alerta para limitação de taxa local. Para obter mais informações, consulte Create a Prometheus alert rule by using a custom PromQL query. A tabela a seguir fornece um exemplo de configuração dos parâmetros principais. Configure os demais parâmetros conforme suas necessidades.
Parâmetro
Exemplo
Descrição
Consulta PromQL personalizada
(sum by(namespace, pod_name) (increase(envoy_http_local_rate_limiter_http_local_rate_limit_enforced[1m]))) > 0
Esta consulta PromQL usa a função
increasepara identificar o número de requisições limitadas no último minuto, agrupadas pelo namespace e nome do pod. Um alerta é acionado se o número de requisições limitadas em um minuto for maior que 0.Mensagem de alerta
Ocorreu limitação de taxa local! Namespace: {{$labels.namespace}}, Pod: {{$labels.pod_name}}. Requisições limitadas no último 1 minuto: {{ $value }}
Conteúdo da notificação de alerta. Esta mensagem de exemplo inclui o namespace e o nome do pod que acionou o alerta, bem como o número de requisições limitadas no último minuto.
Perguntas frequentes
Por que minha regra de limitação de taxa não está funcionando?
Protocolo de serviço incorreto
A limitação de taxa local suporta apenas o protocolo HTTP. Antes de configurar uma regra de limitação, certifique-se de que seu serviço se comunica via HTTP ou um protocolo de camada de aplicação baseado em HTTP, como gRPC ou Dubbo3.
Além disso, defina corretamente o protocolo do serviço para que a malha de serviço possa identificá-lo com precisão. Para obter mais informações, consulte How to correctly define the protocol type for a service.
Impacto do CRD Sidecar no tráfego de entrada
Por padrão, a malha de serviço configura automaticamente um listener de tráfego de entrada para o proxy sidecar com base nas declarações de porta na definição do Service. Tanto a limitação de taxa local quanto a global dependem desse comportamento padrão.
Você pode usar uma definição de recurso personalizado (CRD) Sidecar para modificar a configuração padrão de tráfego de entrada do serviço, por exemplo, para permitir que outros pods acessem uma aplicação que escuta em localhost. Para obter mais informações, consulte How to expose a localhost application to other pods.
Nesse caso, como o listener padrão é modificado, especificar a porta do Kubernetes Service na regra de limitação de taxa local não funcionará. Em vez disso, defina a Service Port na regra de limitação de taxa local como a porta de entrada real especificada no CRD Sidecar.
Por exemplo, se você configurar o seguinte CRD Sidecar para o serviço httpbin enquanto tenta aplicar limitação de taxa local à porta 8000:
apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
name: localhost-access
namespace: default
spec:
ingress:
- defaultEndpoint: '127.0.0.1:80'
port:
name: http
number: 80
protocol: HTTP
workloadSelector:
labels:
app: httpbin
Ao criar a regra de limitação de taxa local, defina a Service Port como 80, e não 8000.
Documentos relacionados
Se sua instância ASM for da versão 1.19.0 ou posterior, use o campo
limit_overridesno YAMLASMLocalRateLimiterpara corresponder requisições com base em outros atributos, como parâmetros de consulta. Para obter mais informações, consulte ASMLocalRateLimiter CRD reference.Use o CRD
ASMGlobalRateLimiterpara configurar limitação de taxa global para gateways de entrada e tráfego de serviço de aplicação. Para obter mais informações, consulte Configure global rate limiting for application services by using ASMGlobalRateLimiter.Configure limitação de taxa local ou global para um gateway de entrada no console ASM. Para obter mais informações, consulte Configure local throttling for an ingress gateway e Configure global rate limiting for an ingress gateway.
Use o recurso de aquecimento (warm-up) para aumentar gradualmente o volume de requisições durante um período especificado, ajudando a evitar problemas como tempos limite de requisição e perda de dados. Para obter mais informações, consulte Use the ASM warm-up feature.
Configure um pool de conexões para implementar disjuntor (circuit breaking), protegendo seu sistema contra danos adicionais durante falhas ou sobrecargas. Para obter mais informações, consulte Configure a connection pool to implement circuit breaking.