Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Configure global rate limiting for an ingress gateway

Última atualização: Sep 12, 2026

Para gerenciar picos de tráfego, sobrecarga de service, exaustão de recursos ou ataques maliciosos, configure a limitação de taxa global em rotas específicas do gateway. Isso permite controle preciso do tráfego para proteger os services de backend, reduzir custos e melhorar a experiência do usuário.

Pré-requisitos

Antes de começar

Implantar o service de limitação de taxa

  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: registry-cn-hangzhou.ack.aliyuncs.com/dev/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: registry-cn-hangzhou.ack.aliyuncs.com/dev/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.default.svc.cluster.local: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 ambiente kubeconfig do cluster ACK, execute o comando a seguir para criar o service de limitação de taxa e o service Redis necessário.

    Para saber como se conectar a um cluster usando kubectl, consulte Obtain the kubeconfig of a cluster and use kubectl to connect to the cluster.

    kubectl apply -f ratelimit-svc.yaml

Implantar a aplicação de exemplo Bookinfo

  1. Baixe o manifesto YAML da aplicação Bookinfo (bookinfo.yaml) no repositório do projeto Istio no GitHub.

  2. No ambiente kubeconfig do cluster ACK, execute o comando a seguir para implantar a aplicação Bookinfo no cluster associado à instância do ASM.

    kubectl apply -f bookinfo.yaml
  3. Crie o arquivo bookinfo-gateway.yaml com o seguinte conteúdo.

    Bookinfo-gateway.yaml

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: bookinfo-gateway
      namespace: default
    spec:
      selector:
        istio: ingressgateway
      servers:
        - hosts:
            - bf2.example.com
          port:
            name: http
            number: 80
            protocol: http
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: bookinfo
      namespace: default
    spec:
      gateways:
        - bookinfo-gateway
      hosts:
        - bf2.example.com
      http:
        - match:
            - uri:
                exact: /productpage
            - uri:
                prefix: /static
            - uri:
                exact: /login
            - uri:
                exact: /logout
            - uri:
                prefix: /api/v1/products
          name: productpage-route-name1
          route:
            - destination:
                host: productpage
                port:
                  number: 9080
  4. No ambiente kubeconfig da instância do ASM, execute o comando a seguir para criar uma regra de rota para a aplicação Bookinfo no gateway de entrada.

    A regra de rota chama-se productpage-route-name1 e corresponde a solicitações para o domínio bf2.example.com. Para saber como se conectar a uma instância do ASM usando kubectl, consulte Access Istio resources by using control plane kubectl.

    kubectl apply -f bookinfo-gateway.yaml

Cenário 1: Configurar um limite de taxa global em uma rota do gateway

