A limitação de taxa restringe o número de requisições que um cliente pode enviar a um servidor em um determinado período, como 300 por minuto ou 10 por segundo. Use o ASMGlobalRateLimiter no Alibaba Cloud Service Mesh (ASM) para aplicar limites globais de taxa ao tráfego de entrada de serviços de aplicação com sidecars injetados.
Os proxies Envoy implementam a limitação de taxa de duas formas: limitação global e limitação local. Este tópico aborda apenas a limitação global. Para conceitos sobre limitação de taxa e instruções sobre limitação local, consulte Configure local rate limiting in the Traffic Management Center.
Dois cenários neste tópico demonstram as granularidades nas quais um limite global de taxa pode ser aplicado a um service de aplicação: todas as requisições em uma porta do service (Cenário 1) ou apenas as requisições que acessam um caminho específico nessa porta (Cenário 2). Ambos os cenários usam o mesmo nome de recurso ASMGlobalRateLimiter (global-svc-test) e o mesmo ConfigMap (ratelimit-config).
Pré-requisitos
Um cluster gerenciado do Container Service for Kubernetes (ACK) adicionado à instância do ASM, com versão 1.18.0.131 ou posterior. Para obter instruções, consulte Add a cluster to an ASM instance.
Injeção automática de proxy sidecar ativada para o namespace
defaultno cluster Kubernetes. Para obter instruções, consulte Enable automatic sidecar proxy injection.Um ingress gateway chamado ingressgateway criado, com a porta 80 habilitada. Para obter instruções, consulte Create an ingress gateway.
As aplicações de exemplo httpbin e sleep implantadas. Para obter instruções, consulte Deploy the httpbin application in a cluster on the data plane e Deploy the sleep service in a cluster on the data plane.
O ASM suporta a configuração de limitação global de taxa para tráfego de entrada em ingress gateways e em serviços de aplicação com sidecars injetados a partir da versão 1.18.0.131. O campo limit_overrides, usado no Cenário 2 para limitar a taxa de um caminho específico, tem suporte apenas em instâncias do ASM versão 1.19.0 ou posterior.
Implante o service de limitação de taxa
A limitação global de taxa entra em vigor somente após a execução do service de limitação de taxa no cluster do plano de dados. Implante o service de limitação de taxa e o service Redis do qual ele depende antes de configurar uma regra de limitação de taxa.
-
Crie um arquivo chamado
ratelimit-svc.yamlcom o seguinte conteúdo.apiVersion: v1 kind: ServiceAccount metadata: name: redis --- apiVersion: v1 kind: Service metadata: name: redis labels: app: redis spec: ports: - name: redis port: 6379 selector: app: redis --- apiVersion: apps/v1 kind: Deployment metadata: name: redis spec: replicas: 1 selector: matchLabels: app: redis template: metadata: labels: app: redis sidecar.istio.io/inject: "false" spec: containers: - image: redis:alpine imagePullPolicy: Always name: redis ports: - name: redis containerPort: 6379 restartPolicy: Always serviceAccountName: redis --- apiVersion: v1 kind: ConfigMap metadata: name: ratelimit-config data: config.yaml: | {} --- apiVersion: v1 kind: Service metadata: name: ratelimit labels: app: ratelimit spec: ports: - name: http-port port: 8080 targetPort: 8080 protocol: TCP - name: grpc-port port: 8081 targetPort: 8081 protocol: TCP - name: http-debug port: 6070 targetPort: 6070 protocol: TCP selector: app: ratelimit --- apiVersion: apps/v1 kind: Deployment metadata: name: ratelimit spec: replicas: 1 selector: matchLabels: app: ratelimit strategy: type: Recreate template: metadata: labels: app: ratelimit sidecar.istio.io/inject: "false" spec: containers: # Latest image from https://hub.docker.com/r/envoyproxy/ratelimit/tags - image: envoyproxy/ratelimit:e059638d imagePullPolicy: Always name: ratelimit command: ["/bin/ratelimit"] env: - name: LOG_LEVEL value: debug - name: REDIS_SOCKET_TYPE value: tcp - name: REDIS_URL value: redis:6379 - name: USE_STATSD value: "false" - name: RUNTIME_ROOT value: /data - name: RUNTIME_SUBDIRECTORY value: ratelimit - name: RUNTIME_WATCH_ROOT value: "false" - name: RUNTIME_IGNOREDOTFILES value: "true" ports: - containerPort: 8080 - containerPort: 8081 - containerPort: 6070 volumeMounts: - name: config-volume # $RUNTIME_ROOT/$RUNTIME_SUBDIRECTORY/$RUNTIME_APPDIRECTORY/config.yaml mountPath: /data/ratelimit/config volumes: - name: config-volume configMap: name: ratelimit-config -
No contexto kubeconfig do cluster ACK, execute o comando abaixo para criar o service de limitação de taxa e o service Redis dependente no cluster.
kubectl apply -f ratelimit-svc.yaml
Use o service de limitação de taxa gerenciado pelo ASM (opcional)
Este recurso tem suporte apenas em instâncias do ASM versão 1.25 ou posterior. Se sua instância do ASM for anterior à versão 1.25, continue implantando o service de limitação de taxa conforme descrito anteriormente e atualize manualmente o ConfigMap usado pelo service.
No ASM 1.25 e versões posteriores, é possível usar o ASMMeshConfig para ativar o service de limitação de taxa gerenciado pelo ASM. Ao adotar esse método, não é necessário configurar rateLimitService durante a criação de um ASMGlobalRateLimiter. O ASM usa automaticamente o service de limitação de taxa entregue aos clusters do plano de dados e atualiza automaticamente o ConfigMap usado pelo service com base nas regras globais de limitação de taxa.
Prepare o Redis do qual o service de limitação de taxa depende. O ASM implanta o service de limitação de taxa, mas não implanta o Redis. Você pode continuar usando o Redis implantado anteriormente ou usar uma instância existente do Redis. Para continuar usando o arquivo
ratelimit-svc.yamldas etapas anteriores, implante apenas o ServiceAccount, o Service e o Deployment do Redis contidos nele. Não implante o ConfigMapratelimit-config, o Serviceratelimitou o Deploymentratelimit.-
No contexto kubeconfig da instância do ASM, execute o comando a seguir para verificar se o ASMMeshConfig/default existe.
kubectl get asmmeshconfig defaultCrie um arquivo chamado
ratelimit-service-patch.yaml. O exemplo abaixo usa o Redis implantado no namespacedefaultnas etapas anteriores.spec: rateLimitService: enabled: true replicas: 1 redis: type: single url: redis.default.svc.cluster.local:6379Execute o comando a seguir para ativar o service de limitação de taxa com um merge patch, evitando a sobrescrita de outras configurações no ASMMeshConfig/default.
kubectl patch asmmeshconfig default \ --type=merge \ --patch-file ratelimit-service-patch.yamlNesta configuração,
enableddeve ser definido comotrue. O parâmetroreplicasespecifica o número de réplicas do service de limitação de taxa. O camporedis.typeaceita os valoressingle,clusteresentinel. Já o camporedis.urldeve apontar para um endereço Redis acessível pelo service de limitação de taxa dentro do cluster do plano de dados. -
Ao criar um ASMGlobalRateLimiter nos cenários seguintes, remova completamente o campo
spec.rateLimitService. Não configure um objeto vazio comorateLimitService: {}. Mantenha as demais configurações das regras de limitação de taxa inalteradas.Se você omitir
spec.rateLimitService, o ASM usaráratelimit.istio-system.svc.cluster.local:8081por padrão e criará ou atualizará automaticamente o ConfigMapistio-system/ratelimit-service-configno cluster ACK. Esse ConfigMap é gerenciado pelo ASM. Não o modifique manualmente.No contexto kubeconfig do cluster ACK, execute o comando a seguir para visualizar a configuração de limitação de taxa gerada automaticamente.
kubectl -n istio-system get configmap ratelimit-service-config -o yaml
Os cenários a seguir ainda demonstram o método de implantação manual, compatível com todas as versões do ASM. Caso use o service de limitação de taxa gerenciado pelo ASM, omita rateLimitService conforme descrito nesta seção e pule as etapas de cópia da configuração do campo status e atualização manual do ConfigMap. Todas as outras configurações de regras de limitação de taxa e métodos de verificação permanecem inalterados.
Cenário 1: Configure a limitação global de taxa para uma porta de service
Aplique um limite de taxa na porta 8000 do service httpbin. Após a criação da regra de limitação de taxa, o limite será aplicado a todas as requisições enviadas para a porta 8000 do service httpbin.
-
Crie um arquivo chamado
global-ratelimit-svc.yamlcom o seguinte conteúdo.apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMGlobalRateLimiter metadata: name: global-svc-test namespace: default spec: workloadSelector: labels: app: httpbin rateLimitService: host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5 isGateway: false configs: - name: httpbin limit: unit: MINUTE quota: 1 match: vhost: name: '*' port: 8000A tabela a seguir descreve alguns dos campos. Para uma descrição completa de todos os campos, consulte ASMGlobalRateLimiter fields.
Parâmetro
Descrição
workloadSelectorCorresponde à carga de trabalho onde a limitação de taxa terá efeito. Neste cenário, a limitação global atua sobre a carga de trabalho do service httpbin, portanto o valor é definido como
app: httpbin.isGatewayIndica se a configuração se aplica a um gateway. Neste exemplo, o valor é definido como
false.rateLimitServiceDefine o nome de domínio, a porta e as configurações de tempo limite de conexão do service de limitação de taxa. Para o service implantado conforme Deploy the rate-limiting service, use a configuração apresentada após esta tabela.
limitParâmetros de limitação de taxa a serem aplicados. O campo
unitdefine a unidade temporal de detecção, enquantoquotaestabelece o total de requisições permitidas nessa unidade. Este exemplo defineunitcomoMINUTEequotacomo1, permitindo apenas uma requisição por minuto na rota correspondente. Requisições excedentes sofrem limitação de taxa.vhostConfigurações de nome de domínio e rota para correspondência da limitação. Quando a configuração visa um service de aplicação, defina
namecomo'*'eportcomo a porta do Service correspondente.Use a seguinte configuração para
rateLimitService:host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5 -
No contexto kubeconfig da instância do ASM, execute o comando abaixo para criar uma regra global de limitação de taxa aplicada ao tráfego de entrada do service de aplicação httpbin.
kubectl apply -f global-ratelimit-svc.yaml -
Execute o comando a seguir para obter a configuração reconciliada da regra global de limitação de taxa.
kubectl get asmglobalratelimiter global-svc-test -o yamlapiVersion: istio.alibabacloud.com/v1 kind: ASMGlobalRateLimiter metadata: name: global-svc-test namespace: default spec: configs: - limit: quota: 1 unit: MINUTE match: vhost: name: '*' port: 8000 name: httpbin isGateway: false rateLimitService: host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5 workloadSelector: labels: app: httpbin status: config.yaml: | descriptors: - key: generic_key rate_limit: requests_per_unit: 1 unit: MINUTE value: RateLimit[global-svc-test.default]-Id[3833670472] domain: ratelimit.default.svc.cluster.local message: ok status: successful -
Crie um arquivo chamado
ratelimit-config.yamlpara armazenar a configuração do service global de limitação de taxa. Copie a string do campoconfig.yaml, localizado sob o campostatusdo recurso ASMGlobalRateLimiter, e cole-a exatamente como está no campo homônimoconfig.yaml, sobdatano ConfigMap. Como este ConfigMap possui o mesmo nome do ConfigMapratelimit-configpresente emratelimit-svc.yaml, a string colada substituirá a configuração inicial vazia ({}).apiVersion: v1 kind: ConfigMap metadata: name: ratelimit-config data: config.yaml: | descriptors: - key: generic_key rate_limit: requests_per_unit: 1 unit: MINUTE value: RateLimit[global-svc-test.default]-Id[3833670472] domain: ratelimit.default.svc.cluster.localOs valores neste exemplo provêm da saída esperada na etapa anterior. Use os valores retornados para o seu próprio recurso ASMGlobalRateLimiter, incluindo o valor
Iddentro devalue. -
No contexto kubeconfig do cluster ACK, execute o comando abaixo para atualizar a configuração do service global de limitação de taxa no cluster.
kubectl apply -f ratelimit-config.yaml -
Execute o comando a seguir para iniciar uma sessão bash na aplicação sleep.
kubectl exec -it deploy/sleep -- sh -
Execute o comando abaixo para acessar o service httpbin duas vezes consecutivas.
curl httpbin:8000/get -v curl httpbin:8000/get -vA primeira requisição é permitida. A segunda requisição retorna a seguinte saída:
< 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 intactComo a configuração global de limitação de taxa permite apenas uma requisição ao service httpbin por minuto, a segunda requisição sofre limitação. A limitação global de taxa agora está ativa para o tráfego de entrada na porta do service httpbin.
Cenário 2: Configure a limitação global de taxa para um caminho específico em uma porta de service
Aplique um limite de taxa na porta 8000 do service httpbin, restringindo a atuação da regra apenas às requisições que acessam o caminho /headers. Após a criação da regra, o limite será aplicado a todas as requisições enviadas para a porta 8000 do service httpbin que acessarem o caminho /headers.
-
Crie um arquivo chamado
global-ratelimit-svc.yamlcom o conteúdo correspondente à sua versão do ASM.YAML para versões do ASM anteriores a 1.19.0
apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMGlobalRateLimiter metadata: name: global-svc-test namespace: default spec: workloadSelector: labels: app: httpbin rateLimitService: host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5 isGateway: false configs: - name: httpbin limit: unit: MINUTE quota: 1 match: vhost: name: '*' port: 8000 route: header_match: - name: ":path" prefix_match: "/headers"YAML para ASM versão 1.19.0 ou posterior
apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMGlobalRateLimiter metadata: name: global-svc-test namespace: default spec: workloadSelector: labels: app: httpbin rateLimitService: host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5 isGateway: false configs: - name: httpbin limit: unit: SECOND quota: 100000 match: vhost: name: '*' port: 8000 limit_overrides: - request_match: header_match: - name: ":path" prefix_match: "/headers" limit: unit: MINUTE quota: 1A tabela a seguir descreve alguns dos campos. Para uma descrição completa de todos os campos, consulte ASMGlobalRateLimiter fields.
Parâmetro
Descrição
workloadSelectorCorresponde à carga de trabalho onde a limitação de taxa terá efeito. Neste cenário, a limitação global atua sobre a carga de trabalho do service httpbin, portanto o valor é definido como
app: httpbin.isGatewayIndica se a configuração se aplica a um gateway. Neste exemplo, o valor é definido como
false.rateLimitServiceDefine o nome de domínio, a porta e as configurações de tempo limite de conexão do service de limitação de taxa. Para o service implantado conforme Deploy the rate-limiting service, use a configuração apresentada após esta tabela.
limitParâmetros de limitação de taxa a serem aplicados. O campo
unitdefine a unidade temporal de detecção, enquantoquotaestabelece o total de requisições permitidas nessa unidade. Para instâncias do ASM anteriores à versão 1.19.0, este exemplo defineunitcomoMINUTEequotacomo1, permitindo apenas uma requisição por minuto na rota correspondente; requisições excedentes sofrem limitação. Para instâncias do ASM versão 1.19.0 ou posterior, os parâmetros são definidos como 100.000 requisições por segundo, o que equivale praticamente a nenhuma limitação, pois a restrição efetiva para requisições que atendem a condições específicas reside no campolimit_overrides.vhostConfigurações de nome de domínio e rota para correspondência da limitação. Quando a configuração visa um service de aplicação, defina
namecomo'*'eportcomo a porta do Service correspondente. Em versões do ASM anteriores a 1.19.0, também é possível configurar regras de correspondência de cabeçalho para requisições emroute. Este exemplo corresponde ao cabeçalho especial:path, que identifica o caminho da requisição. Ou seja, a regra abrange todas as requisições cujo caminho inicia com/headers. No ASM versão 1.19.0 ou posterior, as regras de correspondência de cabeçalho migraram deroutepara o campolimit_overrides.limit_overridesConfiguração de substituição de limite de taxa, com suporte apenas no ASM versão 1.19.0 ou posterior. Permite corresponder a diferentes atributos das requisições e aplicar uma configuração distinta de limitação às requisições específicas identificadas. Neste exemplo, o campo
limit_overridesespecifica a correspondência ao cabeçalho especial:path, que identifica o caminho da requisição. Assim, a substituição abrange todas as requisições cujo caminho inicia com/headers.Use a seguinte configuração para
rateLimitService:host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5 -
No contexto kubeconfig da instância do ASM, execute o comando abaixo para criar uma regra global de limitação de taxa aplicada ao tráfego de entrada do service de aplicação httpbin.
kubectl apply -f global-ratelimit-svc.yaml -
Execute o comando a seguir para obter a configuração reconciliada da regra global de limitação de taxa.
kubectl get asmglobalratelimiter global-svc-test -o yamlapiVersion: istio.alibabacloud.com/v1 kind: ASMGlobalRateLimiter metadata: name: global-svc-test namespace: default spec: configs: - limit: quota: 100000 unit: SECOND limit_overrides: - limit: quota: 1 unit: MINUTE request_match: header_match: - name: :path prefix_match: /headers match: vhost: name: '*' port: 8000 name: httpbin isGateway: false rateLimitService: host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5 workloadSelector: labels: app: httpbin status: config.yaml: | descriptors: - descriptors: - key: header_match rate_limit: requests_per_unit: 1 unit: MINUTE value: RateLimit[global-svc-test.default]-Id[2613586978] key: generic_key rate_limit: requests_per_unit: 100000 unit: SECOND value: RateLimit[global-svc-test.default]-Id[2613586978] domain: ratelimit.default.svc.cluster.local message: ok status: successful -
Crie um arquivo chamado
ratelimit-config.yamlpara armazenar a configuração do service global de limitação de taxa. Copie a string do campoconfig.yaml, localizado sob o campostatusdo recurso ASMGlobalRateLimiter, e cole-a exatamente como está no campo homônimoconfig.yaml, sobdatano ConfigMap. Como este ConfigMap possui o mesmo nome do ConfigMapratelimit-configpresente emratelimit-svc.yaml, a string colada substituirá a configuração inicial vazia ({}).apiVersion: v1 kind: ConfigMap metadata: name: ratelimit-config data: config.yaml: | descriptors: - descriptors: - key: header_match rate_limit: requests_per_unit: 1 unit: MINUTE value: RateLimit[global-svc-test.default]-Id[2613586978] key: generic_key rate_limit: requests_per_unit: 100000 unit: SECOND value: RateLimit[global-svc-test.default]-Id[2613586978] domain: ratelimit.default.svc.cluster.localOs valores neste exemplo provêm da saída esperada na etapa anterior. Use os valores retornados para o seu próprio recurso ASMGlobalRateLimiter, incluindo o valor
Iddentro devalue. -
No contexto kubeconfig do cluster ACK, execute o comando abaixo para atualizar a configuração do service global de limitação de taxa no cluster.
kubectl apply -f ratelimit-config.yaml -
Execute o comando a seguir para iniciar uma sessão bash na aplicação sleep.
kubectl exec -it deploy/sleep -- sh -
Execute o comando abaixo para acessar o caminho
/headersdo service httpbin duas vezes consecutivas.curl httpbin:8000/headers -v curl httpbin:8000/headers -vA primeira requisição é permitida. A segunda requisição retorna a seguinte saída:
< 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 intactComo a configuração global de limitação de taxa permite apenas uma requisição ao caminho
/headersdo service httpbin por minuto, a segunda requisição sofre limitação. A limitação global de taxa agora está ativa para o tráfego de entrada no caminho/headersdo service httpbin. -
Execute o comando a seguir para acessar o caminho
/getdo service httpbin.curl httpbin:8000/get -vSaí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 06:25:09 GMT < content-type: application/json < content-length: 431 < access-control-allow-origin: * < access-control-allow-credentials: true < x-envoy-upstream-service-time: 7 < { "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" } * Connection #0 to host httpbin left intactRequisições enviadas a outros caminhos do service httpbin não são afetadas pela configuração global de limitação de taxa e continuam sendo acessadas normalmente.
Referências
Para descrições dos campos do ASMGlobalRateLimiter, consulte ASMGlobalRateLimiter fields.
Para mais informações sobre como configurar a limitação local de taxa no Traffic Management Center, consulte Configure local rate limiting in the Traffic Management Center.
Para mais informações sobre como configurar a limitação global de taxa para um ingress gateway, consulte Configure global rate limiting for an ingress gateway.