O ASMLocalRateLimiter é uma CustomResourceDefinition (CRD) que permite definir configurações de limitação de taxa local de forma declarativa no Service Mesh (ASM).
Como funciona
O ASMLocalRateLimiter utiliza um algoritmo de token bucket para controlar a taxa de requisições:
Cada proxy do Envoy mantém um token bucket com uma quantidade configurada de tokens (
quota).A reposição dos tokens ocorre em um intervalo regular (
fill_interval).Se não houver tokens disponíveis, o proxy rejeita a requisição com o status HTTP 429 (configurável).
Por padrão, todas as threads de trabalho dentro de um único processo do Envoy compartilham um único token bucket. Defina per_downstream_connection como true para alocar um bucket separado por conexão.
O valor de quota se aplica 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 é n x quota. Recalcule as cotas sempre que dimensionar o número de instâncias.
Visão geral da estrutura da CRD
Esta estrutura básica mostra como os campos se aninham na 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 |
|
|
Anteriores a 1.15.3.105 |
|
Se você definiu anteriormente a 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 implante novamente o cluster.
spec
Para mais informações, consulte Configure local rate limiting on an ingress gateway.
|
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 informações, consulte 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 de 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 o 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 |
Número de tokens. O valor deve ser um inteiro. Por exemplo, |
|
per_downstream_connection |
bool |
Não |
Escopo do token bucket. |
|
custom_response_body |
string |
Não |
Corpo de resposta retornado quando uma requisição atinge o limite de taxa. Requer o 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 o ASM V1.13.4 ou posterior. |
RateLimitOverrideConfig
Use substituições para aplicar um limite de taxa diferente às requisições que correspondem a cabeçalhos ou parâmetros de consulta específicos, mantendo o limite de taxa base para o restante do tráfego.
|
Campo |
Tipo |
Obrigatório |
Descrição |
|
request_match |
Sim |
Critérios que identificam as requisições que recebem a substituição. |
|
|
limit |
Sim |
Limite de taxa para requisições correspondidas. Apenas |
VirtualHostMatch
|
Campo |
Tipo |
Obrigatório |
Descrição |
|
name |
string |
Sim |
Nome do host virtual para correspondência. |
|
port |
int |
Não |
Porta para correspondência. |
|
route |
Não |
Rota para correspondência 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 |
Descontinuado no ASM V1.19.0 e posteriores. Use RateLimitOverrideConfig em vez disso. |
RequestMatcher
Ao especificar tanto header_match quanto query_match, a requisição deve satisfazer todas as condições para que haja correspondência.
|
Campo |
Tipo |
Obrigatório |
Descrição |
|
header_match |
Não |
Critérios de correspondência com base em cabeçalho. |
|
|
query_match |
Não |
Critérios de correspondência com base 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 regra de correspondência.
|
Campo |
Tipo |
Obrigatório |
Descrição |
|
name |
string |
Não |
Nome do cabeçalho. |
|
regex_match |
string |
Não |
Corresponde ao valor do cabeçalho com 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 fim 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 regra de correspondência.
|
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 fim do valor do parâmetro. |
|
regex_match |
string |
Não |
Corresponde ao valor do parâmetro com uma expressão regular. |
|
contains_match |
string |
Não |
Há correspondência 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 ao comparar valores. |