Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Configure global rate limiting for sidecar inbound traffic

Última atualização: Jun 28, 2026

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.

Nota

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:

  1. Redis: armazena contadores de requisições compartilhados entre todos os sidecars Envoy.

  2. 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.

  3. 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 status do CR.

Client request --> Envoy sidecar --> Rate limit service (gRPC) --> Redis
                       |
              Allow or deny (HTTP 429)

Pré-requisitos

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.

  1. Crie um arquivo chamado ratelimit-svc.yaml com o seguinte conteúdo:

    ratelimit-svc.yaml

    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
  2. 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

  1. Crie um arquivo chamado global-ratelimit-svc.yaml:

    global-ratelimit-svc.yaml

    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

    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

    workloadSelector

    Seleciona a carga de trabalho alvo. Defina app: httpbin para aplicar a limitação de taxa ao serviço HTTPBin.

    isGateway

    Defina como false porque a regra tem como alvo uma carga de trabalho sidecar, não um gateway de entrada.

    rateLimitService

    Configuraçõ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.

    limit

    Limiar de limitação de taxa. unit: MINUTE e quota: 1 significam 1 requisição por minuto na rota correspondente.

    vhost

    Corresponde ao host virtual. name: '*' com port: 8000 aplica a regra a todas as requisições na porta 8000 do HTTPBin.

  2. 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.

  1. Recupere a configuração gerada na instância ASM:

    kubectl get asmglobalratelimiter global-svc-test -o yaml

    Na saída, localize a seção status:

    Saída esperada

    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
  2. Crie um arquivo ratelimit-config.yaml. Copie o conteúdo de config.yaml da seção status para o campo data.config.yaml do ConfigMap exatamente como mostrado:

    Importante

    Copie o valor de config.yaml da seção status sem modificações. Qualquer alteração fará com que o serviço de limitação de taxa rejeite a configuração.

    ratelimit-config.yaml

    apiVersion: v1
       kind: ConfigMap
       metadata:
         name: ratelimit-config
       data:
         config.yaml: |
           descriptors:
           - key: header_match
             rate_limit:
               requests_per_unit: 1
               unit: MINUTE
             value: RateLimit[global-svc-test.default]-Id[1492204717]
           domain: ratelimit.default.svc.cluster.local
  3. 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:

ASM anterior à V1.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"

Em versões anteriores à V1.19.0, a correspondência de caminho é configurada dentro de match.vhost.route.header_match. O pseudo-cabeçalho :path corresponde aos caminhos de requisição por prefixo.

ASM V1.19.0 ou posterior (recomendado)

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: 1

Na V1.19.0 e posteriores, utilize o campo limit_overrides para correspondência baseada em caminho. O limit base é definido com um valor alto (100.000 requisições/segundo) para que apenas as requisições correspondentes à substituição sofram limitação de taxa.

A tabela a seguir explica os campos adicionais utilizados neste cenário:

Campo

Descrição

limit

Parâmetros de throttling a serem aplicados. unit indica a unidade de tempo para detecção de throttling. quota indica o número total de requisições permitidas por unidade de tempo. Se a instância ASM for V1.19.0 ou posterior, unit é definido como SECOND e quota como 100000, permitindo 100.000 requisições por segundo na rota correspondente. Isso significa efetivamente que nenhum throttling é aplicado na regra base. Utilize o campo limit_overrides para configurar throttling para requisições que atendam a critérios específicos.

limit_overrides

(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 request_match e limit.

vhost

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 route. Para V1.19.0 e posteriores, configure as regras de correspondência de cabeçalho no campo limit_overrides.

route.header_match

(Pré-V1.19.0) Corresponde a requisições por valores de cabeçalho HTTP dentro da rota vhost. Use o pseudo-cabeçalho :path para correspondência de caminho de URL.

Etapa 2: Sincronizar a configuração de limitação de taxa com o plano de dados

Siga o mesmo processo do Cenário 1:

  1. Recupere a configuração gerada na instância ASM:

    kubectl get asmglobalratelimiter global-svc-test -o yaml

    Saída de status esperada (V1.19.0+)

    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
  2. Copie o config.yaml da seção status para um ConfigMap e aplique-o no cluster ACK:

    ratelimit-config.yaml

    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.local
    kubectl apply -f ratelimit-config.yaml

Verificar

  1. Envie duas requisições para o caminho /headers a partir do pod sleep:

    kubectl exec -it deploy/sleep -- sh

    Em seguida, execute:

    curl httpbin:8000/headers -v
    curl httpbin:8000/headers -v

    Saí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 intact

    A segunda requisição para /headers sofreu limitação de taxa. Apenas uma requisição tem permissão para acessar o caminho /headers do serviço HTTPBin dentro de um minuto.

  2. Confirme se outros caminhos não foram afetados:

    curl httpbin:8000/get -v

    Saí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 intact

    As requisições para /get são bem-sucedidas porque apenas o caminho /headers está 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

envoy_cluster_ratelimit_ok

Contador

Número total de requisições permitidas pela limitação de taxa global.

envoy_cluster_ratelimit_over_limit

Contador

Total de requisições que excederam o limite da limitação de taxa global.

envoy_cluster_ratelimit_error

Contador

Quantidade total de requisições que falharam ao chamar a limitação de taxa global.

Habilitar relatório de métricas

  1. Configure proxyStatsMatcher para 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.

  2. 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.

  3. 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.

  4. 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_ratelimit

    Exemplo 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.

  1. 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.

    Nota

    Se 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.

  2. 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]))) > 0

    Mensagem 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

Referências