Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Use ASMGlobalRateLimiter para configurar limitação de taxa global no tráfego de entrada de serviços de aplicação

Última atualização: Aug 29, 2026

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

Nota

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.

  1. Crie um arquivo chamado ratelimit-svc.yaml com 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
  2. 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)

Nota

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.

  1. 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.yaml das etapas anteriores, implante apenas o ServiceAccount, o Service e o Deployment do Redis contidos nele. Não implante o ConfigMap ratelimit-config, o Service ratelimit ou o Deployment ratelimit.

  2. No contexto kubeconfig da instância do ASM, execute o comando a seguir para verificar se o ASMMeshConfig/default existe.

    kubectl get asmmeshconfig default

    Crie um arquivo chamado ratelimit-service-patch.yaml. O exemplo abaixo usa o Redis implantado no namespace default nas etapas anteriores.

    spec:
      rateLimitService:
        enabled: true
        replicas: 1
        redis:
          type: single
          url: redis.default.svc.cluster.local:6379

    Execute 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.yaml

    Nesta configuração, enabled deve ser definido como true. O parâmetro replicas especifica o número de réplicas do service de limitação de taxa. O campo redis.type aceita os valores single, cluster e sentinel. Já o campo redis.url deve apontar para um endereço Redis acessível pelo service de limitação de taxa dentro do cluster do plano de dados.

  3. Ao criar um ASMGlobalRateLimiter nos cenários seguintes, remova completamente o campo spec.rateLimitService. Não configure um objeto vazio como rateLimitService: {}. 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:8081 por padrão e criará ou atualizará automaticamente o ConfigMap istio-system/ratelimit-service-config no 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
Nota

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.

  1. Crie um arquivo chamado global-ratelimit-svc.yaml com 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: 8000

    A tabela a seguir descreve alguns dos campos. Para uma descrição completa de todos os campos, consulte ASMGlobalRateLimiter fields.

    Parâmetro

    Descrição

    workloadSelector

    Corresponde à 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.

    isGateway

    Indica se a configuração se aplica a um gateway. Neste exemplo, o valor é definido como false.

    rateLimitService

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

    limit

    Parâmetros de limitação de taxa a serem aplicados. O campo unit define a unidade temporal de detecção, enquanto quota estabelece o total de requisições permitidas nessa unidade. Este exemplo define unit como MINUTE e quota como 1, permitindo apenas uma requisição por minuto na rota correspondente. Requisições excedentes sofrem limitação de taxa.

    vhost

    Configuraçõ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 name como '*' e port como a porta do Service correspondente.

    Use a seguinte configuração para rateLimitService:

    host: ratelimit.default.svc.cluster.local
    port: 8081
    timeout:
      seconds: 5
  2. 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
  3. 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 yaml
    apiVersion: 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
  4. Crie um arquivo chamado ratelimit-config.yaml para armazenar a configuração do service global de limitação de taxa. Copie a string do campo config.yaml, localizado sob o campo status do recurso ASMGlobalRateLimiter, e cole-a exatamente como está no campo homônimo config.yaml, sob data no ConfigMap. Como este ConfigMap possui o mesmo nome do ConfigMap ratelimit-config presente em ratelimit-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.local

    Os 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 Id dentro de value.

  5. 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
  6. Execute o comando a seguir para iniciar uma sessão bash na aplicação sleep.

    kubectl exec -it deploy/sleep -- sh
  7. Execute o comando abaixo para acessar o service httpbin duas vezes consecutivas.

    curl httpbin:8000/get -v
    curl httpbin:8000/get -v

    A 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 intact

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

  1. Crie um arquivo chamado global-ratelimit-svc.yaml com 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: 1

    A tabela a seguir descreve alguns dos campos. Para uma descrição completa de todos os campos, consulte ASMGlobalRateLimiter fields.

    Parâmetro

    Descrição

    workloadSelector

    Corresponde à 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.

    isGateway

    Indica se a configuração se aplica a um gateway. Neste exemplo, o valor é definido como false.

    rateLimitService

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

    limit

    Parâmetros de limitação de taxa a serem aplicados. O campo unit define a unidade temporal de detecção, enquanto quota estabelece o total de requisições permitidas nessa unidade. Para instâncias do ASM anteriores à versão 1.19.0, este exemplo define unit como MINUTE e quota como 1, 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 campo limit_overrides.

    vhost

    Configuraçõ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 name como '*' e port como 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 em route. 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 de route para o campo limit_overrides.

    limit_overrides

    Configuraçã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_overrides especifica 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
  2. 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
  3. 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 yaml
    apiVersion: 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
  4. Crie um arquivo chamado ratelimit-config.yaml para armazenar a configuração do service global de limitação de taxa. Copie a string do campo config.yaml, localizado sob o campo status do recurso ASMGlobalRateLimiter, e cole-a exatamente como está no campo homônimo config.yaml, sob data no ConfigMap. Como este ConfigMap possui o mesmo nome do ConfigMap ratelimit-config presente em ratelimit-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.local

    Os 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 Id dentro de value.

  5. 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
  6. Execute o comando a seguir para iniciar uma sessão bash na aplicação sleep.

    kubectl exec -it deploy/sleep -- sh
  7. Execute o comando abaixo para acessar o caminho /headers do service httpbin duas vezes consecutivas.

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

    A 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 intact

    Como a configuração global de limitação de taxa permite apenas uma requisição ao caminho /headers do 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 /headers do service httpbin.

  8. Execute o comando a seguir para acessar o caminho /get do service httpbin.

    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

    Requisiçõ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