Este cenário demonstra como configurar uma regra de limitação de taxa para a rota productpage-route-name1, aplicável à combinação de nome de domínio e porta bf2.example.com:80. A rota productpage-route-name1 é uma entrada no VirtualService bookinfo criado na seção Before you begin. Essa rota corresponde a solicitações para caminhos como /productpage, /static, /login e /logout, encaminhando-as para o service productpage. Após a configuração da regra, o limite de taxa especificado aplica-se a todas as solicitações para esses caminhos.

  1. Crie um arquivo chamado global-ratelimit-gw.yaml com o seguinte conteúdo.

    global-ratelimit-gw.yaml

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          istio: ingressgateway
      rateLimitService: # Configuration for the rate limit service deployed in the prerequisites.
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      isGateway: true
      configs:
      - name: productpage
        limit:
          unit: MINUTE
          quota: 1
        match:
          vhost:
            name: bf2.example.com # This name must match the domain name in the VirtualService.
            port: 80 # This port must match the ASM gateway port.
            route:
              name_match: productpage-route-name1  # This name must match the name of the route in the VirtualService.

    A tabela a seguir descreve os campos principais. Para obter detalhes, consulte ASMGlobalRateLimiter CRD reference.

    Parâmetro

    Descrição

    workloadSelector

    Seleciona a carga de trabalho para a limitação de taxa. Neste exemplo, o limite global aplica-se à carga de trabalho do gateway de entrada, selecionada pelo rótulo istio: ingressgateway.

    isGateway

    Indica se a regra se aplica a um gateway. Defina como true para este exemplo.

    rateLimitService

    Especifica o nome de domínio, a porta e o tempo limite de conexão para o service de limitação de taxa. Com base no service implantado na seção Before you begin, a configuração é a seguinte:

       host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5

    limit

    Os parâmetros de limitação de taxa. O campo unit define o intervalo de tempo, e quota define o número de solicitações permitidas por intervalo.

    Neste exemplo, unit está definido como MINUTE e quota como 1. Isso permite apenas uma solicitação por minuto para a rota correspondente. O sistema rejeita as solicitações subsequentes.

    vhost

    As condições de correspondência para o nome de domínio e a rota. O campo name deve corresponder ao nome de domínio no VirtualService, e o campo port deve corresponder à porta do gateway de entrada. O nome da rota especificado em route.name_match deve corresponder ao nome da entrada de rota no VirtualService.

  2. No ambiente kubeconfig da instância do ASM, execute o comando a seguir para criar a regra de limitação de taxa global para a rota productpage-route-name1 no gateway.

    kubectl apply -f global-ratelimit-gw.yaml
  3. Execute o comando a seguir para obter a configuração da regra de limitação de taxa global reconciliada.

    kubectl get asmglobalratelimiter global-test -n istio-system -o yaml

    Saída esperada

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      configs:
      - limit:
          quota: 1
          unit: MINUTE
        match:
          vhost:
            name: bf2.example.com
            port: 80
            route:
              name_match: productpage-route-name1
        name: productpage
      isGateway: true
      rateLimitService:
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      workloadSelector:
        labels:
          app: istio-ingressgateway
    status:
      config.yaml: |
        descriptors:
        - key: generic_key
          rate_limit:
            requests_per_unit: 1
            unit: MINUTE
          value: RateLimit[global-test.istio-system]-Id[597770312]
        domain: ratelimit.default.svc.cluster.local
      message: ok
      status: successful
  4. Cole o conteúdo de config.yaml do campo status da saída do recurso ASMGlobalRateLimiter da etapa anterior no arquivo ratelimit-config.yaml para gerar a configuração do service de limitação de taxa global.

    O conteúdo da string do campo config.yaml dentro do campo status do ASMGlobalRateLimiter deve ser colado exatamente como está no campo config.yaml dentro do campo data do ConfigMap.

    ratelimit-config.yaml

    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-test.istio-system]-Id[597770312]
        domain: ratelimit.default.svc.cluster.local
  5. No ambiente kubeconfig do cluster ACK, execute o comando a seguir para aplicar a nova configuração ao service de limitação de taxa global.

    kubectl apply -f ratelimit-config.yaml
  6. Execute o comando a seguir duas vezes consecutivas para acessar a aplicação Bookinfo.

    Substitua <ASM_GATEWAY_IP> pelo endereço IP do gateway ASM. Para obter informações sobre como obter o endereço IP do gateway, consulte Obtain the IP address of an ingress gateway.

    curl -H 'host: bf2.example.com'  http://<ASM_GATEWAY_IP>/productpage -v
    curl -H 'host: bf2.example.com'  http://<ASM_GATEWAY_IP>/productpage -v

    A saída esperada para a segunda solicitação é a seguinte:

    < 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: 48
    < date: Thu, 26 Oct 2023 04:10:11 GMT
    < server: istio-envoy
    < content-length: 0
    < 
    * Connection #0 to host 116.62.XXX.XXX left intact

    A limitação de taxa global está configurada para permitir apenas uma solicitação por minuto. Ao enviar duas solicitações consecutivas, a primeira tem sucesso, mas o gateway rejeita a segunda com o status 429 Too Many Requests. Isso confirma que a limitação de taxa global para a rota está efetiva.

Cenário 2: Limitação de taxa global em um gateway de entrada

