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 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 Alibaba Cloud 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 Atualizar uma instância ASM.
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 Ativar injeção automática de proxy sidecar.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 Implantar o aplicativo httpbin.
Cenário 1: Aplicar limitação a uma porta de serviço
Este cenário demonstra como aplicar 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 onde reside a 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 um conjunto de pares chave-valor de rótulos 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 número de requisições enviadas dentro da 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 um máximo de 10 requisições em qualquer janela de 60 segundos.
O arquivo YAML a seguir é um exemplo da 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 mostra um código de status HTTP 429, indicando que a requisição foi limitada.
-
Cenário 2: Aplicar limitação a um caminho de requisição
Este cenário demonstra como aplicar 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 onde reside a 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 um conjunto de pares chave-valor de rótulos 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 as requisições. A regra aplica-se apenas a requisições que atendem 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 número de requisições enviadas dentro da 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 um máximo de 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 mostra um 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 mostra um 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.
-
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 sinalizadas para limitação devido à indisponibilidade de tokens. 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, aquelas que retornaram uma 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 usando
proxyStatsMatcher.Ao configurar
proxyStatsMatcher, selecione Regular Expression Match e defina-o 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 Reimplantar cargas de trabalho.
Conclua a configuração de limitação de taxa local e envie requisições de teste conforme descrito no Cenário 1 ou no Cenário 2.
-
Execute o comando a seguir para visualize 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 Gerenciamento de integração. Caso já tenha integrado uma instância autogerenciada do Prometheus para coletar métricas da malha de serviços, ignore esta etapa. Para obter mais informações, consulte Integrar uma instância autogerenciada do Prometheus para monitoramento de malha.
-
Crie uma regra de alerta para limitação de taxa local. Para obter mais informações, consulte Criar uma regra de alerta do Prometheus usando uma consulta PromQL personalizada. 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 determinar 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
Local throttling has occurred! Namespace: {{$labels.namespace}}, Pod: {{$labels.pod_name}}. Throttled requests in the last 1 minute: {{ $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 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ços possa identificá-lo com precisão. Para obter mais informações, consulte Como definir corretamente o tipo de protocolo para um serviço.
Impacto do CRD Sidecar no tráfego de entrada
Por padrão, a malha de serviços 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.
Use uma definição de recurso personalizado (CRD) Sidecar para modifique a configuração padrão de tráfego de entrada do serviço, por exemplo, para permitir que outros pods acessem um aplicativo que escuta em localhost. Para obter mais informações, consulte Como expor um aplicativo localhost a outros 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 Referência do CRD ASMLocalRateLimiter.Utilize o CRD
ASMGlobalRateLimiterpara configurar limitação de taxa global para gateways de entrada e tráfego de serviços de aplicativos. Para obter mais informações, consulte Configurar limitação de taxa global para serviços de aplicativos usando ASMGlobalRateLimiter.Configure limitação de taxa local ou global para um gateway de entrada no console ASM. Para obter mais informações, consulte Configurar limitação de taxa local para um gateway de entrada e Configurar limitação de taxa global para um gateway de entrada.
Use o recurso de aquecimento 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 Usar o recurso de aquecimento do ASM.
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 Configurar um pool de conexões para implementar disjuntor.