ASMLocalRateLimiter est une CustomResourceDefinition (CRD) permettant de définir de manière déclarative les configurations de limitation de débit locale dans Service Mesh (ASM).
Fonctionnement
ASMLocalRateLimiter utilise un algorithme de bucket à jetons pour contrôler le débit des requêtes :
Chaque proxy Envoy maintient un bucket à jetons contenant un nombre configuré de jetons (
quota).Les jetons sont reconstitués à intervalles réguliers (
fill_interval).Si aucun jeton n'est disponible, la requête est rejetée avec le statut HTTP 429 (configurable).
Par défaut, tous les threads de travail d'un même processus Envoy partagent un seul bucket à jetons. Définissez per_downstream_connection sur true pour allouer un bucket distinct par connexion.
La valeur quota s'applique à une seule instance Envoy. Si vous disposez de n instances de passerelle, la limite de débit effective pour les services backend est de n x quota. Recalculez les quotas à chaque mise à l'échelle du nombre d'instances.
Aperçu de la structure CRD
Ce squelette illustre l'imbrication des champs au sein de la CRD :
apiVersion: istio.alibabacloud.com/v1beta1 # or v1
kind: ASMLocalRateLimiter
metadata:
name: <rule-name>
namespace: <namespace>
spec:
workloadSelector:
labels:
<label-key>: <label-value>
isGateway: true | false
configs:
- name: <config-name>
match:
vhost:
name: <virtual-host-name>
port: <port>
route:
name_match: <route-name>
limit:
status: <http-status-code>
fill_interval:
seconds: <int>
nanos: <int>
quota: <int>
per_downstream_connection: true | false
custom_response_body: <string>
response_header_to_add:
<header-name>: <header-value>
limit_overrides:
- request_match:
header_match:
- name: <header-name>
exact_match: <value>
query_match:
- name: <param-name>
exact_match: <value>
limit:
fill_interval:
seconds: <int>
quota: <int>
Exemple de configuration
L'exemple suivant applique une limitation de débit à une passerelle d'entrée. Deux hôtes virtuels bénéficient de limites différentes : www.example1.com à 10 requêtes par seconde, et www.example2.com à 100 requêtes par seconde.
Valeurs apiVersion prises en charge
| Version ASM | Valeur apiVersion |
|---|---|
| 1.15.3.105 ou ultérieure | istio.alibabacloud.com/v1 |
| Antérieure à 1.15.3.105 | istio.alibabacloud.com/v1beta1 |
Si vous avez précédemment défini l'apiVersion sur istio.alibabacloud.com/v1beta1 pour ASMCircuitBreaker dans un cluster Container Service for Kubernetes (ACK), remplacez cette valeur par istio.alibabacloud.com/v1 et redéployez le cluster.
spec
Pour plus d'informations, consultez Configurer la limitation de débit locale sur une passerelle d'entrée.
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| workloadSelector | map |
Oui | Libellés sélectionnant les pods auxquels s'applique la limitation de débit. La correspondance est limitée au namespace de la ressource. Pour plus d'informations, consultez Workload Selector. |
| isGateway | bool | Non | Définissez sur true si la règle cible une passerelle. Par défaut : false. |
| configs | LocalRateLimiterConfig[] | Oui | Règles de limitation de débit. |
LocalRateLimiterConfig
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| name | string | Oui | Nom de la règle de limitation de débit. |
| match | RatelimitMatch | Oui | Critères déterminant les requêtes auxquelles s'applique cette règle. |
| limit | LimitConfig | Oui | Paramètres du bucket à jetons définissant la limite de débit. |
| limit_overrides | RateLimitOverrideConfig[] | Non | Remplacements appliquant différentes limites de débit à des requêtes spécifiques. Nécessite ASM V1.19.0 ou version ultérieure. |
RatelimitMatch
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| vhost | VirtualHostMatch | Non | Critères de correspondance pour un hôte virtuel. |
LimitConfig
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| status | int | Non | Code de statut HTTP renvoyé lorsqu'une requête est limitée en débit. Par défaut : 429. Doit être supérieur ou égal à 400. Nécessite ASM V1.24.6.64 ou version ultérieure. |
| fill_interval | Duration | Non | Fréquence d'ajout des jetons au bucket. Spécifiez seconds (entier) ou nanos (nanosecondes). Par exemple, seconds: 1 reconstitue le bucket chaque seconde. Avec quota, cela définit le débit autorisé. |
| quota | int | Non | Nombre de jetons. La valeur doit être un entier. Par exemple, quota: 100 avec seconds: 1 autorise 100 requêtes par seconde par instance Envoy. |
| per_downstream_connection | bool | Non | Portée du bucket à jetons. false (par défaut) : un bucket partagé entre tous les threads de travail par processus Envoy. true : un bucket par connexion descendante. Nécessite ASM V1.13.4 ou version ultérieure. |
| custom_response_body | string | Non | Corps de réponse renvoyé lorsqu'une requête est limitée en débit. Nécessite ASM V1.13.4 ou version ultérieure. |
| response_header_to_add | map[string]string | Non | En-têtes de réponse ajoutés lorsqu'une requête est limitée en débit. Nécessite ASM V1.13.4 ou version ultérieure. |
RateLimitOverrideConfig
Utilisez les remplacements pour appliquer une limite de débit différente aux requêtes correspondant à des en-têtes ou paramètres de requête spécifiques, tout en conservant la limite de débit de base pour le reste du trafic.
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| request_match | RequestMatcher | Oui | Critères identifiant les requêtes concernées par le remplacement. |
| limit | LimitConfig | Oui | Limite de débit pour les requêtes correspondantes. Seuls fill_interval et quota prennent effet. Les valeurs de per_downstream_connection, custom_response_body et response_header_to_add sont héritées du parent LocalRateLimiterConfig.limit. |
VirtualHostMatch
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| name | string | Oui | Nom de l'hôte virtuel à faire correspondre. |
| port | int | Non | Port à faire correspondre. |
| route | RouteMatch | Non | Route à faire correspondre au sein de l'hôte virtuel. |
RouteMatch
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| name_match | string | Non | Nom d'une route spécifique définie dans un service virtuel. |
| header_match | HeaderMatcher[] | Non | Obsolète depuis ASM V1.19.0. Utilisez plutôt RateLimitOverrideConfig. |
RequestMatcher
Lorsque header_match et query_match sont tous deux spécifiés, une requête doit satisfaire toutes les conditions pour être mise en correspondance.
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| header_match | HeaderMatcher[] | Non | Critères de correspondance basés sur les en-têtes. |
| query_match | QueryParameterMatcher[] | Non | Critères de correspondance basés sur les paramètres de requête. |
HeaderMatcher
Spécifiez exactement un champ de mode de correspondance (regex_match, exact_match, prefix_match, suffix_match ou present_match) par matcher.
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| name | string | Non | Nom de l'en-tête. |
| regex_match | string | Non | Fait correspondre la valeur de l'en-tête à une expression régulière. |
| exact_match | string | Non | Fait correspondre la valeur de l'en-tête exactement. |
| prefix_match | string | Non | Fait correspondre le début de la valeur de l'en-tête. |
| suffix_match | string | Non | Fait correspondre la fin de la valeur de l'en-tête. |
| present_match | bool | Non | true : correspond si l'en-tête existe, quelle que soit sa valeur. false : correspond si l'en-tête n'existe pas. |
| invert_match | bool | Non | Inverse le résultat de la correspondance. Par défaut : false. Lorsque true, une requête qui correspondrait normalement est traitée comme ne correspondant pas, et vice versa. |
QueryParameterMatcher
Spécifiez exactement un champ de mode de correspondance (exact_match, prefix_match, suffix_match, regex_match, contains_match ou present_match) par matcher.
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| name | string | Oui | Nom du paramètre de requête. |
| exact_match | string | Non | Fait correspondre la valeur du paramètre exactement. |
| prefix_match | string | Non | Fait correspondre le début de la valeur du paramètre. |
| suffix_match | string | Non | Fait correspondre la fin de la valeur du paramètre. |
| regex_match | string | Non | Fait correspondre la valeur du paramètre à une expression régulière. |
| contains_match | string | Non | Correspond si la valeur du paramètre contient la chaîne spécifiée. |
| present_match | bool | Non | true : correspond si le paramètre existe, quelle que soit sa valeur. false n'est pas valide et équivaut à omettre ce champ. |
| ignore_case | bool | Non | Ignore la casse lors de la comparaison des valeurs. |