Pour gérer les pics de trafic, la surcharge des services, l'épuisement des ressources ou les attaques malveillantes, configurez une limitation de débit globale sur des routes de passerelle spécifiques. Cela permet un contrôle précis du trafic afin de protéger les services backend, de réduire les coûts et d'améliorer l'expérience utilisateur.
Prérequis
Vous avez ajouté un cluster ACK managé à une instance ASM de version 1.18.0.131 ou ultérieure. Pour plus d'informations, consultez la rubrique Ajouter un cluster à une instance ASM.
Vous avez activé l'injection automatique pour le namespace
defaultdans le cluster Kubernetes. Pour plus d'informations, consultez la rubrique Activer l'injection automatique du proxy sidecar.Vous avez créé une passerelle d'entrée nommée
ingressgateway, avec le port 80 activé. Pour plus d'informations, consultez la rubrique Créer une passerelle d'entrée.
Avant de commencer
Déployer le service de limitation de débit
-
Créez un fichier nommé ratelimit-svc.yaml avec le contenu suivant.
-
Dans l'environnement kubeconfig de votre cluster ACK, exécutez la commande suivante pour créer le service de limitation de débit ainsi que le service Redis requis.
Pour savoir comment se connecter à un cluster à l'aide de kubectl, consultez la rubrique Obtenir le fichier kubeconfig d'un cluster et utiliser kubectl pour s'y connecter.
kubectl apply -f ratelimit-svc.yaml
Déployer l'exemple d'application Bookinfo
Téléchargez le manifeste YAML de l'application Bookinfo (bookinfo.yaml) depuis le dépôt du projet Istio sur GitHub.
-
Dans l'environnement kubeconfig de votre cluster ACK, exécutez la commande suivante pour déployer l'application Bookinfo dans le cluster associé à l'instance ASM.
kubectl apply -f bookinfo.yaml -
Créez le fichier bookinfo-gateway.yaml avec le contenu suivant.
-
Dans l'environnement kubeconfig de votre instance ASM, exécutez la commande suivante pour créer une règle de routage pour l'application Bookinfo sur la passerelle d'entrée.
La règle de routage est nommée
productpage-route-name1et correspond aux requêtes pour le domainebf2.example.com. Pour savoir comment se connecter à une instance ASM à l'aide de kubectl, consultez la rubrique Accéder aux ressources Istio à l'aide de kubectl du plan de contrôle.kubectl apply -f bookinfo-gateway.yaml
Scénario 1 : Configurer une limitation de débit globale sur une route de passerelle
Ce scénario montre comment configurer une règle de limitation de débit pour la route productpage-route-name1, qui s'applique à la combinaison nom de domaine et port bf2.example.com:80. productpage-route-name1 est une entrée de route dans le VirtualService bookinfo que vous avez créé dans la section Avant de commencer. Cette route correspond aux requêtes pour les chemins tels que /productpage, /static, /login et /logout, et les transfère vers le service productpage. Une fois la règle configurée, la limitation de débit spécifiée s'applique à toutes les requêtes pour ces chemins.
-
Créez un fichier nommé global-ratelimit-gw.yaml avec le contenu suivant.
Le tableau suivant décrit les champs clés. Pour plus de détails, consultez la rubrique Référence CRD ASMGlobalRateLimiter.
Paramètre
Description
workloadSelectorSélectionne la charge de travail pour la limitation de débit. Dans cet exemple, la limitation de débit globale s'applique à la charge de travail de la passerelle d'entrée, sélectionnée par le libellé
istio: ingressgateway.isGatewayIndique si la règle s'applique à une passerelle. Définissez ce paramètre sur
truepour cet exemple.rateLimitServiceSpécifie le nom de domaine, le port et le délai de connexion pour le service de limitation de débit. Sur la base du service déployé dans la section Avant de commencer, la configuration est la suivante :
host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5limitLes paramètres de limitation de débit. Le champ
unitspécifie l'intervalle de temps, etquotaspécifie le nombre de requêtes autorisées par intervalle.Dans cet exemple,
unitest défini surMINUTEetquotaest défini sur1. Cela n'autorise qu'une seule requête par minute pour la route correspondante. Le système rejette les requêtes suivantes.vhostLes conditions de correspondance pour le nom de domaine et la route. Le champ
namedoit correspondre au nom de domaine dans le VirtualService, et le champportdoit correspondre au port de la passerelle d'entrée. Le nom de route spécifié dansroute.name_matchdoit correspondre au nom de l'entrée de route dans le VirtualService. -
Dans l'environnement kubeconfig de votre instance ASM, exécutez la commande suivante pour créer la règle de limitation de débit globale pour la route
productpage-route-name1sur la passerelle.kubectl apply -f global-ratelimit-gw.yaml -
Exécutez la commande suivante pour obtenir la configuration de la règle de limitation de débit globale réconciliée.
kubectl get asmglobalratelimiter global-test -n istio-system -o yaml -
Collez le contenu de
config.yamlissu du champstatusde la ressource ASMGlobalRateLimiter obtenue à l'étape précédente dans le fichier ratelimit-config.yaml pour générer la configuration du service de limitation de débit global.Le contenu textuel du champ
config.yamlsitué sous le champstatusde ASMGlobalRateLimiter doit être collé tel quel dans le champconfig.yamldu champdatade la ConfigMap. -
Dans l'environnement kubeconfig de votre cluster ACK, exécutez la commande suivante pour appliquer la nouvelle configuration au service de limitation de débit global.
kubectl apply -f ratelimit-config.yaml -
Exécutez la commande suivante deux fois de suite pour accéder à l'application Bookinfo.
Remplacez
<ASM_GATEWAY_IP>par l'adresse IP de votre passerelle ASM. Pour savoir comment obtenir l'adresse IP de la passerelle, consultez la rubrique Obtenir l'adresse IP d'une passerelle d'entrée.curl -H 'host: bf2.example.com' http://<ASM_GATEWAY_IP>/productpage -v curl -H 'host: bf2.example.com' http://<ASM_GATEWAY_IP>/productpage -vLa sortie attendue pour la deuxième requête est la suivante :
< 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 intactLa limitation de débit globale est configurée pour n'autoriser qu'une seule requête par minute. Lorsque vous envoyez deux requêtes consécutives, la première aboutit, mais la passerelle rejette la seconde avec un statut
429 Too Many Requests. Cela confirme que la limitation de débit globale pour la route est effective.
Scénario 2 : Limitation de débit globale sur une passerelle d'entrée
Ce scénario explique comment configurer une règle de limitation de débit globale pour la combinaison domaine et port bf2.example.com:80. Une fois la règle appliquée, toutes les requêtes envoyées à cette combinaison domaine et port sont soumises à la limite de débit spécifiée.
-
Créez un fichier nommé global-ratelimit-gw.yaml avec le contenu suivant.
Le tableau suivant décrit les champs clés. Pour plus d'informations, consultez la section Référence CRD ASMGlobalRateLimiter.
Paramètre
Description
workloadSelectorSpécifie la charge de travail cible pour la règle de limitation de débit. Dans cet exemple, la règle cible la charge de travail de la passerelle d'entrée, identifiée par le libellé
istio: ingressgateway.isGatewayIndique si la règle s'applique à une passerelle. Définissez ce paramètre sur
truepour cet exemple.rateLimitServiceSpécifie le domaine, le port et le délai d'expiration de la connexion pour le service de limitation de débit. Sur la base du service déployé lors de l'étape de Préparation, la configuration est la suivante :
host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5limitDéfinit la limite de débit. Le champ
unitspécifie l'intervalle de temps et le champquotaspécifie le nombre de requêtes autorisées par intervalle.Dans cet exemple,
unitest défini surMINUTEetquotasur1. Ce paramètre n'autorise qu'une seule requête par minute pour la route correspondante. Les requêtes suivantes envoyées durant cette minute sont rejetées.vhostSpécifie le domaine et la route à faire correspondre. Les champs
nameetportdoivent correspondre respectivement au domaine du VirtualService et au port de la passerelle d'entrée. -
Dans l'environnement kubeconfig de votre instance ASM, exécutez la commande suivante pour appliquer la règle de limitation de débit globale à la route
productpagesur la passerelle.kubectl apply -f global-ratelimit-gw.yaml -
Exécutez la commande suivante pour obtenir la configuration de la règle de limitation de débit globale réconciliée.
kubectl get asmglobalratelimiter global-test -n istio-system -o yaml -
Copiez le contenu de la clé
config.yamldu champstatusdans la sortie précédente, puis collez-le dans un fichier nommératelimit-config.yamlpour configurer le service de limitation de débit global.Le contenu sous forme de chaîne du champ
config.yamlsitué dans le champstatusde l'ASMGlobalRateLimiter doit être collé tel quel dans le champconfig.yamldu même nom, au sein du champdatadu ConfigMap. -
Dans l'environnement kubeconfig de votre cluster ACK, exécutez la commande suivante pour mettre à jour la configuration du service de limitation de débit global.
kubectl apply -f ratelimit-config.yaml -
Exécutez la commande suivante deux fois de suite pour accéder à l'application Bookinfo.
Remplacez
<ASM_GATEWAY_IP>par l'adresse IP de votre passerelle ASM. Pour savoir comment obtenir l'adresse IP de la passerelle, consultez la section Obtenir l'adresse IP d'une passerelle d'entrée.curl -H 'host: bf2.example.com' http://<ASM_GATEWAY_IP>/productpage -v curl -H 'host: bf2.example.com' http://<ASM_GATEWAY_IP>/productpage -vLe résultat attendu pour la deuxième requête est le suivant :
< 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 intactLa règle de limitation de débit globale restreint l'accès à la combinaison domaine et port
bf2.example.com:80à une requête par minute. Lorsque vous envoyez deux requêtes consécutives, la première aboutit, mais la seconde est rejetée. Cela confirme que la règle de limitation de débit sur la passerelle d'entrée fonctionne correctement.
Cas d'utilisation 3 : Limitation de débit conditionnelle sur une route de passerelle
Ce cas d'utilisation nécessite une instance ASM de version 1.19.0 ou ultérieure. Pour les instructions de mise à jour, consultez la section Mettre à jour une instance ASM.
Configurez une règle de limitation de débit pour la route productpage-route-name1 sur le domaine et le port bf2.example.com:80. La règle s'applique uniquement aux requêtes contenant l'en-tête de requête ratelimit: "true" et le paramètre de requête ratelimit=enabled. Les autres requêtes sur cette route ne sont pas affectées par la règle de limitation de débit. La route correspond aux requêtes pour des chemins tels que /productpage, /static, /login et /logout, et transfère les requêtes correspondantes vers le service productpage. Une fois la règle de limitation de débit configurée, les requêtes envoyées à ces chemins et répondant aux conditions spécifiées seront limitées en débit.
-
Créez un fichier nommé
global-ratelimit-gw.yamlavec le contenu suivant.Le tableau suivant décrit les champs clés. Pour plus d'informations, consultez la section Référence CRD ASMGlobalRateLimiter.
Paramètre
Description
workloadSelectorSpécifie les charges de travail soumises à la limitation de débit. Dans cet exemple, la limitation de débit globale s'applique à la passerelle d'entrée et est définie sur
istio: ingressgateway.isGatewayIndique si cela s'applique à la passerelle. Dans cet exemple, la valeur est définie sur
true.rateLimitServiceSpécifie le nom de domaine, le port et le délai d'expiration de la connexion pour le service de limitation de débit. Sur la base du service déployé lors de l'étape de Préparation, la configuration est la suivante :
host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5limitDéfinit les paramètres de base de limitation de débit pour la route du service virtuel. Le champ
unitspécifie l'intervalle de temps etquotaspécifie le nombre de requêtes autorisées par intervalle. Cet exemple définitunitsurSECONDetquotasur100000, ce qui autorise 100 000 requêtes par seconde. Cette limite élevée désactive efficacement la limitation de débit pour les requêtes qui ne correspondent pas à une substitution plus spécifique, garantissant ainsi qu'elles ne soient pas limitées.vhostSpécifie les conditions de correspondance pour le domaine et la route. Les champs
nameetportdoivent correspondre respectivement au domaine du service virtuel et au port de la passerelle d'entrée. Le nom de la route dansroute.name_matchdoit correspondre au nom de la route dans le service virtuel.limit_overridesRemplace la limite de débit par défaut. Utilisez ce champ pour appliquer une limite de débit plus spécifique à certaines requêtes. Dans cet exemple :
-
Sous
limit_overrides, le champrequest_matchfait correspondre les requêtes contenant à la fois l'en-tête de requêteratelimit: "true"et le paramètre de requêteratelimit=enabled. -
Dans le champ
limitdelimit_overrides, définirunitsurMINUTEetquotasur1limite les requêtes répondant aux conditions spécifiées parrequest_matchà une par minute.
-
-
Dans l'environnement kubeconfig de l'instance ASM correspondante, exécutez la commande suivante pour créer une règle de limitation de débit globale pour la route
productpage-route-name1sur la passerelle.kubectl apply -f global-ratelimit-gw.yaml -
Exécutez la commande suivante pour obtenir la configuration réconciliée de la règle de limitation de débit globale.
kubectl get asmglobalratelimiter global-test -n istio-system -o yaml -
Collez le contenu de
config.yamlissu du champstatusde la ressource ASMGlobalRateLimiter (à partir du résultat attendu de l'étape précédente) dans le fichier ratelimit-config.yaml pour générer la configuration du service de limitation de débit global.Le contenu sous forme de chaîne du champ
statussitué sous le champconfig.yamldeASMGlobalRateLimiterdoit être collé tel quel dans le champconfig.yamldu même nom, sous le champdataduConfigMap. -
Depuis votre environnement kubeconfig pour le cluster ACK, exécutez la commande suivante pour mettre à jour la configuration du service de limitation de débit global dans le cluster.
kubectl apply -f ratelimit-config.yaml -
Exécutez la commande suivante deux fois de suite pour accéder à l'application Bookinfo.
Remplacez
<ASM_GATEWAY_IP>par l'adresse IP de votre passerelle. Pour savoir comment obtenir l'adresse IP de la passerelle, consultez la section Obtenir l'adresse IP d'une passerelle d'entrée.curl -H 'host: bf2.example.com' http://<ASM_GATEWAY_IP>/productpage -v curl -H 'host: bf2.example.com' http://<ASM_GATEWAY_IP>/productpage -vLe résultat attendu pour la deuxième requête adressée à l'application Bookinfo est le suivant :
< 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 intactDans la configuration de limitation de débit globale, les requêtes adressées à l'application bookinfo sont limitées à une par minute si elles contiennent l'en-tête de requête
ratelimit: "true"et le paramètre de requêteratelimit=enabled. Lorsque vous effectuez deux requêtes consécutives vers l'application bookinfo avec cet en-tête et ce paramètre de requête, vous constatez que la première requête aboutit et que la seconde est limitée en débit, ce qui indique que la configuration de limitation de débit globale pour la correspondance de requêtes spécifiques sur la passerelle d'entrée est réussie. -
Exécutez la commande suivante pour accéder à nouveau à l'application bookinfo sans l'en-tête de requête
ratelimit: "true"ni le paramètre de requêteratelimit=enabled.curl -H 'host: bf2.example.com' http://<ASM_GATEWAY_IP>/productpage -vLa sortie montre que l'application Bookinfo est accessible avec succès et qu'aucun code d'état 429 n'est renvoyé. Cela confirme que la règle de limitation de débit n'affecte pas les autres requêtes sur la route.
Scénario 4 : Configurer la limitation basée sur l'adresse IP pour une route de service virtuel
Ce scénario nécessite une instance ASM version 1.19.0 ou ultérieure. Pour les instructions de mise à niveau, consultez Mettre à jour une instance ASM.
Pour configurer la limitation de débit pour des adresses IP client spécifiques sur une passerelle d'entrée ASM, vous devez d'abord vous assurer que la stratégie de trafic externe de la passerelle d'entrée est définie sur Local. Pour savoir comment créer une passerelle d'entrée et connaître ses options de configuration, consultez Créer une passerelle d'entrée.
Vous pouvez trouver l'adresse IP client des requêtes adressées à la passerelle dans le champ
downstream_remote_addressdu journal d'accès de la passerelle. Dans cet exemple, configurez la règle en utilisant l'adresse IP client que vous souhaitez limiter.
Ce scénario montre comment configurer une règle de limitation de débit pour la route de service virtuel productpage-route-name1, associée à la combinaison domaine et port bf2.example.com:80. La règle est conçue pour s'appliquer uniquement aux requêtes provenant d'adresses IP client spécifiques, sans affecter les autres requêtes sur la même route.
-
Créez un fichier nommé
global-ratelimit-gw.yamlavec le contenu suivant.Le tableau suivant décrit les champs clés. Pour plus de détails sur ces champs, consultez Référence CRD ASMGlobalRateLimiter.
Paramètre
Description
workloadSelectorSélectionne la charge de travail à laquelle la limitation de débit s'applique. Cet exemple applique la limitation de débit globale à la charge de travail de la passerelle d'entrée, sélectionnée à l'aide du libellé
app: istio-ingressgateway.isGatewayIndique si la règle s'applique à une passerelle. Dans cet exemple, la valeur est définie sur
true.rateLimitServiceLe domaine, le port et le délai d'expiration de la connexion pour le service de limitation de débit. Selon le service de limitation de débit déployé dans les prérequis, la configuration est la suivante :
host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5limitLes paramètres de base de limitation de débit pour la route de service virtuel. Le champ
unitspécifie l'intervalle de temps, etquotaspécifie le nombre de requêtes autorisées par intervalle.Cet exemple définit
unitsurSECONDetquotasur100000, ce qui autorise 100 000 requêtes par seconde. Cette limite élevée désactive efficacement la limitation de débit pour les requêtes qui ne correspondent pas à une substitution spécifique.vhostLes conditions de correspondance pour le domaine et la route. Les champs
nameetportdoivent correspondre respectivement au domaine du service virtuel et au port de la passerelle d'entrée. Le nom de route spécifié dansroute.name_matchdoit correspondre au nom de la route dans le service virtuel.limit_overridesDéfinit un seuil de limitation de débit plus spécifique pour certaines requêtes. Dans cet exemple :
-
Le champ
request_matchfait correspondre les requêtes en fonction de l'adresse IP source du client à l'aide deremote_address.address. Vous pouvez également spécifier une plage d'adresses IP facultative en définissant une longueur de masque de sous-réseau dans le champremote_address.v4_prefix_mask_len. -
Dans le champ
limit_overrides, le champlimitest configuré avecunitdéfini surMINUTEetquotadéfini sur1, ce qui signifie que pour les requêtes correspondant aux conditions spécifiées parrequest_match, une seule requête est autorisée par minute.
-
-
À l'aide du fichier kubeconfig de votre instance ASM, exécutez la commande suivante pour créer la règle de limitation de débit globale pour la route
productpage-route-name1sur la passerelle d'entrée.kubectl apply -f global-ratelimit-gw.yaml -
Exécutez la commande suivante pour récupérer la configuration réconciliée de la règle de limitation de débit globale.
kubectl get asmglobalratelimiter global-test -n istio-system -o yaml -
Copiez le contenu de
config.yamldepuis le champstatusde la sortie de la ressource ASMGlobalRateLimiter à l'étape précédente, et collez-le dansratelimit-config.yamlpour configurer le service de limitation de débit global.Le contenu textuel du champ
config.yaml, situé sous le champstatusde la ressource ASMGlobalRateLimiter, doit être collé tel quel dans le champconfig.yamlsous le champdatadu ConfigMap. -
À l'aide du fichier kubeconfig de votre cluster ACK, exécutez la commande suivante pour mettre à jour la configuration du service de limitation de débit global.
kubectl apply -f ratelimit-config.yaml -
Depuis un client disposant de l'adresse IP spécifiée, exécutez les commandes suivantes deux fois de suite pour accéder à l'application bookinfo.
Remplacez
<ASM_GATEWAY_IP>par votre adresse IP de passerelle réelle. Pour savoir comment obtenir l'adresse IP de la passerelle, consultez Obtenir l'adresse IP d'une passerelle d'entrée.curl -H 'host: bf2.example.com' http://<ASM_GATEWAY_IP>/productpage -v curl -H 'host: bf2.example.com' http://<ASM_GATEWAY_IP>/productpage -vLa sortie attendue pour la deuxième requête est la suivante :
< 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 intactLa configuration de limitation de débit globale limite les requêtes provenant de l'adresse IP (ou de la plage) spécifiée à une requête par minute. Lorsque vous envoyez deux requêtes consécutives depuis un client disposant de cette adresse IP, la première aboutit, mais la seconde est limitée. Cela confirme que la règle de limitation de débit globale pour la passerelle d'entrée fonctionne comme prévu.
-
Depuis un client disposant d'une adresse IP différente, exécutez la commande suivante pour accéder à nouveau à l'application bookinfo.
curl -H 'host: bf2.example.com' http://<ASM_GATEWAY_IP>/productpage -vLa requête aboutit et aucun code d'état HTTP
429n'est renvoyé. Cela indique que les autres requêtes sur la route ne sont pas affectées par la règle de limitation de débit globale.
Scénario 5 : Configurer la limitation de débit par adresse IP client sur une route
Ce scénario nécessite une instance ASM version 1.25.0 ou ultérieure. Pour les instructions de mise à niveau, consultez Mettre à niveau une instance ASM.
Dans ce scénario, vous devez définir la stratégie de trafic externe de la passerelle d'entrée ASM sur
Local. Cela permet de conserver l'adresse IP client d'origine. Pour plus d'informations sur la création d'une passerelle d'entrée et ses options de configuration, consultez Créer une passerelle d'entrée.Vous pouvez trouver l'adresse IP client d'une requête adressée à la passerelle dans le champ
downstream_remote_addressdu journal d'accès. Dans cet exemple, la règle de limitation de débit est configurée en fonction de l'adresse IP client réelle.
Dans ce scénario, vous allez configurer une règle de limitation de débit pour la route de service virtuel productpage-route-name1 à l'adresse bf2.example.com:80 afin de limiter chaque adresse IP client unique à une requête par minute.
-
Créez un fichier nommé
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: 1Le tableau suivant décrit les champs clés. Pour plus d'informations sur les champs, consultez Référence CRD ASMGlobalRateLimiter.
Paramètre
Description
workloadSelectorSélectionne la charge de travail à laquelle la règle de limitation de débit s'applique. Dans cet exemple, la limitation de débit globale est appliquée à la passerelle d'entrée, sélectionnée par le libellé
app: istio-ingressgateway.isGatewayIndique si la règle s'applique à une passerelle. Dans cet exemple, la valeur est définie sur
true.rateLimitServiceLes paramètres de domaine, de port et de délai d'expiration de la connexion pour le service de limitation de débit. Selon le service de limitation de débit déployé dans la section Prérequis, la configuration est la suivante :
host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5limitLes paramètres de limitation de débit qui s'appliquent à la route de service virtuel. Il comprend les champs suivants :
-
unit: L'intervalle de temps pour les vérifications de limitation de débit. -
quota: Le nombre de requêtes autorisées par intervalle de temps.
Dans cet exemple,
unitest défini surSECONDetquotaest défini sur100000. Cette limite élevée désactive efficacement la limitation de débit pour les requêtes non couvertes par une substitution spécifique, garantissant que les autres trafics restent inchangés.limit_overridesRemplace la limite de débit par défaut pour des requêtes spécifiques. Dans cet exemple :
-
Le champ
request_matchspécifie les conditions de la substitution :-
Le champ
remote_addressfait correspondre les requêtes par adresse IP client. -
Le paramètre
distinctdéfini surtrueapplique cette limite à chaque client individuellement. -
remote_addess.v4_prefix_mask_lencorrespond au masque de sous-réseau pour la plage d'adresses IP source du client (facultatif).
-
-
Le champ
limitdanslimit_overridesdéfinitunitsurMINUTEetquotasur1. Cela limite les requêtes correspondant aux conditionsrequest_matchà une par minute.
target_servicesSpécifie la route de service virtuel à laquelle la règle de limitation de débit s'applique.
-
kindspécifie que la règle cible un service virtuel. -
namespaceetnamespécifient le namespace et le nom du service virtuel. -
portrestreint la règle au trafic sur le port 80. -
section_namespécifie que la règle s'applique à la route nomméeproductpage-route-name1au sein du service virtuel.
-
-
Appliquez la règle de limitation de débit globale.
kubectl apply -f global-ratelimit-gw.yaml -
Consultez la configuration réconciliée de la règle de limitation de débit globale.
kubectl get asmglobalratelimiter global-test -n istio-system -o yaml |grep status: -A 50Sortie attendue :
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 -
Modifiez le ConfigMap
ratelimit-configde la section Prérequis, en remplaçant la valeur de la cléconfig.yamlpar la sortie d'état de l'étape précédente.kubectl edit ConfigMap ratelimit-configContenu mis à jour :
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 -
Depuis un client, accédez deux fois de suite à l'application bookinfo.
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 -vSortie attendue pour la deuxième requête :
< 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 intactLa sortie montre que la deuxième requête est limitée, confirmant que la règle de limitation de débit globale pour la passerelle d'entrée est correctement configurée.
Documents connexes
Utilisez la limitation de débit locale ASM pour une méthode économe en ressources qui ne dépend pas d'un service de limitation de débit. Pour les instructions, consultez Configurer la limitation de débit locale dans ASM.
Utilisez la limitation de débit globale pour limiter le trafic entrant d'un service d'application avec un sidecar injecté. Pour les instructions, consultez Configurer la limitation de débit globale pour le trafic entrant d'un service d'application.