从业务场景出发
在业务开发过程中,我们有个需求是:通过filebrowser提供的下载服务需要进行限速处理。如用户在通过filebrowser进行文件下载的时候,需要限制每个用户的下载速率。从这个需求扩展开来,也可以限定特定用户的下载速率。
为了实现这个业务需求,结合我们当前的技术栈(k8s + nginx ingress),可以通过配置相应的nginx参数来实现。
什么是限速?
限速,顾名思义,是限制速率。
这里的速率可以是:
单个用户在单位时间内访问资源的频率,
也可以是单个ip在单位时间内访问资源的频率,
还可以是单位时间内指定连接的传输速率。
通常,后者的业务场景存在于下载限速
为什么要限速?
限速的本质是保证公平。
在带宽资源有限的情况下,尽可能地保障每个用户能被合理的分配足够的带宽值。也可以在带宽资源有限的情况下,通过限速的方式,服务更多的用户。
另外,限速还可以大大缓解分布式拒绝服务攻击(DDOS)带来的影响。
在nginx ingress的yaml文件里,都有哪些配置?
Nginx ingress的限速配置基本可以在ingress的nginx.ingress.kubernetes.io注解里可以找到。
下面,对和限速相关的注解进行逐一解读:
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
:突发请求大小的系数,主要用来定义连接的队列长度,默认是5nginx.ingress.kubernetes.io/limit-rate-after
:超过多少流量后执行限速(limit-rate),单位是KBnginx.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"
以上提到的IP,需要区分来自SLB还是真实的用户IP,获取真实的用户IP
4. 针对业务需求的方案
搞清楚了这些知识点后,再回到我们的业务本身,可以简单的在业务ingress的配置文件中添加以下配置即可:
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: ...
以上就是nginx ingress限速怎么配置的详细内容,更多请关注Work网其它相关文章!