Este cenário mostra como configurar uma regra de limitação de taxa global para a combinação de domínio e porta bf2.example.com:80. Após aplicar a regra, todas as solicitações enviadas para essa combinação de domínio e porta estarão sujeitas ao limite de taxa especificado.

  1. Crie um arquivo chamado global-ratelimit-gw.yaml com o seguinte conteúdo.

    Global-ratelimit-gw.yaml

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          istio: ingressgateway
      rateLimitService: # Configuration for the rate limiting service deployed in the preparation step.
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      isGateway: true
      configs:
      - name: productpage
        limit:
          unit: MINUTE
          quota: 1
        match:
          vhost:
            name: bf2.example.com # This name must match the domain in the VirtualService.
            port: 80 # This port must match the ASM gateway port.

    A tabela a seguir descreve os campos principais. Para mais informações, consulte ASMGlobalRateLimiter CRD reference.

    Parâmetro

    Descrição

    workloadSelector

    Especifica a carga de trabalho alvo para a regra de limitação de taxa. Neste exemplo, a regra visa a carga de trabalho do gateway de entrada, identificada pelo rótulo istio: ingressgateway.

    isGateway

    Indica se a regra se aplica a um gateway. Defina como true para este exemplo.

    rateLimitService

    Especifica o domínio, a porta e o tempo limite de conexão para o service de limitação de taxa. Com base no service implantado na etapa Preparation, a configuração é a seguinte:

        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5

    limit

    Define a limitação de taxa. O campo unit especifica o intervalo de tempo, e o campo quota especifica o número de solicitações permitidas por intervalo.

    Neste exemplo, unit está definido como MINUTE e quota como 1. Essa configuração permite apenas uma solicitação por minuto para a rota correspondente. Solicitações subsequentes dentro desse minuto são rejeitadas.

    vhost

    Especifica o domínio e a rota para correspondência. Os campos name e port devem corresponder ao domínio do VirtualService e à porta do gateway de entrada, respectivamente.

  2. No ambiente kubeconfig da instância do ASM, execute o comando a seguir para aplicar a regra de limitação de taxa global para a rota productpage no gateway.

    kubectl apply -f global-ratelimit-gw.yaml
  3. Execute o comando a seguir para obter a configuração da regra de limitação de taxa global reconciliada.

    kubectl get asmglobalratelimiter global-test -n istio-system -o yaml

    Saída esperada

    apiVersion: istio.alibabacloud.com/v1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      configs:
      - limit:
          quota: 1
          unit: MINUTE
        match:
          vhost:
            name: bf2.example.com
            port: 80
        name: productpage
      isGateway: true
      rateLimitService:
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      workloadSelector:
        labels:
          istio: ingressgateway
    status:
      config.yaml: |
        descriptors:
        - key: generic_key
          rate_limit:
            requests_per_unit: 1
            unit: MINUTE
          value: RateLimit[global-test.istio-system]-Id[2100900480]
        domain: ratelimit.default.svc.cluster.local
      message: ok
      status: successful
  4. Copie o conteúdo da chave config.yaml do campo status na saída anterior e cole-o em um arquivo chamado ratelimit-config.yaml para configurar o service de limitação de taxa global.

    O conteúdo da string do campo config.yaml dentro do campo status do ASMGlobalRateLimiter deve ser colado exatamente como está no campo config.yaml de mesmo nome dentro do campo data do ConfigMap.

    Ratelimit-config.yaml

    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-test.istio-system]-Id[2100900480]
        domain: ratelimit.default.svc.cluster.local
  5. No ambiente kubeconfig do cluster ACK, execute o comando a seguir para atualizar a configuração do service de limitação de taxa global.

    kubectl apply -f ratelimit-config.yaml
  6. Execute o comando a seguir duas vezes consecutivas para acessar a aplicação Bookinfo.

    Substitua <ASM_GATEWAY_IP> pelo endereço IP do gateway ASM. Para mais informações sobre como obter o endereço IP do gateway, consulte Obtain the IP address of an ingress gateway.

    curl -H 'host: bf2.example.com'  http://<ASM_GATEWAY_IP>/productpage -v
    curl -H 'host: bf2.example.com'  http://<ASM_GATEWAY_IP>/productpage -v

    A saída esperada para a segunda solicitação é a seguinte:

    < 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: 48
    < date: Thu, 26 Oct 2023 04:10:11 GMT
    < server: istio-envoy
    < content-length: 0
    < 
    * Connection #0 to host 116.62.XXX.XXX left intact

    A regra de limitação de taxa global restringe o acesso à combinação de domínio e porta bf2.example.com:80 a uma solicitação por minuto. Ao enviar duas solicitações consecutivas, a primeira tem sucesso, mas a segunda é rejeitada. Isso confirma que a regra de limitação de taxa no gateway de entrada está funcionando corretamente.

Caso de uso 3: Limitação de taxa condicional em uma rota do gateway

Nota

