O ASMLocalRateLimiter é uma CustomResourceDefinition (CRD) usada para definir configurações de limitação de taxa local de forma declarativa no Service Mesh (ASM).
Funcionamento
O ASMLocalRateLimiter usa um algoritmo de token bucket para controlar a taxa de requisições:
Cada proxy Envoy mantém um token bucket com uma quantidade configurada de tokens (
quota).Os tokens são reabastecidos em intervalos regulares (
fill_interval).Se não houver tokens disponíveis, o sistema rejeita a requisição com o status HTTP 429 (configurável).
Por padrão, todas as threads de trabalho em um único processo Envoy compartilham o mesmo token bucket. Defina per_downstream_connection como true para alocar um bucket separado por conexão.
O valor de quota aplica-se a uma única instância do Envoy. Se você tiver n instâncias de gateway, o limite de taxa efetivo para os serviços de backend será n x quota. Recalcule as cotas sempre que dimensionar o número de instâncias.
Visão geral da estrutura do CRD
Este esqueleto mostra como os campos se aninham no CRD:
apiVersion: istio.alibabacloud.com/v1beta1 # or v1
kind: ASMLocalRateLimiter
metadata:
name: <rule-name>
namespace: <namespace>
spec:
workloadSelector:
labels:
<label-key>: <label-value>
isGateway: true | false
configs:
- name: <config-name>
match:
vhost:
name: <virtual-host-name>
port: <port>
route:
name_match: <route-name>
limit:
status: <http-status-code>
fill_interval:
seconds: <int>
nanos: <int>
quota: <int>
per_downstream_connection: true | false
custom_response_body: <string>
response_header_to_add:
<header-name>: <header-value>
limit_overrides:
- request_match:
header_match:
- name: <header-name>
exact_match: <value>
query_match:
- name: <param-name>
exact_match: <value>
limit:
fill_interval:
seconds: <int>
quota: <int>
Exemplo de configuração
O exemplo a seguir aplica limitação de taxa a um gateway de entrada. Dois hosts virtuais recebem limites diferentes: www.example1.com com 10 requisições por segundo e www.example2.com com 100 requisições por segundo.
Valores de apiVersion suportados
|
Versão do ASM |
Valor de apiVersion |
|
1.15.3.105 ou posterior |
|
|
Anterior a 1.15.3.105 |
|
Se você definiu anteriormente o apiVersion como istio.alibabacloud.com/v1beta1 para o ASMCircuitBreaker em um cluster do Container Service for Kubernetes (ACK), altere o valor para istio.alibabacloud.com/v1 e reimplante o cluster.
spec
Para mais informações, consulte Configurar limitação de taxa local em um gateway de entrada.
|
Campo |
Tipo |
Obrigatório |
Descrição |
|
workloadSelector |
map |
Sim |
Rótulos que selecionam os pods onde a limitação de taxa entra em vigor. A correspondência restringe-se ao namespace do recurso. Para mais detalhes, veja Workload Selector. |
|
isGateway |
bool |
Não |
Defina como |
|
configs |
Sim |
Regras de limitação de taxa. |
LocalRateLimiterConfig
|
Campo |
Tipo |
Obrigatório |
Descrição |
|
name |
string |
Sim |
Nome da regra de limitação de taxa. |
|
match |
Sim |
Critérios que determinam a quais requisições esta regra se aplica. |
|
|
limit |
Sim |
Configurações do token bucket que definem o limite de taxa. |
|
|
limit_overrides |
Não |
Substituições que aplicam limites de taxa diferentes a requisições específicas. Requer ASM V1.19.0 ou posterior. |
RatelimitMatch
|
Campo |
Tipo |
Obrigatório |
Descrição |
|
vhost |
Não |
Critérios para corresponder a um host virtual. |
LimitConfig
|
Campo |
Tipo |
Obrigatório |
Descrição |
|
status |
int |
Não |
Código de status HTTP retornado quando uma requisição atinge o limite de taxa. Padrão: |
|
fill_interval |
Duration |
Não |
Frequência de adição de tokens ao bucket. Especifique |
|
quota |
int |
Não |
Quantidade de tokens. O valor deve ser um número inteiro. Por exemplo, |
|
per_downstream_connection |
bool |
Não |
Escopo do token bucket. |
|
custom_response_body |
string |
Não |
Corpo da resposta retornado quando uma requisição atinge o limite de taxa. Requer ASM V1.13.4 ou posterior. |
|
response_header_to_add |
map[string]string |
Não |
Cabeçalhos de resposta adicionados quando uma requisição atinge o limite de taxa. Requer ASM V1.13.4 ou posterior. |
RateLimitOverrideConfig
Use substituições para aplicar um limite de taxa diferente a requisições que correspondam a cabeçalhos ou parâmetros de consulta específicos, mantendo o limite base para todo o restante do tráfego.
|
Campo |
Tipo |
Obrigatório |
Descrição |
|
request_match |
Sim |
Critérios que identificam as requisições sujeitas à substituição. |
|
|
limit |
Sim |
Limite de taxa para as requisições correspondentes. Apenas |
VirtualHostMatch
|
Campo |
Tipo |
Obrigatório |
Descrição |
|
name |
string |
Sim |
Nome do host virtual a corresponder. |
|
port |
int |
Não |
Porta a corresponder. |
|
route |
Não |
Rota a corresponder dentro do host virtual. |
RouteMatch
|
Campo |
Tipo |
Obrigatório |
Descrição |
|
name_match |
string |
Não |
Nome de uma rota específica definida em um serviço virtual. |
|
header_match |
Não |
Obsoleto no ASM V1.19.0 e posteriores. Use RateLimitOverrideConfig em seu lugar. |
RequestMatcher
Quando header_match e query_match são especificados, a requisição deve satisfazer todas as condições para haver correspondência.
|
Campo |
Tipo |
Obrigatório |
Descrição |
|
header_match |
Não |
Critérios de correspondência baseados em cabeçalho. |
|
|
query_match |
Não |
Critérios de correspondência baseados em parâmetro de consulta. |
HeaderMatcher
Especifique exatamente um campo de modo de correspondência (regex_match, exact_match, prefix_match, suffix_match ou present_match) por matcher.
|
Campo |
Tipo |
Obrigatório |
Descrição |
|
name |
string |
Não |
Nome do cabeçalho. |
|
regex_match |
string |
Não |
Corresponde o valor do cabeçalho a uma expressão regular. |
|
exact_match |
string |
Não |
Corresponde exatamente ao valor do cabeçalho. |
|
prefix_match |
string |
Não |
Corresponde ao início do valor do cabeçalho. |
|
suffix_match |
string |
Não |
Corresponde ao final do valor do cabeçalho. |
|
present_match |
bool |
Não |
|
|
invert_match |
bool |
Não |
Inverte o resultado da correspondência. Padrão: |
QueryParameterMatcher
Especifique exatamente um campo de modo de correspondência (exact_match, prefix_match, suffix_match, regex_match, contains_match ou present_match) por matcher.
|
Campo |
Tipo |
Obrigatório |
Descrição |
|
name |
string |
Sim |
Nome do parâmetro de consulta. |
|
exact_match |
string |
Não |
Corresponde exatamente ao valor do parâmetro. |
|
prefix_match |
string |
Não |
Corresponde ao início do valor do parâmetro. |
|
suffix_match |
string |
Não |
Corresponde ao final do valor do parâmetro. |
|
regex_match |
string |
Não |
Corresponde o valor do parâmetro a uma expressão regular. |
|
contains_match |
string |
Não |
Corresponde se o valor do parâmetro contiver a string especificada. |
|
present_match |
bool |
Não |
|
|
ignore_case |
bool |
Não |
Ignora maiúsculas e minúsculas na comparação de valores. |