En cas de trafic élevé, de surcharge potentielle des services, d'épuisement des ressources ou d'attaques malveillantes, configurez la limitation de débit local dans le centre de gestion du trafic pour maintenir le trafic dans les seuils souhaités. Cela garantit la disponibilité continue et la stabilité des performances de vos services. Un proxy Envoy implémente la limitation de débit local en utilisant l'algorithme du seau à jetons pour contrôler le nombre de requêtes envoyées à un service. Cet algorithme ajoute périodiquement des jetons au seau. Le proxy Envoy retire un jeton du seau à chaque traitement de requête. Lorsque les jetons sont épuisés, le système cesse d'accepter les nouvelles requêtes, empêchant ainsi efficacement la surcharge.
Prérequis
-
Vous avez créé une instance Service Mesh (ASM) qui répond aux exigences suivantes :
Si l'instance ASM est de l'édition Enterprise ou Ultimate, sa version doit être 1.14.3 ou ultérieure. Si la version est antérieure à 1.14.3, mettez à jour l'instance. Pour plus d'informations, consultez la rubrique Mettre à jour une instance ASM.
Si l'instance ASM est de l'édition Standard, sa version doit être 1.9 ou ultérieure. Par ailleurs, vous ne pouvez utiliser que la fonctionnalité native de limitation de débit d'Istio pour mettre en œuvre la limitation de débit local sur l'instance ASM. La documentation de référence varie selon la version d'Istio. Pour savoir comment configurer la limitation de débit local avec la dernière version d'Istio, consultez la page Enabling Rate Limits using Envoy.
L'injection automatique du proxy sidecar est activée pour l'espace de noms par défaut dans le cluster Container Service for Kubernetes (ACK). Pour plus d'informations, reportez-vous à la section « Activer l'injection automatique du proxy sidecar » de la rubrique Gérer les espaces de noms globaux.
Les exemples de services httpbin et sleep sont déployés, et le service sleep peut accéder au service httpbin. Pour obtenir des instructions, consultez la rubrique Déployer l'application httpbin.
Scénario 1 : Configurer une règle de limitation de débit pour les requêtes destinées à un port spécifique d'un service
Configurez une règle de limitation de débit sur le port 8000 du service HTTPBin. Une fois la règle configurée, toutes les requêtes destinées au port 8000 du service HTTPBin seront soumises à cette limitation.
-
Créez une règle de limitation de débit local.
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez .
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez . Sur la page qui s'affiche, cliquez sur Create.
-
Sur la page Create, configurez les paramètres suivants, puis cliquez sur OK.
Section
Parameter
Description
Basic Information About Throttling
Namespace
Sélectionnez l'espace de noms de la charge de travail soumise à la limitation de débit. Pour cet exemple, sélectionnez default.
Name
Le nom de la règle de limitation de débit local. Pour cet exemple, saisissez httpbin.
Type of Effective Workload
Spécifie le type de charge de travail auquel s'applique la limitation de débit. Les options disponibles sont Application Service et Gateway. Pour cet exemple, sélectionnez Applicable Application.
Relevant Workload
Saisissez des paires clé-valeur pour sélectionner la charge de travail cible. Pour cet exemple, définissez le Label Name sur app et le Label Value sur httpbin.
List of Throttling Rules
Service Port
Le port HTTP déclaré dans le service Kubernetes du service HTTPBin. Pour cet exemple, saisissez le port HTTP 8000 du service HTTPBin.
Throttling Configuration
Spécifie la durée de la fenêtre temporelle pour la détection de la limitation de débit local et le nombre de requêtes autorisées dans cette fenêtre. Si le nombre de requêtes envoyées pendant la fenêtre temporelle dépasse la limite supérieure, la limitation de débit est déclenchée pour ces requêtes. Les configurations suivantes sont utilisées dans cet exemple :
-
Time Window for Throttling Detection : 60 secondes.
Définissez le paramètre Number of Requests Allowed in Time Window sur 10.
Les configurations précédentes indiquent que les requêtes destinées aux charges de travail de ce service ne peuvent pas dépasser 10 en 60 secondes.
Le code YAML suivant présente les configurations de la règle de limitation de débit local spécifiée dans la figure précédente :
-
-
Vérifiez la règle de limitation de débit local.
-
Exécutez la commande suivante pour activer bash pour le service sleep :
kubectl exec -it deploy/sleep -- sh -
Exécutez la commande suivante pour envoyer 10 requêtes :
for i in $(seq 1 10); do curl -v http://httpbin:8000/headers; done -
Exécutez la commande suivante pour envoyer la 11ᵉ requête :
curl -v http://httpbin:8000/headersRésultat attendu :
* 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: 2Le résultat indique que le code d'état HTTP 429 est renvoyé. La limitation de débit est appliquée aux requêtes.
-
Scénario 2 : Configurer une règle de limitation de débit pour les requêtes destinées à un chemin spécifié sur un port spécifique d'un service
Ce scénario montre comment limiter le débit des requêtes vers le chemin /headers sur le port 8000 du service httpbin.
-
Créez une règle de limitation de débit local.
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez .
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez . Sur la page qui s'affiche, cliquez sur Create.
-
Sur la page Create, configurez les paramètres suivants, puis cliquez sur OK.
Section
Parameter
Description
Basic Information About Throttling
Namespace
Sélectionnez l'espace de noms de la charge de travail soumise à la limitation de débit. Pour cet exemple, sélectionnez default.
Name
Le nom de la règle de limitation de débit local. Pour cet exemple, saisissez httpbin.
Type of Effective Workload
Spécifie le type de charge de travail auquel s'applique la limitation de débit. Les options disponibles sont Application Service et Gateway. Pour cet exemple, sélectionnez Applicable Application.
Relevant Workload
Saisissez des paires clé-valeur pour sélectionner la charge de travail cible. Pour cet exemple, définissez le Label Name sur app et le Label Value sur httpbin.
List of Throttling Rules
Service Port
Le port HTTP déclaré dans le service Kubernetes du service HTTPBin. Pour cet exemple, saisissez le port HTTP 8000 du service HTTPBin.
Match Request Attributes
Les règles de correspondance des requêtes. La limitation de débit configurée est déclenchée lorsque les requêtes satisfont aux règles de correspondance. Les configurations suivantes sont utilisées dans cet exemple :
-
Matched Attributes : Sélectionnez Request Path.
-
Matching Method : Sélectionnez Prefix Match.
-
Matched Content : Saisissez
/headers.
Throttling Configuration
Spécifie la durée de la fenêtre temporelle pour la détection de la limitation de débit local et le nombre de requêtes autorisées dans cette fenêtre. Si le nombre de requêtes envoyées pendant la fenêtre temporelle dépasse la limite supérieure, la limitation de débit est déclenchée pour ces requêtes. Les configurations suivantes sont utilisées dans cet exemple :
-
Time Window for Throttling Detection : 60 secondes.
Définissez le paramètre Number of Requests Allowed in Time Window sur 10.
Les configurations précédentes indiquent que les requêtes destinées aux charges de travail de ce service ne peuvent pas dépasser 10 en 60 secondes.
-
-
Vérifiez la règle de limitation de débit local.
-
Exécutez la commande suivante pour activer bash pour le service sleep :
kubectl exec -it deploy/sleep -- sh -
Exécutez la commande suivante pour envoyer 10 requêtes :
for i in $(seq 1 10); do curl -v http://httpbin:8000/headers; done -
Exécutez la commande suivante pour envoyer la 11ᵉ requête :
curl -v http://httpbin:8000/headersRésultat attendu :
* 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: 2Le résultat indique que le code d'état HTTP 429 est renvoyé. La limitation de débit est appliquée aux requêtes.
-
Envoyez une requête vers le chemin
/getdu service httpbin en exécutant la commande suivante :curl -v http://httpbin:8000/getRésultat attendu :
* 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" }Le résultat indique que le code d'état HTTP 200 est renvoyé. Les requêtes destinées à d'autres chemins du service HTTPBin ne sont pas contrôlées par la règle de limitation de débit.
-
Opérations connexes
Afficher les métriques liées à la limitation de débit local
La fonctionnalité de limitation de débit local génère les métriques répertoriées dans le tableau suivant.
|
Metric |
Description |
|
envoy_http_local_rate_limiter_http_local_rate_limit_enabled |
Nombre total de requêtes pour lesquelles la limitation de débit est déclenchée |
|
envoy_http_local_rate_limiter_http_local_rate_limit_ok |
Nombre total de réponses aux requêtes disposant de jetons dans le seau à jetons |
|
envoy_http_local_rate_limiter_http_local_rate_limit_rate_limited |
Nombre total de requêtes ne disposant d'aucun jeton disponible (la limitation de débit n'est pas nécessairement appliquée) |
|
envoy_http_local_rate_limiter_http_local_rate_limit_enforced |
Nombre total de requêtes auxquelles la limitation de débit a été appliquée (par exemple, le code d'état HTTP 429 est renvoyé) |
Configurez le paramètre proxyStatsMatcher d'un proxy sidecar pour permettre à ce dernier de rapporter les métriques. Utilisez ensuite Prometheus pour collecter et afficher les métriques liées à la limitation de débit.
-
Configurez le paramètre proxyStatsMatcher pour permettre à un proxy sidecar de rapporter les métriques liées à la limitation de débit.
Lors de la configuration de
proxyStatsMatcher, sélectionnez Regular Expression Match et définissez la valeur sur.*http_local_rate_limit.*, ou cliquez sur Add Local Throttling Metrics. Pour plus d'informations, consultez la rubrique proxyStatsMatcher. Redéployez le service httpbin. Pour plus d'informations, consultez la rubrique Redéployer les charges de travail.
Configurez la limitation de débit local et effectuez des tests de requêtes en vous référant au Scénario 1 ou au Scénario 2.
-
Exécutez la commande suivante pour afficher les métriques de limitation de débit local du service HTTPBin :
kubectl exec -it deploy/httpbin -c istio-proxy -- curl localhost:15020/stats/prometheus|grep http_local_rate_limitRésultat attendu :
>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 les métriques et les alertes de limitation de débit local
Après avoir configuré le rapport des métriques pour la limitation de débit local, utilisez Prometheus pour collecter ces métriques et créer des règles d'alerte qui fournissent des notifications en temps opportun lorsque la limitation de débit est déclenchée. L'exemple suivant utilise Managed Service for Prometheus pour illustrer la configuration de la collecte de métriques et des alertes.
Dans Managed Service for Prometheus, ajoutez ou mettez à jour le composant Alibaba Cloud ASM de votre cluster de plan de données vers la dernière version. Cela garantit que Managed Service for Prometheus peut collecter les métriques de limitation de débit local exposées. Pour plus d'informations, consultez la rubrique Gérer les composants d'intégration. Si vous avez déjà intégré un système Prometheus autonome pour l'observabilité du maillage afin de collecter les métriques du maillage de services, vous pouvez ignorer cette étape.
-
Créez une règle d'alerte pour la limitation de débit local. Pour des instructions détaillées, consultez la rubrique Créer une règle d'alerte Prometheus à l'aide d'une requête PromQL personnalisée. Le tableau suivant fournit un exemple des principaux paramètres. Configurez les autres paramètres selon vos besoins.
Parameter
Example
Description
Custom PromQL query
(sum by(namespace, pod_name) (increase(envoy_http_local_rate_limiter_http_local_rate_limit_enforced[1m]))) > 0
Cette requête PromQL utilise
increasepour compter le nombre de requêtes limitées dans la dernière minute, groupées par l'espace de noms et le nom du pod où la limitation s'est produite. Une alerte est déclenchée si le nombre de requêtes limitées en une minute est supérieur à 0.Alert content
Local rate limit triggered! Namespace: {{$labels.namespace}}, Pod: {{$labels.pod_name}}. Number of rate-limited requests in the last minute: {{ $value }}
Ce message inclut l'espace de noms et le nom du pod où la limitation de débit a été déclenchée, ainsi que le nombre de requêtes limitées dans la dernière minute.
FAQ
Règle de limitation de débit local inefficace
Protocole de service non pris en charge ou non identifié
La limitation de débit local prend uniquement en charge le protocole HTTP. Avant de configurer une règle de limitation de débit, assurez-vous que votre service communique via HTTP ou un protocole de couche application construit sur HTTP, tel que gRPC ou Dubbo 3.0.
De plus, définissez correctement le type de protocole du service afin que le maillage de services puisse identifier correctement le protocole de couche application utilisé par le service. Pour plus d'informations, consultez la rubrique Comment définir correctement le type de protocole d'un service ?
Conflit de règle avec le CRD Sidecar
Par défaut, le maillage de services configure automatiquement les écouteurs de trafic entrant pour le proxy sidecar en fonction des déclarations de port dans la définition du service. Les fonctionnalités de limitation de débit locale et globale s'appuient sur ce comportement par défaut.
Vous pouvez utiliser un CustomResourceDefinition (CRD) Sidecar pour modifier la configuration par défaut du trafic entrant, par exemple pour permettre à d'autres pods d'accéder à une application qui écoute sur localhost. Pour plus d'informations, consultez la rubrique Comment permettre à d'autres pods d'accéder à une application qui écoute sur localhost ?
Si l'écouteur par défaut est modifié, la spécification directe du port de service dans la règle de limitation de débit local ne fonctionnera pas. Dans ce cas, configurez le port de service dans la règle de limitation de débit local pour qu'il corresponde au port entrant réel spécifié dans le CRD Sidecar.
Par exemple, si vous limitez le débit du port 8000 du service httpbin et avez configuré le CRD Sidecar suivant pour celui-ci :
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
Lors de la création de la règle de limitation de débit local, définissez le port de service sur 80, et non sur 8000.
Références
Si votre instance ASM est en version 1.19.0 ou ultérieure, vous pouvez utiliser le champ
limit_overridesdans le fichier YAML de limitation de débit local pour faire correspondre d'autres attributs de requête, tels que les paramètres de requête. Pour plus d'informations, consultez la rubrique Référence CRD ASMLocalRateLimiter.Utilisez ASMGlobalRateLimiter pour configurer la limitation de débit global pour les passerelles d'entrée et le trafic entrant dirigé vers les services. Pour plus d'informations, consultez la rubrique Utiliser ASMGlobalRateLimiter pour configurer la limitation de débit global pour le trafic entrant dirigé vers un service dans lequel un proxy sidecar est injecté.
Vous pouvez configurer la limitation de débit local ou global pour une passerelle d'entrée dans la console ASM. Pour plus d'informations, consultez les rubriques Configurer la limitation de débit local sur une passerelle d'entrée et Configurer la limitation de débit global sur une passerelle d'entrée.
Utilisez la fonctionnalité de préchauffage (warm-up) pour augmenter progressivement le nombre de requêtes sur une période donnée afin d'éviter des problèmes tels que les délais d'expiration des requêtes et la perte de données. Pour plus d'informations, consultez la rubrique Utiliser la fonctionnalité de préchauffage.
Configurez le champ connectionPool pour mettre en œuvre le disjoncteur (circuit breaking). Le disjoncteur permet de protéger votre système contre d'autres dommages en cas de défaillance ou de surcharge du système. Pour plus d'informations, consultez la rubrique Configurer le champ connectionPool pour mettre en œuvre le disjoncteur.