Este caso de uso requer uma instância do ASM versão 1.19.0 ou posterior. Para instruções de atualização, consulte Update an ASM instance.

Configure uma regra de limitação de taxa para a rota productpage-route-name1 no domínio e porta bf2.example.com:80. A regra aplica-se apenas a solicitações que contêm o cabeçalho de solicitação ratelimit: "true" e o parâmetro de consulta ratelimit=enabled. Outras solicitações nesta rota não são afetadas pela regra de limitação de taxa. A rota corresponde a solicitações para caminhos como /productpage, /static, /login e /logout, e encaminha as solicitações correspondentes para o service productpage. Após a configuração da regra de limitação de taxa, as solicitações enviadas para esses caminhos que atendem às condições especificadas serão limitadas.

  1. Crie um arquivo chamado global-ratelimit-gw.yaml com o seguinte conteúdo.

    global-ratelimit-gw.yaml

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          app: istio-ingressgateway
      rateLimitService:
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      isGateway: true
      configs:
      - name: productpage
        limit:
          unit: SECOND
          quota: 100000
        match:
          vhost:
            name: bf2.example.com
            port: 80
            route:
              name_match: productpage-route-name1  # This name must match the route name in the virtual service.
        limit_overrides:
        - request_match:
            header_match:
            - name: ratelimit
              exact_match: "true"
            query_match:
            - name: ratelimit
              exact_match: "enabled"
          limit:
            unit: MINUTE
            quota: 1

    A tabela a seguir descreve os campos principais. Para mais informações, consulte ASMGlobalRateLimiter CRD reference.

    Parâmetro

    Descrição

    workloadSelector

    Especifica as cargas de trabalho sujeitas à limitação de taxa. Neste exemplo, a limitação global aplica-se ao gateway de entrada e está definida como istio: ingressgateway.

    isGateway

    Indica se isso se aplica ao gateway. Neste exemplo, está definido como true.

    rateLimitService

    Especifica o nome de domínio, a porta e o tempo limite de conexão para o service de limitação de taxa. Com base no service implantado na etapa Preparation, a configuração é a seguinte:

        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5

    limit

    Define os parâmetros básicos de limitação de taxa para a rota do VirtualService. O campo unit especifica o intervalo de tempo, e quota especifica o número de solicitações permitidas por intervalo. Este exemplo define unit como SECOND e quota como 100000, o que permite 100.000 solicitações por segundo. Esse limite alto desativa efetivamente a limitação de taxa para solicitações que não correspondem a uma substituição mais específica, garantindo que elas não sejam limitadas.

    vhost

    Especifica as condições de correspondência para o domínio e a rota. Os campos name e port devem corresponder ao domínio do VirtualService e à porta do gateway de entrada, respectivamente. O nome da rota em route.name_match deve corresponder ao nome da rota no VirtualService.

    limit_overrides

    Substitui o limite de taxa padrão. Use este campo para aplicar uma limitação de taxa mais específica a certas solicitações. Neste exemplo:

    • Em limit_overrides, o campo request_match corresponde a solicitações que contêm tanto o cabeçalho de solicitação ratelimit: "true" quanto o parâmetro de consulta ratelimit=enabled.

    • No campo limit de limit_overrides, definir unit como MINUTE e quota como 1 restringe as solicitações que atendem às condições especificadas por request_match a uma por minuto.

  2. No ambiente kubeconfig da instância ASM correspondente, execute o comando a seguir para criar uma regra de limitação de taxa global para a rota productpage-route-name1 no gateway.

    kubectl apply -f global-ratelimit-gw.yaml
  3. Execute o comando a seguir para obter a configuração reconciliada da regra de limitação de taxa global.

    kubectl get asmglobalratelimiter global-test -n istio-system -o yaml

    Saída esperada

    apiVersion: istio.alibabacloud.com/v1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      configs:
      - limit:
          quota: 100000
          unit: SECOND
        limit_overrides:
        - limit:
            quota: 1
            unit: MINUTE
          request_match:
            header_match:
            - exact_match: "true"
              name: ratelimit
            query_match:
            - exact_match: enabled
              name: ratelimit
        match:
          vhost:
            name: bf2.example.com
            port: 80
            route:
              name_match: productpage-route-name1
        name: productpage
      isGateway: true
      rateLimitService:
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      workloadSelector:
        labels:
          app: istio-ingressgateway
    status:
      config.yaml: |
        descriptors:
        - descriptors:
          - descriptors:
            - key: query_match
              rate_limit:
                requests_per_unit: 1
                unit: MINUTE
              value: RateLimit[global-test.istio-system]-Id[1102463266]
            key: header_match
            value: RateLimit[global-test.istio-system]-Id[1102463266]
          key: generic_key
          rate_limit:
            requests_per_unit: 100000
            unit: SECOND
          value: RateLimit[global-test.istio-system]-Id[1102463266]
        domain: ratelimit.default.svc.cluster.local
      message: ok
      status: successful
  4. Cole o conteúdo de config.yaml do campo status do recurso ASMGlobalRateLimiter (da saída esperada da etapa anterior) no arquivo ratelimit-config.yaml para gerar a configuração do service de limitação de taxa global.

    O conteúdo da string do campo status dentro do campo config.yaml do ASMGlobalRateLimiter deve ser colado exatamente como está no campo config.yaml de mesmo nome dentro do campo data do ConfigMap.

    ratelimit-config.yaml

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ratelimit-config
    data:
      config.yaml: |
        descriptors:
        - descriptors:
          - descriptors:
            - key: query_match
              rate_limit:
                requests_per_unit: 1
                unit: MINUTE
              value: RateLimit[global-test.istio-system]-Id[1102463266]
            key: header_match
            value: RateLimit[global-test.istio-system]-Id[1102463266]
          key: generic_key
          rate_limit:
            requests_per_unit: 100000
            unit: SECOND
          value: RateLimit[global-test.istio-system]-Id[1102463266]
        domain: ratelimit.default.svc.cluster.local
  5. No ambiente kubeconfig do cluster ACK, execute o comando a seguir para atualizar a configuração do service de limitação de taxa global no cluster.

    kubectl apply -f ratelimit-config.yaml
  6. Execute o comando a seguir duas vezes consecutivas para acessar a aplicação Bookinfo.

    Substitua <ASM_GATEWAY_IP> pelo IP do gateway. Para obter informações sobre como obter o IP do gateway, consulte Obtain the IP address of an ingress gateway.

    curl -H 'host: bf2.example.com'  http://<ASM_GATEWAY_IP>/productpage -v
    curl -H 'host: bf2.example.com'  http://<ASM_GATEWAY_IP>/productpage -v

    A saída esperada para a segunda solicitação à aplicação Bookinfo é a seguinte:

    < 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: 48
    < date: Thu, 26 Oct 2023 04:10:11 GMT
    < server: istio-envoy
    < content-length: 0
    < 
    * Connection #0 to host 116.62.XXX.XXX left intact

    Na configuração de limitação de taxa global, as solicitações para a aplicação Bookinfo são limitadas a uma por minuto se contiverem o cabeçalho de solicitação ratelimit: "true" e o parâmetro de consulta ratelimit=enabled. Ao fazer duas solicitações consecutivas para a aplicação Bookinfo com esse cabeçalho e parâmetro de consulta, você pode ver que a primeira solicitação tem sucesso e a segunda é limitada, o que indica que a configuração de limitação de taxa global para correspondência de solicitações específicas no gateway de entrada foi bem-sucedida.

  7. Execute o comando a seguir para acessar a aplicação Bookinfo novamente sem o cabeçalho de solicitação ratelimit: "true" ou o parâmetro de consulta ratelimit=enabled.

    curl -H 'host: bf2.example.com'  http://<ASM_GATEWAY_IP>/productpage -v

    A saída mostra que a aplicação Bookinfo é acessada com sucesso e nenhum código de status 429 é retornado. Isso confirma que a regra de limitação de taxa não afeta outras solicitações na rota.

