Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Configurar limitação de taxa local

Última atualização: Jun 28, 2026

Para proteger seus serviços contra picos de tráfego, sobrecargas, exaustão de recursos ou ataques maliciosos, configure a limitação de taxa local no centro de gerenciamento de tráfego. Esse recurso mantém o tráfego dentro de um limiar controlável, garantindo a disponibilidade do serviço e o desempenho estável. O proxy Envoy implementa a limitação local usando um algoritmo de token bucket para controlar a taxa de requisições aos seus serviços. Esse algoritmo adiciona tokens a um bucket em intervalos regulares. Cada requisição consome um token. Quando o bucket fica sem tokens, novas requisições são temporariamente rejeitadas, evitando que o serviço seja sobrecarregado.

Pré-requisitos

  • Uma instância ASM criada que atenda aos seguintes requisitos:

    • Para Alibaba Cloud ASM Enterprise Edition (Professional ou Ultimate), a versão da instância deve ser 1.14.3 ou posterior. Para obter mais informações sobre como atualizar uma instância ASM, consulte Atualizar uma instância ASM.

    • Para ASM Standard Edition, a versão da instância deve ser 1,9 ou posterior. Use apenas o método nativo do Istio para configurar a limitação de taxa local. A documentação varia conforme a versão do Istio. Para obter as informações mais recentes, consulte a documentação do Istio Enabling Rate Limits using Envoy.

  • A injeção automática de proxy sidecar está ativada para o namespace default no cluster Kubernetes. Para obter mais informações, consulte Ativar injeção automática de proxy sidecar.

  • Os serviços de exemplo httpbin e sleep estão implantados, e o serviço sleep consegue acessar o serviço httpbin. Para obter mais informações, consulte Implantar o aplicativo httpbin.

Cenário 1: Aplicar limitação a uma porta de serviço

