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
defaultdans 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.
-
Créez une règle de limitation locale.
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 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.
-
-
Vérifiez la règle de limitation locale.
-
Exécutez la commande suivante pour démarrer une session bash dans le conteneur 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 une onzième requête :
curl -v http://httpbin:8000/headersSortie 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: 2La 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.
-
Créez une règle de limitation locale.
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 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.
-
-
Vérifiez la règle de limitation locale.
-
Exécutez la commande suivante pour démarrer une session bash dans le conteneur 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 une onzième requête :
curl -v http://httpbin:8000/headersSortie 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: 2La sortie affiche un code d'état HTTP 429, ce qui indique que la requête a été limitée.
-
Exécutez la commande suivante pour envoyer une requête vers le chemin
/getdu service httpbin :curl -v http://httpbin:8000/getSortie 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.
-
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. Redéployez le service httpbin. Pour plus d'informations, consultez Redéployer des charges de travail.
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.
-
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_limitSortie 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.
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.
-
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
increasepour 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
Si votre instance ASM est en version 1.19.0 ou ultérieure, vous pouvez utiliser le champ
limit_overridesdans le YAMLASMLocalRateLimiterpour faire correspondre les requêtes en fonction d'autres attributs, tels que les paramètres de requête. Pour plus d'informations, consultez Référence CRD ASMLocalRateLimiter.Utilisez le CRD
ASMGlobalRateLimiterpour configurer la limitation de débit globale pour les passerelles d'entrée et le trafic des services d'application. Pour plus d'informations, consultez Configurer la limitation de débit globale pour les services d'application à l'aide d'ASMGlobalRateLimiter.Configurez la limitation locale ou la limitation de débit globale pour une passerelle d'entrée dans la console ASM. Pour plus d'informations, consultez Configurer la limitation locale pour une passerelle d'entrée et Configurer la limitation de débit globale pour une passerelle d'entrée.
Utilisez la fonctionnalité de préchauffage pour augmenter progressivement le volume de requêtes sur une période spécifiée, ce qui permet 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 Utiliser la fonctionnalité de préchauffage ASM.
Configurez un pool de connexions pour mettre en œuvre la disjonction, ce qui protège votre système contre d'autres dommages en cas de panne ou de surcharge. Pour plus d'informations, consultez Configurer un pool de connexions pour mettre en œuvre la disjonction.