Lors d'événements à fort trafic, tels que les ventes flash, des pics soudains peuvent submerger votre système, entraînant des files d'attente de requêtes et des pannes de service. ASM propose une fonctionnalité de limitation de débit local permettant de contrôler le trafic au niveau de la passerelle d'entrée et de protéger vos services backend. Cette rubrique explique comment configurer cette fonctionnalité.
Prérequis
-
Vous disposez d'une instance ASM répondant aux exigences suivantes :
ASM Enterprise Edition ou Ultimate Edition : version 1.11.5.30 ou ultérieure. Pour plus d'informations sur la mise à niveau d'une instance ASM, reportez-vous à la section Mettre à niveau une instance ASM.
ASM Standard Edition : version 1.9 ou ultérieure. Cette édition prend en charge la limitation de débit local uniquement via la méthode native Istio. Selon la version d'Istio utilisée, consultez la documentation correspondante. Pour la dernière version d'Istio, voir Enabling Rate Limits using Envoy.
Une passerelle d'entrée est déployée. Pour plus d'informations, reportez-vous à la section Créer une passerelle d'entrée.
-
Vous avez créé les services bookinfo et nginx. Dans cette rubrique, le service bookinfo est déployé dans l'espace de noms default, et le service nginx est déployé dans l'espace de noms foo. Pour plus d'informations sur la création du service bookinfo, reportez-vous à la section Déployer une application dans un cluster associé à une instance ASM.
-
Vous avez créé une passerelle et un service virtuel. Pour plus d'informations, reportez-vous aux sections Gérer les passerelles et Gérer les services virtuels.
Vous avez installé un outil de test de charge. Pour plus d'informations, voir hey.
Applicabilité
La fonctionnalité de limitation de débit local dans ASM s'applique aux passerelles ASM et aux services d'application disposant d'un sidecar injecté.
Cas d'utilisation
Cette rubrique utilise les services bookinfo et nginx pour illustrer l'utilisation de la limitation de débit pour les passerelles et les services. Le service nginx est déployé dans l'espace de noms foo afin de vérifier la portée de la limitation de débit.
Scénario 1 : Limiter le débit d'une route de service virtuel
Configurez une règle de limitation de débit pour la route productpage-route-name1 sur la combinaison domaine et port bf2.example.com:80. productpage-route-name1 est une route du service virtuel bookinfo créée dans la section Prérequis. Elle correspond aux requêtes pour des chemins tels que /productpage, /static, /login et /logout, et les transfère vers le service productpage. Une fois la règle de limitation de débit configurée, elle limite le taux de trafic pour les requêtes adressées à ces chemins.
-
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 comme décrit ci-dessous et cliquez sur OK.
Pour plus d'informations sur les paramètres, reportez-vous à la section Référence CRD ASMLocalRateLimiter.
Section
Paramètre
Description
Basic Information About Throttling
Namespaces
L'espace de noms de la règle de limitation de débit local. Il doit correspondre à l'espace de noms de la charge de travail limitée. Dans cet exemple, vous devez sélectionner istio-system, car toutes les passerelles ASM sont déployées dans l'espace de noms istio-system.
Name
Un nom personnalisé pour la configuration de limitation de débit local. Cet exemple utilise ingressgateway.
Type of Effective Workload
Le type de charge de travail auquel s'applique la limitation de débit. Les valeurs prises en charge sont Applicable Service et Applicable Gateway. Cet exemple utilise Applicable Gateway.
Relevant Workload
Si vous sélectionnez Applicable Gateway, vous devez également choisir une option Select Istio Gateway. La règle s'applique à la charge de travail associée à la passerelle sélectionnée. Cet exemple utilise bookinfo-gateway.
List of Throttling Rules
Gateway Domain Name
Sélectionnez un domaine déclaré dans la passerelle. La règle de limitation de débit s'applique à la combinaison port et domaine spécifiée. Cet exemple utilise bf2.example.com.
Gateway Port
Sélectionnez un port déclaré dans la passerelle. La règle de limitation de débit s'applique à la combinaison port et domaine spécifiée. Cet exemple utilise 80.
Match Routes of Virtual Service
Sélectionnez une route déclarée dans le service virtuel associé à la passerelle. La règle de limitation de débit s'applique à la route de service virtuel spécifiée. Cet exemple utilise productpage-route-name1.
Throttling Configuration
Spécifiez la fenêtre de détection et le nombre de requêtes autorisées pour l'algorithme de bucket de jetons de limitation de débit local. Les requêtes dépassant la limite dans la fenêtre de détection sont limitées. Dans cet exemple, utilisez les configurations suivantes :
-
Définissez Time Window for Throttling Detection sur 1s.
-
Définissez Number of Requests Allowed in Time Window sur 10.
Ces paramètres limitent les requêtes adressées à la charge de travail de service à 10 par seconde.
advanced config
Cliquez sur Show Advanced Settings pour spécifier les comportements avancés en cas de limitation de débit. Vous pouvez configurer les paramètres avancés selon vos besoins. Dans cet exemple, définissez Custom Throttling Response Body sur
{"ret_code": xxx,"message": "Your request be limited"}.Le code suivant présente le fichier YAML pour la configuration de limitation de débit local.
-
Si vous ne configurez pas les paramètres avancés, le système renvoie la réponse par défaut lorsque la limitation de débit est déclenchée.
-
Si vous configurez les paramètres avancés, le système renvoie une réponse personnalisée lorsque la limitation de débit est déclenchée.
-
-
Exécutez les commandes suivantes dans l'outil hey pour générer en continu un trafic de stress.
hey -host bf2.example.com -c 10 -n 100000 http://${ASM_GATEWAY_IP}/productpagehey -host bf2.example.com -c 10 -n 100000 http://${ASM_GATEWAY_IP}/nginx -
Exécutez la commande suivante pour accéder au chemin /productpage de la passerelle.
curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/productpage -vRésultat attendu :
< HTTP/1.1 429 Too Many Requests < Content-Length: 18 < Content-Type: text/plain < Date: Thu, 13 Jan 2022 03:03:09 GMT < Server: istio-envoy < local_rate_limitedLe résultat indique que l'accès au service bookinfo est limité.
-
Exécutez la commande suivante pour accéder au chemin /nginx de la passerelle.
curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/nginx -vLa réponse ne contient pas de code d'état 429, ce qui indique que l'accès n'est pas limité.
Scénario 2 : Limiter le débit d'un domaine et d'un port de passerelle
Configurez une règle de limitation de débit pour la combinaison domaine et port bf2.example.com:80 afin de limiter le trafic vers tous les chemins associés à cette combinaison.
-
Configurez une règle de limitation de débit.
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, sélectionnez .
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, sélectionnez . Sur la page qui s'affiche, cliquez sur Create.
-
Sur la page Create, configurez les paramètres comme décrit ci-dessous et cliquez sur OK.
Pour plus d'informations sur les paramètres, consultez la rubrique Référence CRD ASMLocalRateLimiter.
Section
Paramètre
Description
Basic Information About Throttling
Namespaces
Le namespace pour la règle de limitation de débit local. Il doit correspondre au namespace de la charge de travail limitée. Dans cet exemple, vous devez sélectionner istio-system car toutes les passerelles ASM sont déployées dans le namespace istio-system.
Name
Un nom personnalisé pour la configuration de limitation de débit local. Cet exemple utilise ingressgateway.
Type of Effective Workload
Le type de charge de travail auquel s'applique la limitation de débit. Les valeurs prises en charge sont Applicable Service et Applicable Gateway. Cet exemple utilise Applicable Gateway.
Relevant Workload
Si vous sélectionnez Applicable Gateway, vous devez également choisir une option Select Istio Gateway. La règle s'applique à la charge de travail associée à la passerelle sélectionnée. Cet exemple utilise bookinfo-gateway.
List of Throttling Rules
Gateway Domain Name
Sélectionnez un domaine déclaré dans la passerelle. La règle de limitation de débit s'applique à la combinaison port et domaine spécifiée. Cet exemple utilise bf2.example.com.
Gateway Port
Sélectionnez un port déclaré dans la passerelle. La règle de limitation de débit s'applique à la combinaison port et domaine spécifiée. Cet exemple utilise 80.
Match Routes of Virtual Service
Ne sélectionnez aucune route dans cet exemple. Cela applique la règle de limitation de débit à toutes les routes pour le domaine et le port spécifiés.
Throttling Configuration
Spécifiez la fenêtre de détection et le nombre de requêtes autorisées pour l'algorithme de bucket de jetons de limitation de débit local. Les requêtes dépassant la limite dans la fenêtre de détection sont limitées. Dans cet exemple, utilisez les configurations suivantes :
-
Définissez Time Window for Throttling Detection sur 1s.
-
Définissez Number of Requests Allowed in Time Window sur 10.
Ces paramètres limitent les requêtes vers la charge de travail du service à 10 par seconde.
Le code suivant présente le fichier YAML de la configuration de limitation de débit local.
-
-
Exécutez la commande suivante dans l'outil hey pour générer en continu un trafic de stress.
hey -host bf2.example.com -c 10 -n 100000 http://${ASM_GATEWAY_IP}/nginx -
Exécutez la commande suivante pour accéder au chemin /nginx de la passerelle.
curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/nginx -vLa réponse renvoie
HTTP/1.1 429 Too Many Requests, ce qui indique que l'accès au chemin /nginx sur la passerelle est limité. -
Configurez une règle de limitation de débit.
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, sélectionnez .
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, sélectionnez . Sur la page qui s'affiche, cliquez sur Create.
-
Sur la page Create, configurez les paramètres comme décrit ci-dessous et cliquez sur OK.
Pour plus d'informations sur les paramètres, consultez la Référence CRD ASMLocalRateLimiter.
Section
Paramètre
Description
Basic Information About Throttling
Namespaces
Le namespace pour la règle de limitation de débit local. Il doit s'agir du même namespace que celui de la charge de travail soumise à la limitation. Dans cet exemple, vous devez sélectionner istio-system car toutes les passerelles ASM sont déployées dans le namespace istio-system.
Name
Un nom personnalisé pour la configuration de limitation de débit local. Cet exemple utilise ingressgateway.
Type of Effective Workload
Le type de charge de travail auquel s'applique la limitation de débit. Les valeurs prises en charge sont Applicable Service et Applicable Gateway. Cet exemple utilise Applicable Gateway.
Relevant Workload
Si vous sélectionnez Applicable Gateway, vous devez également sélectionner une option Select Istio Gateway. La règle s'applique à la charge de travail associée à la passerelle sélectionnée. Cet exemple utilise bookinfo-gateway.
List of Throttling Rules
Gateway Domain Name
Sélectionnez un domaine déclaré dans la passerelle. La règle de limitation de débit s'applique à la combinaison port et domaine spécifiée. Cet exemple utilise bf2.example.com.
Gateway Port
Sélectionnez un port déclaré dans la passerelle. La règle de limitation de débit s'applique à la combinaison port et domaine spécifiée. Cet exemple utilise 80.
Match Routes of Virtual Service
Sélectionnez une route déclarée dans le service virtuel associé à la passerelle. La règle de limitation de débit s'applique à la route du service virtuel spécifiée. Cet exemple utilise nginx-route-name1.
Match Request Attributes
Spécifiez une condition de correspondance de requête pour déclencher la règle de limitation de débit. Dans cet exemple, utilisez les configurations suivantes :
-
Définissez Matched Attributes sur Specific Request Header.
-
Définissez Request Header sur ratelimit.
-
Définissez Matching Method sur Exact Match.
-
Définissez Matched Content sur true.
Throttling Configuration
Spécifiez la fenêtre de détection et le nombre de requêtes autorisées pour l'algorithme de bucket de jetons de limitation de débit local. Les requêtes dépassant la limite dans la fenêtre de détection sont limitées. Dans cet exemple, utilisez les configurations suivantes :
-
Définissez Time Window for Throttling Detection sur 1s.
-
Définissez Nombre de requêtes autorisées dans la fenêtre temporelle sur 10.
Ces paramètres limitent les requêtes adressées à la charge de travail du service à 10 par seconde.
Le code suivant présente le fichier YAML pour la configuration de limitation de débit local.
-
-
Exécutez la commande suivante dans l'outil hey pour générer en continu un trafic de stress. Les requêtes contiennent toutes l'en-tête de requête
ratelimit: truepour déclencher la limitation de débit.hey -host bf2.example.com -H 'ratelimit: true' -c 10 -n 10000 http://${ASM_GATEWAY_IP}/nginx -
Exécutez la commande suivante pour accéder au chemin
/nginxde la passerelle.curl -H 'host: bf2.example.com' -H 'ratelimit: true' http://${ASM_GATEWAY_IP}/nginx -vLa réponse renvoie
HTTP/1.1 429 Too Many Requests, ce qui indique que les requêtes adressées au chemin/nginxde la passerelle avec l'en-tête de requêteratelimit: truesont limitées. -
Exécutez la commande suivante pour accéder au chemin
/nginxde la passerelle, mais sans l'en-tête de requêteratelimit: true.curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/nginx -vLa réponse n'inclut pas de code d'état 429, ce qui indique que les requêtes sans l'en-tête de requête
ratelimit: truene sont pas limitées. -
Supprimez la règle de limitation de débit.
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, sélectionnez .
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, sélectionnez .
Sur la page Rate Limiting, recherchez la règle de limitation de débit cible, cliquez sur Delete dans la colonne Actions, puis cliquez sur OK dans la boîte de dialogue Submit.
-
Exécutez la commande suivante pour accéder au chemin
/nginxde la passerelle.curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/nginx -vLa réponse n'inclut pas de code d'état 429, ce qui indique que l'accès n'est pas limité.
Scénario 3 : Limitation de débit par en-tête de requête
Configurez une règle de limitation de débit pour la route nginx-route-name1 sur la combinaison domaine et port bf2.example.com:80. Vous pouvez spécifier que la règle de limitation de débit s'applique uniquement aux requêtes contenant l'en-tête de requête ratelimit: "true". Cette règle n'affecte pas les autres requêtes adressées à la route. nginx-route-name1 est une route du service virtuel bookinfo créée dans la section Prérequis. Elle correspond aux requêtes pour le chemin /nginx et les transfère vers le service nginx.