Este cenário demonstra como aplicar limitação de taxa local à porta 8000 do serviço httpbin. Após a configuração, a regra se aplica a todas as requisições enviadas para essa porta específica.

  1. Crie uma regra de limitação de taxa local.

    1. Faça login no console ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

    2. Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha Traffic Management Center > Traffic Protection and Scheduling. Na página exibida, clique em Create.

    3. Na página Create, configure os parâmetros e clique em OK.

      Seção

      Parâmetro

      Descrição

      Basic Information About Throttling

      Namespace

      Namespace onde reside a carga de trabalho afetada pela limitação de taxa local. Neste exemplo, selecione default.

      Name

      Nome personalizado para a configuração de limitação de taxa local. Neste exemplo, insira httpbin.

      Type of Effective Workload

      Tipo de carga de trabalho ao qual a regra de limitação se aplica. Valores válidos: Application Service e Gateway. Neste exemplo, selecione Applicable Application.

      Relevant Workload

      Insira um conjunto de pares chave-valor de rótulos para selecionar uma carga de trabalho específica. Neste exemplo, defina Label Name como app e Label Value como httpbin.

      List of Throttling Rules

      Service Port

      Número da porta declarado no Kubernetes Service do serviço. Deve ser uma porta HTTP. Neste exemplo, insira a porta HTTP 8000 do serviço httpbin.

      Throttling Configuration

      Especifique a janela de tempo e o número máximo de requisições permitidas nessa janela para o algoritmo de token bucket. Se o número de requisições enviadas dentro da janela de tempo exceder esse limite, as requisições subsequentes serão limitadas. Este exemplo usa a seguinte configuração:

      • Defina Time Window for Throttling Detection como 60s.

      • Defina Allowed requests in window como 10.

      Essa configuração limita a carga de trabalho do serviço a um máximo de 10 requisições em qualquer janela de 60 segundos.

      O arquivo YAML a seguir é um exemplo da configuração de limitação de taxa local.

      Local throttling configuration YAML

      apiVersion: istio.alibabacloud.com/v1beta1
      kind: ASMLocalRateLimiter
      metadata:
        name: httpbin
        namespace: default
      spec:
        configs:
          - limit:
              fill_interval:
                seconds: 60
              quota: 10
            match:
              vhost:
                name: '*'
                port: 8000
                route:
                  header_match:
                    - invert_match: false
                      name: ':path'
                      prefix_match: /
        isGateway: false
        workloadSelector:
          labels:
            app: httpbin
  2. Verifique a regra de limitação de taxa local.

    1. Execute o comando a seguir para iniciar uma sessão bash no contêiner sleep:

      kubectl exec -it deploy/sleep -- sh
    2. Execute o comando a seguir para enviar 10 requisições:

      for i in $(seq 1 10); do curl -v http://httpbin:8000/headers; done
    3. Execute o comando a seguir para enviar uma 11ª requisição:

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

      Saída esperada:

      *   Trying 172.16.245.130:8000...
      * Connected to httpbin (172.16.245.130) port 8000
      > GET /headers HTTP/1.1
      > Host: httpbin:8000
      > User-Agent: curl/8.5.0
      > Accept: */*
      >
      < HTTP/1.1 429 Too Many Requests
      < x-local-rate-limit: true
      < content-length: 18
      < content-type: text/plain
      < date: Tue, 26 Dec 2023 08:02:58 GMT
      < server: envoy
      < x-envoy-upstream-service-time: 2

      A saída mostra um código de status HTTP 429, indicando que a requisição foi limitada.

Cenário 2: Aplicar limitação a um caminho de requisição

Este cenário demonstra como aplicar limitação de taxa local a requisições enviadas para o caminho /headers na porta 8000 do serviço httpbin. Após a configuração, a regra se aplica apenas a requisições correspondentes a esse caminho e porta específicos.

  1. Crie uma regra de limitação de taxa local.

    1. Faça login no console ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

    2. Na página Mesh Management, clique no nome da instância ASM. No painel de navegação à esquerda, escolha Traffic Management Center > Traffic Protection and Scheduling. Na página exibida, clique em Create.

    3. Na página Create, configure os parâmetros e clique em OK.

      Seção

      Parâmetro

      Descrição

      Basic Information About Throttling

      Namespace

      Namespace onde reside a carga de trabalho afetada pela limitação de taxa local. Neste exemplo, selecione default.

      Name

      Nome personalizado para a configuração de limitação de taxa local. Neste exemplo, insira httpbin.

      Type of Effective Workload

      Tipo de carga de trabalho ao qual a regra de limitação se aplica. Valores válidos: Application Service e Gateway. Neste exemplo, selecione Applicable Application.

      Relevant Workload

      Insira um conjunto de pares chave-valor de rótulos para selecionar uma carga de trabalho específica. Neste exemplo, defina Label Name como app e Label Value como httpbin.

      List of Throttling Rules

      Service Port

      Número da porta declarado no Kubernetes Service do serviço. Deve ser uma porta HTTP. Neste exemplo, insira a porta HTTP 8000 do serviço httpbin.

      Match Request Attributes

      Defina as condições de correspondência para as requisições. A regra aplica-se apenas a requisições que atendem a essas condições. Este exemplo usa a seguinte configuração:

      • Defina Matched Attributes como Request Path.

      • Defina Matching Method como Prefix Match.

      • Defina Matched Content como /headers.

      Throttling Configuration

      Especifique a janela de tempo e o número máximo de requisições permitidas nessa janela para o algoritmo de token bucket. Se o número de requisições enviadas dentro da janela de tempo exceder esse limite, as requisições subsequentes serão limitadas. Este exemplo usa a seguinte configuração:

      • Defina Time Window for Throttling Detection como 60s.

      • Defina Allowed requests in window como 10.

      Essa configuração limita a carga de trabalho do serviço a um máximo de 10 requisições em qualquer janela de 60 segundos.

  2. Verifique a regra de limitação de taxa local.

    1. Execute o comando a seguir para iniciar uma sessão bash no contêiner sleep:

      kubectl exec -it deploy/sleep -- sh
    2. Execute o comando a seguir para enviar 10 requisições:

      for i in $(seq 1 10); do curl -v http://httpbin:8000/headers; done
    3. Execute o comando a seguir para enviar uma 11ª requisição:

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

      Saída esperada:

      *   Trying 172.16.245.130:8000...
      * Connected to httpbin (172.16.245.130) port 8000
      > GET /headers HTTP/1.1
      > Host: httpbin:8000
      > User-Agent: curl/8.5.0
      > Accept: */*
      >
      < HTTP/1.1 429 Too Many Requests
      < x-local-rate-limit: true
      < content-length: 18
      < content-type: text/plain
      < date: Tue, 26 Dec 2023 08:02:58 GMT
      < server: envoy
      < x-envoy-upstream-service-time: 2

      A saída mostra um código de status HTTP 429, indicando que a requisição foi limitada.

    4. Execute o comando a seguir para enviar uma requisição ao caminho /get do serviço httpbin:

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

      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 03:46:11 GMT
      < content-type: application/json
      < content-length: 431
      < access-control-allow-origin: *
      < access-control-allow-credentials: true
      < x-envoy-upstream-service-time: 1
      <
      {
        "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"
      }

      A saída mostra um código de status 200 OK. Isso confirma que requisições para outros caminhos do serviço httpbin não são afetadas pela regra de limitação.

Operações relacionadas

Visualize métricas de limitação de taxa local

O recurso de limitação de taxa local gera as seguintes métricas:

Métrica

Descrição

envoy_http_local_rate_limiter_http_local_rate_limit_enabled

Número total de requisições que acionaram o filtro de limitação de taxa.

envoy_http_local_rate_limiter_http_local_rate_limit_ok

Número total de requisições permitidas devido à disponibilidade de um token.

envoy_http_local_rate_limiter_http_local_rate_limit_rate_limited

Número total de requisições sinalizadas para limitação devido à indisponibilidade de tokens. Isso não significa necessariamente que a requisição foi rejeitada.

envoy_http_local_rate_limiter_http_local_rate_limit_enforced

Número total de requisições efetivamente limitadas, por exemplo, aquelas que retornaram uma resposta 429.