Cenário 4: Configurar limitação baseada em IP para uma rota de VirtualService

Nota
  • Este cenário requer uma instância do ASM versão 1.19.0 ou posterior. Para instruções de atualização, consulte Update an ASM instance.

  • Para configurar a limitação para endereços IP de cliente específicos em um gateway de entrada ASM, você deve primeiro garantir que a política de tráfego externo do gateway de entrada esteja definida como Local. Para saber como criar um gateway de entrada e suas opções de configuração, consulte Create an ingress gateway.

  • Você pode encontrar o endereço IP do cliente para solicitações ao gateway no campo downstream_remote_address do log de acesso do gateway. Neste exemplo, configure a regra usando o endereço IP do cliente que você deseja limitar.

Este cenário mostra como configurar uma regra de limitação para a rota de VirtualService productpage-route-name1, associada à combinação de domínio e porta bf2.example.com:80. A regra foi projetada para aplicar-se apenas a solicitações de endereços IP de cliente específicos, deixando outras solicitações na mesma rota inalteradas.

  1. Crie um arquivo chamado global-ratelimit-gw.yaml com o seguinte conteúdo.

    global-ratelimit-gw.yaml

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          app: istio-ingressgateway
      rateLimitService:
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      isGateway: true
      configs:
      - name: productpage
        limit:
          unit: SECOND
          quota: 100000
        match:
          vhost:
            name: bf2.example.com
            port: 80
            route:
              name_match: productpage-route-name1  # This name must match the route name in the virtual service.
        limit_overrides:
        - request_match:
            remote_address:
              address: xxx.xxx.xxx.xxx # The client IP address.
              v4_prefix_mask_len: xx # The subnet mask for the client IP range.
          limit:
            unit: MINUTE
            quota: 1

    A tabela a seguir descreve os campos principais. Para obter detalhes sobre esses campos, consulte ASMGlobalRateLimiter CRD reference.

    Parâmetro

    Descrição

    workloadSelector

    Seleciona a carga de trabalho à qual a limitação se aplica. Este exemplo aplica a limitação global à carga de trabalho do gateway de entrada, selecionada usando o rótulo app: istio-ingressgateway.

    isGateway

    Indica se a regra se aplica a um gateway. Neste exemplo, está definido como true.

    rateLimitService

    O domínio, a porta e o tempo limite de conexão para o service de limitação. Com base no service de limitação implantado nos prerequisites, a configuração é a seguinte:

        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5

    limit

    Os parâmetros básicos de limitação para a rota do VirtualService. O campo unit especifica o intervalo de tempo, e quota especifica o número de solicitações permitidas por intervalo.

    Este exemplo define unit como SECOND e quota como 100000, o que permite 100.000 solicitações por segundo. Esse limite alto desativa efetivamente a limitação para solicitações que não correspondem a uma substituição específica.

    vhost

    As condições de correspondência para o domínio e a rota. Os campos name e port devem corresponder ao domínio do VirtualService e à porta do gateway de entrada, respectivamente. O nome da rota especificado em route.name_match deve corresponder ao nome da rota no VirtualService.

    limit_overrides

    Define um limiar de limitação mais específico para certas solicitações. Neste exemplo:

    • O campo request_match corresponde a solicitações com base no endereço IP de source do cliente usando remote_address.address. Você também pode especificar um intervalo opcional de endereços IP definindo um comprimento de máscara de sub-rede no campo remote_address.v4_prefix_mask_len.

    • No campo limit_overrides, o campo limit é configurado com unit definido como MINUTE e quota definido como 1, o que significa que, para solicitações que correspondem às condições especificadas por request_match, apenas uma solicitação é permitida por minuto.

  2. Usando o kubeconfig da instância do ASM, execute o comando a seguir para criar a regra de limitação global para a rota productpage-route-name1 no gateway de entrada.

    kubectl apply -f global-ratelimit-gw.yaml
  3. Execute o comando a seguir para recuperar a configuração reconciliada da regra de limitação global.

    kubectl get asmglobalratelimiter global-test -n istio-system -o yaml

    Saída esperada

    apiVersion: istio.alibabacloud.com/v1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      configs:
      - limit:
          quota: 100000
          unit: SECOND
        limit_overrides:
        - limit:
            quota: 1
            unit: MINUTE
          request_match:
            remote_address:
              address: 106.11.XX.XX
              v4_prefix_mask_len: 24
        match:
          vhost:
            name: bf2.example.com
            port: 80
            route:
              name_match: productpage-route-name1
        name: productpage
      isGateway: true
      rateLimitService:
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      workloadSelector:
        labels:
          app: istio-ingressgateway
    status:
      config.yaml: |
        descriptors:
        - descriptors:
          - key: masked_remote_address
            rate_limit:
              requests_per_unit: 1
              unit: MINUTE
            value: xxxxxx
          key: generic_key
          rate_limit:
            requests_per_unit: 100000
            unit: SECOND
          value: RateLimit[global-test.istio-system]-Id[1102463266]
        domain: ratelimit.default.svc.cluster.local
      message: ok
      status: successful
  4. Copie o conteúdo de config.yaml do campo status da saída do recurso ASMGlobalRateLimiter da etapa anterior e cole-o em ratelimit-config.yaml para configurar o service de limitação global.

    O conteúdo da string do campo config.yaml, que está dentro do campo status do recurso ASMGlobalRateLimiter, deve ser colado literalmente no campo config.yaml dentro do campo data do ConfigMap.

    ratelimit-config.yaml

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ratelimit-config
    data:
      config.yaml: |
        descriptors:
        - descriptors:
          - key: masked_remote_address
            rate_limit:
              requests_per_unit: 1
              unit: MINUTE
            value: xxxxxx
          key: generic_key
          rate_limit:
            requests_per_unit: 100000
            unit: SECOND
          value: RateLimit[global-test.istio-system]-Id[1102463266]
        domain: ratelimit.default.svc.cluster.local
  5. Usando o kubeconfig do cluster ACK, execute o comando a seguir para atualizar a configuração do service de limitação global.

    kubectl apply -f ratelimit-config.yaml
  6. De um cliente com o endereço IP especificado, execute os comandos a seguir duas vezes consecutivas para acessar a aplicação Bookinfo.

    Substitua <ASM_GATEWAY_IP> pelo endereço IP real do gateway. Para saber como obter o endereço IP do gateway, consulte Obtain the IP address of an ingress gateway.

    curl -H 'host: bf2.example.com'  http://<ASM_GATEWAY_IP>/productpage -v
    curl -H 'host: bf2.example.com'  http://<ASM_GATEWAY_IP>/productpage -v

    A saída esperada para a segunda solicitação é a seguinte:

    < 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: 48
    < date: Thu, 26 Oct 2023 04:10:11 GMT
    < server: istio-envoy
    < content-length: 0
    < 
    * Connection #0 to host 116.62.XXX.XXX left intact

    A configuração de limitação global limita as solicitações do endereço IP especificado (ou intervalo) a uma solicitação por minuto. Ao enviar duas solicitações consecutivas de um cliente com esse endereço IP, a primeira tem sucesso, mas a segunda é limitada. Isso confirma que a regra de limitação global para o gateway de entrada está funcionando conforme o esperado.

  7. De um cliente com um endereço IP diferente, execute o comando a seguir para acessar a aplicação Bookinfo novamente.

    curl -H 'host: bf2.example.com'  http://<ASM_GATEWAY_IP>/productpage -v

    A solicitação tem sucesso e nenhum código de status HTTP 429 é retornado. Isso indica que outras solicitações na rota não são afetadas pela regra de limitação global.

