Quando várias réplicas de um serviço executam atrás de um balanceador de carga, os limites de taxa por instância não conseguem impor um teto total de requisições em todo o serviço. A limitação de taxa global resolve esse problema ao utilizar um serviço centralizado para coordenar a contagem de requisições entre todos os sidecars Envoy no mesh.
O Service Mesh (ASM) V1.18.0.131 e versões posteriores fornecem o recurso personalizado (CR) ASMGlobalRateLimiter para configurar a limitação de taxa global no tráfego de entrada de serviços com proxies sidecar injetados. Este CR oferece uma API declarativa e estável que abstrai a configuração de filtros Envoy de baixo nível.
Este tópico aborda dois cenários:
Limitação de taxa no nível da porta: limita todas as requisições destinadas a uma porta específica do serviço.
Limitação de taxa no nível do caminho: restringe requisições a um caminho de URL específico em uma porta do serviço.
Para limites de taxa por instância, consulte Configurar limitação de taxa local no Traffic Management Center.
Limitação de taxa global versus local
|
Abordagem |
Funcionamento |
Mais indicado para |
|
Limitação de taxa global |
Um serviço gRPC centralizado (com suporte de Redis) rastreia a contagem de requisições em todas as instâncias. |
Impor um limite rígido em todo o serviço, independentemente do número de réplicas. |
|
Limitação de taxa local |
Cada sidecar Envoy aplica os limites de forma independente. |
Proteger instâncias individuais contra sobrecarga, sem dependências externas. |
Como funciona
A limitação de taxa global depende de três componentes:
Redis: armazena contadores de requisições compartilhados entre todos os sidecars Envoy.
Serviço de limitação de taxa: serviço gRPC consultado pelos sidecars Envoy antes do encaminhamento de requisições. Ele verifica os contadores no Redis e retorna decisões de permissão ou negação.
CR ASMGlobalRateLimiter: configuração declarativa aplicada ao plano de controle do ASM. O ASM a traduz em configurações de filtro Envoy e gera a configuração do serviço de limitação de taxa no campo
statusdo CR.
Client request --> Envoy sidecar --> Rate limit service (gRPC) --> Redis
|
Allow or deny (HTTP 429)
Pré-requisitos
Um cluster gerenciado ACK adicionado à sua instância ASM (V1.18.0.131 ou posterior). Para mais informações, consulte Adicionar um cluster a uma instância ASM.
Injeção automática de proxy sidecar ativada para o namespace
default. Para mais informações, consulte a seção "Enable automatic sidecar proxy injection" em Gerenciar namespaces globais.Um gateway de entrada ASM chamado
ingressgatewaycom a porta 80 habilitada. Para mais informações, consulte Criar um gateway de entrada.As aplicações de exemplo
sleepehttpbinimplantadas. Para mais informações, consulte Implantar a aplicação HTTPBin e Implantar o serviço sleep.
Implantar o serviço de limitação de taxa
Implante o Redis e o serviço de limitação de taxa no seu cluster ACK antes de configurar as regras de limitação.
-
Crie um arquivo chamado
ratelimit-svc.yamlcom o seguinte conteúdo: -
Execute o comando abaixo no cluster ACK para implantar os serviços:
kubectl apply -f ratelimit-svc.yaml
Cenário 1: Limitar a taxa de todas as requisições em uma porta de serviço
Neste cenário, todas as requisições para a porta 8000 do serviço HTTPBin são limitadas a 1 requisição por minuto.
O fluxo de trabalho consiste em três etapas: criar o CR ASMGlobalRateLimiter na instância ASM, sincronizar a configuração gerada com o serviço de limitação de taxa no cluster ACK e verificar.
Etapa 1: Criar o CR ASMGlobalRateLimiter
-
Crie um arquivo chamado
global-ratelimit-svc.yaml:A tabela a seguir explica os principais campos. Para obter a referência completa dos campos, consulte Descrições dos campos do ASMGlobalRateLimiter.
Campo
Descrição
workloadSelectorSeleciona a carga de trabalho alvo. Defina
app: httpbinpara aplicar a limitação de taxa ao serviço HTTPBin.isGatewayDefina como
falseporque a regra tem como alvo uma carga de trabalho sidecar, não um gateway de entrada.rateLimitServiceConfigurações de conexão para o serviço de limitação de taxa: nome do host, porta gRPC (8081) e tempo limite de 5 segundos.
limitLimiar de limitação de taxa.
unit: MINUTEequota: 1significam 1 requisição por minuto na rota correspondente.vhostCorresponde ao host virtual.
name: '*'comport: 8000aplica a regra a todas as requisições na porta 8000 do HTTPBin. -
Execute o seguinte comando na instância ASM para aplicar o CR:
kubectl apply -f global-ratelimit-svc.yaml
Etapa 2: Sincronizar a configuração de limitação de taxa com o plano de dados
Após o processamento do CR pelo ASM, ele gera a configuração do serviço de limitação de taxa no campo status.config.yaml. Copie essa configuração para o ConfigMap do serviço de limitação de taxa no cluster ACK. Essa sincronização manual é necessária porque o plano de controle do ASM e o plano de dados do ACK executam em clusters separados.
-
Recupere a configuração gerada na instância ASM:
kubectl get asmglobalratelimiter global-svc-test -o yamlNa saída, localize a seção
status: -
Crie um arquivo
ratelimit-config.yaml. Copie o conteúdo deconfig.yamlda seçãostatuspara o campodata.config.yamldo ConfigMap exatamente como mostrado:ImportanteCopie o valor de
config.yamlda seçãostatussem modificações. Qualquer alteração fará com que o serviço de limitação de taxa rejeite a configuração. -
Aplique o ConfigMap no cluster ACK:
kubectl apply -f ratelimit-config.yaml
Verificar
Envie duas requisições para a porta 8000 do HTTPBin a partir do pod sleep:
kubectl exec -it deploy/sleep -- sh
Em seguida, execute:
curl httpbin:8000/get -v
curl httpbin:8000/get -v
Saída esperada para a segunda requisição:
< HTTP/1.1 429
< x-envoy-ratelimited: true
< x-ratelimit-limit: 1, 1;w=60
< x-ratelimit-remaining: 0
< x-ratelimit-reset: 5
< date: Thu, 26 Oct 2023 04:23:54 GMT
< server: envoy
< content-length: 0
< x-envoy-upstream-service-time: 2
<
* Connection #0 to host httpbin left intact
A segunda requisição retorna 429, confirmando que a limitação de taxa global está ativa. Apenas uma requisição tem permissão para acessar o serviço HTTPBin dentro de um minuto. Ao enviar uma segunda requisição, o throttling é acionado, indicando que a limitação de taxa global entrou em vigor no tráfego de entrada do serviço onde o proxy sidecar foi injetado.
Cenário 2: Limitar a taxa de requisições para um caminho específico
Este cenário limita as requisições ao caminho /headers na porta 8000 do HTTPBin a 1 requisição por minuto, permitindo acesso ilimitado a outros caminhos, como /get.
A configuração varia dependendo da sua versão do ASM.
Etapa 1: Criar o CR ASMGlobalRateLimiter
Escolha o YAML correspondente à sua versão do ASM:
A tabela a seguir explica os campos adicionais utilizados neste cenário:
|
Campo |
Descrição |
|
|
Parâmetros de throttling a serem aplicados. |
|
|
(V1.19.0+) Substitui o limiar base de limitação de taxa para requisições que correspondem a critérios específicos. Cada substituição especifica seu próprio |
|
|
Nome de domínio e rota onde o throttling entra em vigor. Para versões anteriores à V1.19.0, configure regras de correspondência de cabeçalho para requisições na seção |
|
|
(Pré-V1.19.0) Corresponde a requisições por valores de cabeçalho HTTP dentro da rota |
Etapa 2: Sincronizar a configuração de limitação de taxa com o plano de dados
Siga o mesmo processo do Cenário 1:
-
Recupere a configuração gerada na instância ASM:
kubectl get asmglobalratelimiter global-svc-test -o yaml -
Copie o
config.yamlda seçãostatuspara um ConfigMap e aplique-o no cluster ACK:kubectl apply -f ratelimit-config.yaml
Verificar
-
Envie duas requisições para o caminho
/headersa partir do pod sleep:kubectl exec -it deploy/sleep -- shEm seguida, execute:
curl httpbin:8000/headers -v curl httpbin:8000/headers -vSaída esperada para a segunda requisição:
< HTTP/1.1 429 Too Many Requests < x-envoy-ratelimited: true < x-ratelimit-limit: 1, 1;w=60 < x-ratelimit-remaining: 0 < x-ratelimit-reset: 5 < date: Thu, 26 Oct 2023 04:23:54 GMT < server: envoy < content-length: 0 < x-envoy-upstream-service-time: 2 < * Connection #0 to host httpbin left intactA segunda requisição para
/headerssofreu limitação de taxa. Apenas uma requisição tem permissão para acessar o caminho/headersdo serviço HTTPBin dentro de um minuto. -
Confirme se outros caminhos não foram afetados:
curl httpbin:8000/get -vAs requisições para
/getsão bem-sucedidas porque apenas o caminho/headersestá sujeito à limitação de taxa.
Monitorar métricas de limitação de taxa global
Os sidecars Envoy expõem métricas para limitação de taxa global:
|
Métrica |
Tipo |
Descrição |
|
|
Contador |
Número total de requisições permitidas pela limitação de taxa global. |
|
|
Contador |
Total de requisições que excederam o limite da limitação de taxa global. |
|
|
Contador |
Quantidade total de requisições que falharam ao chamar a limitação de taxa global. |
Habilitar relatório de métricas
Configure
proxyStatsMatcherpara o proxy sidecar. Selecione Regular Expression Match e defina o valor como.*ratelimit.*. Para mais informações, consulte a seção "proxyStatsMatcher" em Configurar proxies sidecar.Reimplante o serviço HTTPBin para aplicar a nova configuração de proxy. Para mais informações, consulte a seção "(Optional) Redeploy workloads" em Configurar proxies sidecar.
Configure a limitação de taxa global e realize testes de requisição. Para mais informações, consulte o Cenário 1 ou Configurar limitação de taxa local no Traffic Management Center.
-
Execute o comando a seguir para visualizar as métricas de limitação de taxa global do serviço HTTPBin:
kubectl exec -it deploy/httpbin -c istio-proxy -- curl localhost:15090/stats/prometheus|grep envoy_cluster_ratelimitExemplo de saída:
# TYPE envoy_cluster_ratelimit_ok counter envoy_cluster_ratelimit_ok{cluster_name="inbound|80||"} 904 # TYPE envoy_cluster_ratelimit_over_limit counter envoy_cluster_ratelimit_over_limit{cluster_name="inbound|80||"} 3223
Configurar alertas do Prometheus
Utilize o Managed Service for Prometheus para coletar métricas de limitação de taxa e disparar alertas quando ocorrer limitação.
-
Conecte o cluster ACK ao componente Alibaba Cloud ASM no Managed Service for Prometheus ou atualize o componente para a versão mais recente. Para mais informações, consulte Gerenciar componentes.
NotaSe você já utiliza uma instância auto-gerenciada do Prometheus para coletar métricas do ASM, pule esta etapa. Para mais informações, consulte Monitorar instâncias ASM usando uma instância auto-gerenciada do Prometheus.
-
Crie uma regra de alerta personalizada com o seguinte PromQL e modelo de mensagem. Para instruções detalhadas, consulte Criar uma regra de alerta com uma instrução PromQL personalizada. Esta regra dispara quando qualquer serviço tiver pelo menos uma requisição com taxa limitada em uma janela contínua de um minuto, agrupada por namespace e nome do serviço.
Parâmetro
Valor de exemplo
Instrução PromQL
(sum by(namespace, service_istio_io_canonical_name) (increase(envoy_cluster_ratelimit_over_limit[1m]))) > 0Mensagem de alerta
Global rate limiting triggered. Namespace: {{$labels.namespace}}. Service: {{$labels.service_istio_io_canonical_name}}. Throttled requests in the last minute: {{ $value }}
Próximos passos
Limitação de taxa no gateway de entrada: aplique limitação de taxa global na borda do mesh em vez de no nível do sidecar. Consulte Configurar limitação de taxa global em um gateway de entrada.
Limitação de taxa local: combine com limites por instância para defesa em profundidade. Consulte Configurar limitação de taxa local no Traffic Management Center.
Referência de campos: revise todos os campos disponíveis para controle granular. Consulte Descrições dos campos do ASMGlobalRateLimiter.