Tous les produits
Search
Centre de documentation

Alibaba Cloud Service Mesh:Configurer la limitation locale

Dernière mise à jour :Sep 12, 2026

Pour protéger vos services contre les pics de trafic, les surcharges, l'épuisement des ressources ou les attaques malveillantes, configurez la limitation locale dans le centre de gestion du trafic. Cette fonctionnalité maintient le trafic sous un seuil contrôlable, garantissant ainsi la disponibilité et la stabilité des performances des services. Le proxy Envoy met en œuvre la limitation locale à l'aide d'un algorithme de seau de jetons pour contrôler le taux de requêtes adressées à vos services. Cet algorithme ajoute des jetons dans un seau à intervalles réguliers. Chaque requête consomme un jeton. Lorsque le seau est vide, les nouvelles requêtes sont temporairement rejetées, ce qui empêche efficacement le service d'être submergé.

Prérequis

  • Une instance ASM a été créée et répond aux exigences suivantes :

    • Pour ASM Enterprise Edition (Professional ou Ultimate), la version de l'instance doit être 1.14.3 ou ultérieure. Pour plus d'informations sur la mise à niveau d'une instance ASM, consultez Mettre à niveau une instance ASM.

    • Pour ASM Standard Edition, la version de l'instance doit être 1,9 ou ultérieure. Vous ne pouvez utiliser que la méthode Istio native pour configurer la limitation locale. La documentation varie selon la version d'Istio. Pour obtenir les dernières informations, consultez la documentation Istio Activation des limites de débit à l'aide d'Envoy.

  • L'injection automatique du proxy sidecar est activée pour le namespace default dans le cluster Kubernetes. Pour plus d'informations, consultez Activer l'injection automatique du proxy sidecar.

  • Les exemples de services httpbin et sleep sont déployés, et le service sleep peut accéder au service httpbin. Pour plus d'informations, consultez Déployer l'application httpbin.

Scénario 1 : Appliquer la limitation à un port de service

Ce scénario montre comment appliquer la limitation locale au port 8000 du service httpbin. Une fois configurée, la règle s'applique à toutes les requêtes envoyées vers ce port spécifique.

  1. Créez une règle de limitation locale.

    1. Connectez-vous à la console ASM. Dans le volet de navigation de gauche, sélectionnez Service Mesh > Mesh Management.

    2. Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, sélectionnez Traffic Management Center > Traffic Protection and Scheduling. Sur la page qui s'affiche, cliquez sur Create.

    3. Sur la page Create, configurez les paramètres et cliquez sur OK.

      Section

      Paramètre

      Description

      Basic Information About Throttling

      Namespace

      Le namespace où réside la charge de travail affectée par la limitation locale. Dans cet exemple, sélectionnez default.

      Name

      Un nom personnalisé pour la configuration de limitation locale. Dans cet exemple, saisissez httpbin.

      Type of Effective Workload

      Le type de charge de travail auquel s'applique la règle de limitation. Valeurs valides : Application Service et Gateway. Dans cet exemple, sélectionnez Applicable Application.

      Relevant Workload

      Saisissez un ensemble de paires clé-valeur de libellés pour sélectionner une charge de travail spécifique. Dans cet exemple, définissez Label Name sur app et Label Value sur httpbin.

      List of Throttling Rules

      Service Port

      Le numéro de port déclaré dans le service Kubernetes du service. Il doit s'agir d'un port HTTP. Dans cet exemple, saisissez le port HTTP 8000 du service httpbin.

      Throttling Configuration

      Spécifiez la fenêtre temporelle et le nombre maximal de requêtes autorisées dans cette fenêtre pour l'algorithme du seau de jetons. Si le nombre de requêtes envoyées dans la fenêtre temporelle dépasse cette limite, les requêtes suivantes sont limitées. Cet exemple utilise la configuration suivante :

      • Définissez Time Window for Throttling Detection sur 60s.

      • Définissez Allowed requests in window sur 10.

      Cette configuration limite la charge de travail du service à un maximum de 10 requêtes dans n'importe quelle fenêtre de 60 secondes.

      Le fichier YAML suivant est un exemple de configuration de limitation locale.

      YAML de configuration de la limitation locale

      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. Vérifiez la règle de limitation locale.

    1. Exécutez la commande suivante pour démarrer une session bash dans le conteneur sleep :

      kubectl exec -it deploy/sleep -- sh
    2. Exécutez la commande suivante pour envoyer 10 requêtes :

      for i in $(seq 1 10); do curl -v http://httpbin:8000/headers; done
    3. Exécutez la commande suivante pour envoyer une onzième requête :

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

      Sortie attendue :

      *   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

      La sortie affiche un code d'état HTTP 429, ce qui indique que la requête a été limitée.

