O conjunto de agendamento de tráfego do Service Mesh (ASM) oferece recursos avançados de limitação de taxa, como limitação global, limitação por usuário, janelas de tráfego em rajada e taxas personalizadas de consumo de tokens para requisições destinadas a um serviço específico. Utilize o RateLimitingPolicy para implementar a limitação de taxa por usuário.
Informações básicas
As políticas de limitação do conjunto de agendamento de tráfego do ASM utilizam o algoritmo de balde de tokens. O sistema gera tokens a uma taxa fixa e os adiciona ao balde até atingir sua capacidade máxima. As requisições entre serviços consomem esses tokens. Se houver tokens suficientes, a requisição prossegue; caso contrário, ela pode ser enfileirada ou descartada. Esse mecanismo garante que a taxa média de transmissão de dados não exceda a taxa de geração de tokens, permitindo, ao mesmo tempo, certo grau de tráfego em rajada.
Pré-requisitos
Adicione um cluster gerenciado do Container Service for Kubernetes (ACK) à sua instância do ASM com versão 1.21.6.83 ou posterior. Para mais informações, consulte Adicionar um cluster a uma instância do ASM.
Conecte-se ao cluster ACK usando kubectl. Para mais informações, consulte Conectar-se a um cluster ACK usando kubectl.
Ative o conjunto de agendamento de tráfego do ASM. Para mais informações, consulte Ativar o conjunto de agendamento de tráfego do ASM.
Ative a injeção automática de proxy sidecar para o namespace padrão no cluster ACK. Para mais informações, consulte Gerencie namespaces globais.
Crie um gateway de entrada chamado ingressgateway com a porta 80 habilitada. Para mais informações, consulte Criar um gateway de entrada.
Preparativos
Implante os serviços de exemplo HTTPBin e sleep e verifique se o serviço sleep consegue acessar o serviço HTTPBin.
-
Crie um arquivo httpbin.yaml com o seguinte conteúdo:
-
Execute o comando a seguir para implantar o serviço HTTPBin:
kubectl apply -f httpbin.yaml -n default -
Crie um arquivo sleep.yaml com o seguinte conteúdo:
-
Execute o comando a seguir para implantar o serviço sleep:
kubectl apply -f sleep.yaml -n default -
Execute o comando a seguir para acessar o pod sleep:
kubectl exec -it deploy/sleep -- sh -
Envie uma requisição para o serviço HTTPBin executando este comando:
curl -I http://httpbin:8000/headersSaída esperada:
HTTP/1.1 200 OK server: envoy date: Tue, 26 Dec 2023 07:23:49 GMT content-type: application/json content-length: 353 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 1Uma resposta 200 OK indica acesso bem-sucedido.
Etapa 1: Crie uma política de limitação usando RateLimitingPolicy
Use kubectl para conectar-se à instância do ASM. Para mais informações, consulte Acessar recursos do Istio com kubectl.
-
Crie um arquivo ratelimitingpolicy.yaml com o seguinte conteúdo:
apiVersion: istio.alibabacloud.com/v1 kind: RateLimitingPolicy metadata: name: ratelimit namespace: istio-system spec: rate_limiter: bucket_capacity: 2 fill_amount: 2 parameters: interval: 30s limit_by_label_key: http.request.header.user_id selectors: - agent_group: default control_point: ingress service: httpbin.default.svc.cluster.localA tabela a seguir descreve alguns dos campos. Para mais detalhes, consulte Referência de campos do RateLimitingPolicy.
Campo
Descrição
fill_amount
Quantidade de tokens adicionados ao balde em cada intervalo de tempo definido pelo campo interval. Neste exemplo, o valor é 2, indicando a adição de dois tokens após cada intervalo.
interval
Frequência com que novos tokens são inseridos no balde. Aqui, o valor 30s significa que dois tokens são adicionados a cada 30 segundos.
bucket_capacity
Capacidade máxima de tokens do balde. Quando a taxa de requisições fica abaixo da taxa de preenchimento, os tokens se acumulam até atingir
bucket_capacity. Um valor maior parabucket_capacitypermite absorver picos de tráfego. Neste caso, o valor é 2 (igual a fill_amount), não permitindo tráfego em rajada.limit_by_label_key
Chave de rótulo usada para agrupar requisições na política de limitação. Requisições com valores diferentes para essa chave são limitadas separadamente, usando baldes de tokens independentes. No exemplo,
http.request.header.user_idagrupa as requisições pelo cabeçalhouser_id, simulando uma limitação por usuário. Pressupõe-se aqui que requisições de usuários distintos possuam cabeçalhosused_iddiferentes.selectors
Serviços aos quais a política de limitação se aplica. Neste cenário,
service: httpbin.default.svc.cluster.localaplica a limitação ao serviçohttpbin.default.svc.cluster.local.
-
Execute o comando a seguir para criar a política de limitação via RateLimitingPolicy:
kubectl apply -f ratelimitingpolicy.yaml
Etapa 2: Verifique o resultado da limitação por usuário
-
Conecte-se ao cluster ACK com kubectl e execute o comando a seguir para iniciar o bash no serviço sleep:
kubectl exec -it deploy/sleep -- sh -
Execute os comandos a seguir para acessar o caminho /headers do serviço HTTPBin duas vezes consecutivas como user1:
curl -H "user_id: user1" httpbin:8000/headers -v curl -H "user_id: user1" httpbin:8000/headers -vSaída esperada:
< HTTP/1.1 429 Too Many Requests < retry-after: 14 < date: Mon, 17 Jun 2024 11:48:53 GMT < server: envoy < content-length: 0 < x-envoy-upstream-service-time: 1 < * Connection #0 to host httpbin left intact -
Dentro de 30 segundos após a execução da etapa anterior, execute o comando a seguir para acessar o caminho /headers do serviço HTTPBin uma vez como user2:
curl -H "user_id: user2" httpbin:8000/headers -vSaída esperada:
< HTTP/1.1 200 OK < server: envoy < date: Mon, 17 Jun 2024 12:42:17 GMT < content-type: application/json < content-length: 378 < access-control-allow-origin: * < access-control-allow-credentials: true < x-envoy-upstream-service-time: 5 < { "headers": { "Accept": "*/*", "Host": "httpbin:8000", "User-Agent": "curl/8.1.2", "User-Id": "user2", "X-Envoy-Attempt-Count": "1", "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/default/sa/httpbin;Hash=ddab183a1502e5ededa933f83e90d3d5266e2ddf87555fb3da1ad40dde3c722e;Subject=\"\";URI=spiffe://cluster.local/ns/default/sa/sleep" } } * Connection #0 to host httpbin left intactA saída demonstra que a limitação não foi acionada para o user2 ao acessar o mesmo caminho, confirmando que a limitação por usuário funciona conforme o esperado.
Referências
Verifique a eficácia do RateLimitingPolicy no Grafana. Certifique-se de que a instância do Prometheus para o Grafana esteja configurada com o conjunto de agendamento de tráfego do ASM.
Importe o conteúdo a seguir no Grafana para criar um painel do RateLimitingPolicy.
A figura a seguir mostra o painel.