Cenário 5: Configurar limitação de taxa por IP de cliente em uma rota

Nota
  1. Este cenário requer uma instância do ASM versão 1.25.0 ou posterior. Para instruções de atualização, consulte Upgrade an ASM instance.

  2. Neste cenário, você deve definir a política de tráfego externo do gateway de entrada ASM como Local. Isso preserva o endereço IP original do cliente. Para mais informações sobre como criar um gateway de entrada e suas opções de configuração, consulte Create an ingress gateway.

  3. Você pode encontrar o endereço IP do cliente de uma solicitação ao gateway no campo downstream_remote_address do log de acesso. Neste exemplo, a regra de limitação de taxa é configurada com base no endereço IP real do cliente.

Neste cenário, você configurará uma regra de limitação de taxa para a rota de VirtualService productpage-route-name1 em bf2.example.com:80 para limitar cada endereço IP de cliente exclusivo a uma solicitação por minuto.

  1. Crie um arquivo chamado global-ratelimit-gw.yaml.

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          app: istio-ingressgateway
      rateLimitService:
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      isGateway: true
      configs:
      - name: productpage
        limit:
          unit: SECOND
          quota: 100000
        target_services:
        - name: bookinfo
          namespace: default
          kind: VirtualService
          port: 80
          section_name: productpage-route-name1
        limit_overrides:
        - request_match:
            remote_address:
              distinct: true # Apply rate limiting to each client IP address individually.
          limit:
            unit: MINUTE
            quota: 1

    A tabela a seguir descreve os campos principais. Para mais informações sobre os campos, consulte ASMGlobalRateLimiter CRD reference.

    Parâmetro

    Descrição

    workloadSelector

    Seleciona a carga de trabalho à qual a regra de limitação de taxa se aplica. Neste exemplo, a limitação de taxa global é aplicada ao gateway de entrada, selecionado pelo rótulo app: istio-ingressgateway.

    isGateway

    Indica se a regra se aplica a um gateway. Neste exemplo, está definido como true.

    rateLimitService

    As configurações de domínio, porta e tempo limite de conexão para o service de limitação de taxa. Com base no service de limitação de taxa implantado na seção Prerequisites, a configuração é a seguinte:

        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5

    limit

    Os parâmetros de limitação de taxa que se aplicam à rota do VirtualService. Inclui os seguintes campos:

    • unit: O intervalo de tempo para verificações de limite de taxa.

    • quota: O número de solicitações permitidas por intervalo de tempo.

    Neste exemplo, unit está definido como SECOND e quota como 100000. Esse limite alto desativa efetivamente a limitação de taxa para solicitações não cobertas por uma substituição específica, garantindo que outro tráfego permaneça inalterado.

    limit_overrides

    Substitui o limite de taxa padrão para solicitações específicas. Neste exemplo:

    • O campo request_match especifica condições para a substituição:

      • O campo remote_address corresponde a solicitações pelo endereço IP do cliente.

      • Definir o parâmetro distinct como true aplica esse limite a cada cliente individualmente.

      • remote_addess.v4_prefix_mask_len corresponde à máscara de sub-rede para o intervalo de endereços IP de source do cliente (opcional).

    • O campo limit dentro de limit_overrides define unit como MINUTE e quota como 1. Isso limita as solicitações que correspondem às condições de request_match a uma por minuto.

    target_services

    Especifica a rota do VirtualService à qual a regra de limitação de taxa se aplica.

    • kind especifica que a regra visa um VirtualService.

    • namespace e name especificam o namespace e o nome do VirtualService.

    • port restringe a regra ao tráfego na porta 80.

    • section_name especifica que a regra se aplica à rota chamada productpage-route-name1 dentro do VirtualService.

  2. Aplique a regra de limitação de taxa global.

    kubectl apply -f global-ratelimit-gw.yaml
  3. Visualize a configuração reconciliada da regra de limitação de taxa global.

    kubectl get asmglobalratelimiter global-test -n istio-system -o yaml |grep status: -A 50

    Saída esperada:

    status:
      config.yaml: |
        descriptors:
        - descriptors:
          - key: remote_address
            rate_limit:
              requests_per_unit: 1
              unit: MINUTE
          key: generic_key
          rate_limit:
            requests_per_unit: 100000
            unit: SECOND
          value: RateLimit[global-test.istio-system]-Id[537612397]
        domain: ratelimit.default.svc.cluster.local
      message: ok
      status: successful
  4. Edite o ConfigMap ratelimit-config da seção Prerequisites, substituindo o valor da chave config.yaml pela saída de status da etapa anterior.

    kubectl edit ConfigMap ratelimit-config

    Conteúdo atualizado:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ratelimit-config
    data:
      config.yaml: |
        descriptors:
        - descriptors:
          - key: remote_address
            rate_limit:
              requests_per_unit: 1
              unit: MINUTE
          key: generic_key
          rate_limit:
            requests_per_unit: 100000
            unit: SECOND
          value: RateLimit[global-test.istio-system]-Id[537612397]
        domain: ratelimit.default.svc.cluster.local
  5. De um cliente, acesse a aplicação Bookinfo duas vezes consecutivamente.

    export GATEWAY_URL=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    curl -H 'host: bf2.example.com' http://$GATEWAY_URL:80/productpage -v
    curl -H 'host: bf2.example.com' http://$GATEWAY_URL:80/productpage -v

    Saída esperada para a segunda solicitaçã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: 48
    < date: Thu, 26 Jul 2025 04:10:11 GMT
    < server: istio-envoy
    < content-length: 0
    < 
    * Connection #0 to host 116.62.XXX.XXX left intact

    A saída mostra que a segunda solicitação teve a taxa limitada, confirmando que a regra de limitação de taxa global para o gateway de entrada está configurada corretamente.

Documentos relacionados