Scénario 2 : Appliquer la limitation à un chemin de requête

Ce scénario montre comment appliquer la limitation locale aux requêtes envoyées vers le chemin /headers sur le port 8000 du service httpbin. Une fois configurée, la règle s'applique uniquement aux requêtes correspondant à ce chemin et à ce port spécifiques.

  1. Créez une règle de limitation locale.

    1. Connectez-vous à la console ASM. Dans le volet de navigation de gauche, sélectionnez Service Mesh > Mesh Management.

    2. Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, sélectionnez Traffic Management Center > Traffic Protection and Scheduling. Sur la page qui s'affiche, cliquez sur Create.

    3. Sur la page Create, configurez les paramètres et cliquez sur OK.

      Section

      Paramètre

      Description

      Basic Information About Throttling

      Namespace

      Le namespace où réside la charge de travail affectée par la limitation locale. Dans cet exemple, sélectionnez default.

      Name

      Un nom personnalisé pour la configuration de limitation locale. Dans cet exemple, saisissez httpbin.

      Type of Effective Workload

      Le type de charge de travail auquel s'applique la règle de limitation. Valeurs valides : Application Service et Gateway. Dans cet exemple, sélectionnez Applicable Application.

      Relevant Workload

      Saisissez un ensemble de paires clé-valeur de libellés pour sélectionner une charge de travail spécifique. Dans cet exemple, définissez Label Name sur app et Label Value sur httpbin.

      List of Throttling Rules

      Service Port

      Le numéro de port déclaré dans le service Kubernetes du service. Il doit s'agir d'un port HTTP. Dans cet exemple, saisissez le port HTTP 8000 du service httpbin.

      Match Request Attributes

      Définissez les conditions de correspondance pour les requêtes. La règle s'applique uniquement aux requêtes qui correspondent à ces conditions. Cet exemple utilise la configuration suivante :

      • Définissez Matched Attributes sur Request Path.

      • Définissez Matching Method sur Prefix Match.

      • Définissez Matched Content sur /headers.

      Throttling Configuration

      Spécifiez la fenêtre temporelle et le nombre maximal de requêtes autorisées dans cette fenêtre pour l'algorithme du seau de jetons. Si le nombre de requêtes envoyées dans la fenêtre temporelle dépasse cette limite, les requêtes suivantes sont limitées. Cet exemple utilise la configuration suivante :

      • Définissez Time Window for Throttling Detection sur 60s.

      • Définissez Allowed requests in window sur 10.

      Cette configuration limite la charge de travail du service à un maximum de 10 requêtes dans n'importe quelle fenêtre de 60 secondes.

  2. Vérifiez la règle de limitation locale.

    1. Exécutez la commande suivante pour démarrer une session bash dans le conteneur sleep :

      kubectl exec -it deploy/sleep -- sh
    2. Exécutez la commande suivante pour envoyer 10 requêtes :

      for i in $(seq 1 10); do curl -v http://httpbin:8000/headers; done
    3. Exécutez la commande suivante pour envoyer une onzième requête :

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

      Sortie attendue :

      *   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

      La sortie affiche un code d'état HTTP 429, ce qui indique que la requête a été limitée.

    4. Exécutez la commande suivante pour envoyer une requête vers le chemin /get du service httpbin :

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

      Sortie attendue :

      *   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"
      }

      La sortie affiche un code d'état 200 OK. Cela confirme que les requêtes vers d'autres chemins du service httpbin ne sont pas affectées par la règle de limitation.

Opérations connexes

Afficher les métriques de limitation locale

La fonctionnalité de limitation locale génère les métriques suivantes :

Métrique

Description

envoy_http_local_rate_limiter_http_local_rate_limit_enabled

Nombre total de requêtes ayant déclenché le filtre de limitation de débit.

envoy_http_local_rate_limiter_http_local_rate_limit_ok

Nombre total de requêtes autorisées car un jeton était disponible.

envoy_http_local_rate_limiter_http_local_rate_limit_rate_limited

Nombre total de requêtes signalées pour limitation car aucun jeton n'était disponible. Cela ne signifie pas que la requête a été rejetée.

envoy_http_local_rate_limiter_http_local_rate_limit_enforced

Nombre total de requêtes limitées, par exemple, ayant renvoyé une réponse 429.