Configure a definição proxyStatsMatcher no proxy sidecar para relatar essas métricas. Em seguida, use o Prometheus para coletá-las e visualizá-las.

  1. Configure o proxy sidecar para relatar métricas de limitação usando proxyStatsMatcher.

    Ao configurar proxyStatsMatcher, selecione Regular Expression Match e defina-o como .*http_local_rate_limit.*. Alternativamente, clique em Add Local Throttling Metrics. Para obter mais informações, consulte proxyStatsMatcher.

  2. Reimplante o serviço httpbin. Para obter mais informações, consulte Reimplantar cargas de trabalho.

  3. Conclua a configuração de limitação de taxa local e envie requisições de teste conforme descrito no Cenário 1 ou no Cenário 2.

  4. Execute o comando a seguir para visualize as métricas de limitação de taxa local do serviço httpbin:

    kubectl exec -it deploy/httpbin -c istio-proxy -- curl localhost:15020/stats/prometheus|grep http_local_rate_limit

    Saída esperada:

    envoy_http_local_rate_limiter_http_local_rate_limit_enabled{} 37
    envoy_http_local_rate_limiter_http_local_rate_limit_enforced{} 17
    envoy_http_local_rate_limiter_http_local_rate_limit_ok{} 20
    envoy_http_local_rate_limiter_http_local_rate_limit_rate_limited{} 17

Configurar coleta de métricas e alertas

Após configurar o relatório de métricas, defina a coleta no Prometheus e crie regras de alerta com base nas métricas principais para receber notificações oportunas quando ocorrer limitação de taxa. O exemplo a seguir utiliza o Managed Service for Prometheus.

  1. No Managed Service for Prometheus, adicione o componente Alibaba Cloud ASM ao seu cluster de plano de dados ou atualize-o para a versão mais recente. Isso garante que o Managed Service for Prometheus possa coletar as métricas de limitação de taxa local expostas. Para obter mais informações, consulte Gerenciamento de integração. Caso já tenha integrado uma instância autogerenciada do Prometheus para coletar métricas da malha de serviços, ignore esta etapa. Para obter mais informações, consulte Integrar uma instância autogerenciada do Prometheus para monitoramento de malha.

  2. Crie uma regra de alerta para limitação de taxa local. Para obter mais informações, consulte Criar uma regra de alerta do Prometheus usando uma consulta PromQL personalizada. A tabela a seguir fornece um exemplo de configuração dos parâmetros principais. Configure os demais parâmetros conforme suas necessidades.

    Parâmetro

    Exemplo

    Descrição

    Consulta PromQL personalizada

    (sum by(namespace, pod_name) (increase(envoy_http_local_rate_limiter_http_local_rate_limit_enforced[1m]))) > 0

    Esta consulta PromQL usa a função increase para determinar o número de requisições limitadas no último minuto, agrupadas pelo namespace e nome do pod. Um alerta é acionado se o número de requisições limitadas em um minuto for maior que 0.

    Mensagem de alerta

    Local throttling has occurred! Namespace: {{$labels.namespace}}, Pod: {{$labels.pod_name}}. Throttled requests in the last 1 minute: {{ $value }}

    Conteúdo da notificação de alerta. Esta mensagem de exemplo inclui o namespace e o nome do pod que acionou o alerta, bem como o número de requisições limitadas no último minuto.

Perguntas frequentes

Por que minha regra de limitação não está funcionando?

Protocolo de serviço incorreto

A limitação de taxa local suporta apenas o protocolo HTTP. Antes de configurar uma regra de limitação, certifique-se de que seu serviço se comunica via HTTP ou um protocolo de camada de aplicação baseado em HTTP, como gRPC ou Dubbo3.

Além disso, defina corretamente o protocolo do serviço para que a malha de serviços possa identificá-lo com precisão. Para obter mais informações, consulte Como definir corretamente o tipo de protocolo para um serviço.

Impacto do CRD Sidecar no tráfego de entrada

Por padrão, a malha de serviços configura automaticamente um listener de tráfego de entrada para o proxy sidecar com base nas declarações de porta na definição do Service. Tanto a limitação de taxa local quanto a global dependem desse comportamento padrão.

Use uma definição de recurso personalizado (CRD) Sidecar para modifique a configuração padrão de tráfego de entrada do serviço, por exemplo, para permitir que outros pods acessem um aplicativo que escuta em localhost. Para obter mais informações, consulte Como expor um aplicativo localhost a outros pods.

Nesse caso, como o listener padrão é modificado, especificar a porta do Kubernetes Service na regra de limitação de taxa local não funcionará. Em vez disso, defina a Service Port na regra de limitação de taxa local como a porta de entrada real especificada no CRD Sidecar.

Por exemplo, se você configurar o seguinte CRD Sidecar para o serviço httpbin enquanto tenta aplicar limitação de taxa local à porta 8000:

apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
  name: localhost-access
  namespace: default
spec:
  ingress:
    - defaultEndpoint: '127.0.0.1:80'
      port:
        name: http
        number: 80
        protocol: HTTP
  workloadSelector:
    labels:
      app: httpbin

Ao criar a regra de limitação de taxa local, defina a Service Port como 80, e não 8000.

Documentos relacionados