Pendant le processus de développement commercial, nous avons une exigence : le service de téléchargement fourni via le navigateur de fichiers doit être limité en vitesse. Par exemple, lorsque les utilisateurs téléchargent des fichiers via un navigateur de fichiers, ils doivent limiter le taux de téléchargement de chaque utilisateur. À partir de cette exigence, le taux de téléchargement pour des utilisateurs spécifiques peut également être limité.
Afin de répondre à cette exigence commerciale, combinée à notre pile technologique actuelle (entrée k8s + nginx), elle peut être réalisée en configurant les paramètres nginx correspondants.
La limitation de vitesse, comme son nom l'indique, est une limitation de vitesse.
Le taux ici peut être :
La fréquence à laquelle un seul utilisateur accède aux ressources dans l'unité de temps,
Il peut également s'agir de la fréquence à laquelle une seule IP accède à la ressource dans l'unité de temps,
Il peut également s'agir de l'unité de temps Le taux de transfert de la connexion spécifiée.
Habituellement, ce dernier scénario commercial existe dans la limitation de vitesse de téléchargement
L’essence de la limitation de vitesse est de garantir l’équité.
Dans le cas de ressources de bande passante limitées, faites de notre mieux pour garantir que chaque utilisateur puisse raisonnablement se voir attribuer une valeur de bande passante suffisante. Il peut également servir davantage d’utilisateurs grâce à une limitation de vitesse lorsque les ressources de bande passante sont limitées.
De plus, la limitation de vitesse peut également atténuer considérablement l'impact des attaques par déni de service distribué (DDOS).
La configuration de la limite de vitesse de l'entrée Nginx se trouve essentiellement dans l'annotation nginx.ingress.kubernetes.io de l'entrée.
Ci-dessous, nous interpréterons une par une les annotations liées à la limitation de vitesse :
nginx.ingress.kubernetes.io/limit-connections
: Le nombre de connexions simultanées pouvant être effectuées par une seule adresse IP à la fois. Si le nombre de connexions simultanées est dépassé, une erreur 503 est renvoyée.nginx.ingress.kubernetes.io/limit-connections
:单个IP地址可以同时并发连接的个数。如果超过连接并发数,则返回503错误。
nginx.ingress.kubernetes.io/limit-rps
:限制单个IP每秒钟的请求数(limit request per second)。超出限制,返回503错误。需要注意的是,并不是立刻超出该配置设定的值就马上出现503错误,nginx允许在一定时间范围内的突发请求数的存在(突发请求数 = limit-rps * limit-burst-multiplier)。那么什么时候会出现503呢?这就要从nginx的限流模型展开了。nginx的限流模型就是一个队列(参考线程池的队列模型模型),限流的max连接数=队列处理的能力+队列长度,即max-connections-per-second=limit-rps+limit-rps*limit-burst-multiplier。
nginx.ingress.kubernetes.io/limit-rpm
:同limit-rps,不过limit-rpm的优先级高于limit-rps,也就是说当同时设置了limit-rpm和limit-rps,以limit-rpm为准。不过当limit-connections也设置了,那么limit-connections的优先级最高。
nginx.ingress.kubernetes.io/limit-burst-multiplier
:突发请求大小的系数,主要用来定义连接的队列长度,默认是5
nginx.ingress.kubernetes.io/limit-rate-after
:超过多少流量后执行限速(limit-rate),单位是KB
nginx.ingress.kubernetes.io/limit-rate
:单个连接每秒的限速值,单位是KB。
nginx.ingress.kubernetes.io/limit-whitelist
:设定IP白名单,在该白名单内的IP不被限速,支持CIDR,多个IP可用逗号隔开。
注意
当limit-connections, limit-rps, limit-rpm同时设定时,优先级是limit-connections>limit-rpm>limit-rps
limit-rate-after和limit-rate生效的前提是nginx.ingress.kubernetes.io/proxy-buffering: "on"
nginx.ingress.kubernetes.io/limit-rps
: Limiter le nombre de requêtes par seconde pour une seule IP (limiter les requêtes par seconde). Si la limite est dépassée, une erreur 503 est renvoyée. A noter qu'une erreur 503 ne se produit pas immédiatement lorsque la valeur fixée par la configuration est dépassée. nginx permet l'existence du nombre de requêtes en rafale dans une certaine plage de temps (nombre de requêtes en rafale = limite-rps * limite-burst). -multiplicateur ). Alors, quand apparaîtra le 503 ? Cela commence par le modèle limite actuel de nginx. Le modèle de limitation actuel de nginx est une file d'attente (voir le modèle de file d'attente du pool de threads). Le nombre maximum de connexions pour la limitation actuelle = capacité de traitement de la file d'attente + longueur de la file d'attente, c'est-à-dire max-connections-per-second = limit- rps + limite-rps* limite-rafale-multiplicateur.nginx.ingress.kubernetes.io/limit-rpm
: identique à limit-rps, mais limit-rpm a une priorité plus élevée que limit-rps, ce qui signifie que lorsque limit-rpm est régler en même temps le régime et la limite-rps, sous réserve de la limite-rpm. Cependant, lorsque des connexions limites sont également définies, ces connexions limites ont la priorité la plus élevée.
nginx.ingress.kubernetes.io/limit-burst-multiplier
: coefficient de taille de requête en rafale, principalement utilisé pour définir la longueur de la file d'attente de la connexion, la valeur par défaut est 5
nginx.ingress.kubernetes.io/limit-rate-after
: La limite de débit (limit-rate) est exécutée une fois que le trafic dépasse la limite, l'unité est KB
nginx .ingress.kubernetes.io/ limit-rate
: valeur de limite de vitesse d'une seule connexion par seconde, en Ko.
nginx.ingress.kubernetes.io/limit-whitelist
: définissez une liste blanche d'adresses IP. Les adresses IP de la liste blanche ne sont pas limitées en vitesse. Plusieurs adresses IP peuvent être séparées par des virgules ouvertes. .
RemarqueLorsque les limites de connexions, les limites de rps et les limites de régime sont définies en même temps, la priorité est Limite de connexions>limite-rpm>limite-rps Le principe pour que limit-rate-after et limit-rate prennent effet est
nginx.ingress.kubernetes.io/proxy-buffering : "on"
Les adresses IP mentionnées ci-dessus doit être distingué de SLB Ou l'IP de l'utilisateur réel, obtenez l'IP de l'utilisateur réel 4 Solutions pour les besoins de l'entreprise Après avoir clarifié ces points de connaissances, nous pouvons revenir à notre entreprise elle-même. Nous pouvons simplement l'ajouter au. fichier de configuration de l'entrée commerciale Ajoutez simplement la configuration suivante :
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: ... nginx.ingress.kubernetes.io/proxy-buffering: on nginx.ingress.kubernetes.io/limit-rate: 10 # 单位是KB name: xxx namespace: yyy spec: ingressClassName: nginx rules: ...
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!