Configurez le paramètre proxyStatsMatcher sur le proxy sidecar pour signaler ces métriques. Vous pouvez ensuite utiliser Prometheus pour les collecter et les consulter.

  1. Configurez le proxy sidecar pour signaler les métriques de limitation à l'aide de proxyStatsMatcher.

    Lorsque vous configurez proxyStatsMatcher, sélectionnez Regular Expression Match et définissez-le sur .*http_local_rate_limit.*. Vous pouvez également cliquer sur Add Local Throttling Metrics. Pour plus d'informations, consultez proxyStatsMatcher.

  2. Redéployez le service httpbin. Pour plus d'informations, consultez Redéployer des charges de travail.

  3. Terminez la configuration de la limitation locale et envoyez des requêtes de test comme décrit dans Scénario 1 ou Scénario 2.

  4. Exécutez la commande suivante pour afficher les métriques de limitation locale pour le service httpbin :

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

    Sortie attendue :

    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

Configurer la collecte de métriques et les alertes

Après avoir configuré le signalement des métriques, vous pouvez définir la collecte de métriques dans Prometheus et créer des règles d'alerte basées sur les métriques clés pour recevoir des notifications en temps opportun lorsque la limitation se produit. L'exemple suivant utilise Managed Service for Prometheus.

  1. Dans Managed Service for Prometheus, ajoutez le composant Alibaba Cloud ASM à votre cluster de plan de données ou mettez-le à niveau vers la dernière version. Cela garantit que Managed Service for Prometheus peut extraire les métriques de limitation locale exposées. Pour plus d'informations, consultez Gestion de l'intégration. Si vous avez déjà intégré une instance Prometheus gérée en interne pour collecter les métriques du maillage de services, vous n'avez pas besoin d'effectuer cette étape. Pour plus d'informations, consultez Intégrer une instance Prometheus gérée en interne pour la surveillance du maillage.

  2. Créez une règle d'alerte pour la limitation locale. Pour plus d'informations, consultez Créer une règle d'alerte Prometheus à l'aide d'une requête PromQL personnalisée. Le tableau suivant fournit un exemple de configuration des paramètres clés. Vous pouvez configurer les autres paramètres selon vos besoins.

    Paramètre

    Exemple

    Description

    Requête PromQL personnalisée

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

    Cette requête PromQL utilise la fonction increase pour trouver le nombre de requêtes limitées au cours de la dernière minute, groupées par le namespace et le nom du pod. Une alerte est déclenchée si le nombre de requêtes limitées en une minute est supérieur à 0.

    Message d'alerte

    Une limitation locale s'est produite ! Namespace : {{$labels.namespace}}, Pod : {{$labels.pod_name}}. Requêtes limitées au cours de la dernière minute : {{ $value }}

    Le contenu de la notification d'alerte. Ce message d'exemple inclut le namespace et le nom du pod qui a déclenché l'alerte, ainsi que le nombre de requêtes qui ont été limitées au cours de la dernière minute.

FAQ

Pourquoi ma règle de limitation ne fonctionne-t-elle pas ?

Protocole de service incorrect

La limitation locale prend en charge uniquement le protocole HTTP. Avant de configurer une règle de limitation, assurez-vous que votre service communique via HTTP ou un protocole de couche application basé sur HTTP, tel que gRPC ou Dubbo3.

De plus, vous devez définir correctement le protocole du service afin que le maillage de services puisse l'identifier avec précision. Pour plus d'informations, consultez Comment définir correctement le type de protocole pour un service.

Impact du CRD Sidecar sur le trafic entrant

Par défaut, le maillage de services configure automatiquement un écouteur de trafic entrant pour le proxy sidecar en fonction des déclarations de port dans la définition du service. La limitation locale et la limitation de débit globale reposent toutes deux sur ce comportement par défaut.

Vous pouvez utiliser une définition de ressource personnalisée (CRD) Sidecar pour modifier la configuration du trafic entrant par défaut du service, par exemple pour permettre à d'autres pods d'accéder à une application qui écoute sur localhost. Pour plus d'informations, consultez Comment exposer une application localhost à d'autres pods.

Dans ce cas, comme l'écouteur par défaut est modifié, spécifier le port du service Kubernetes dans la règle de limitation locale ne fonctionnera pas. Vous devez plutôt définir le Service Port dans la règle de limitation locale sur le port entrant réel spécifié dans le CRD Sidecar.

Par exemple, si vous configurez le CRD Sidecar suivant pour le service httpbin tout en essayant d'appliquer la limitation locale au port 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

Lorsque vous créez la règle de limitation locale, vous devez définir le Service Port sur 80, et non sur 8000.

Documents connexes