nginx ingress限速那些事浅析

目录
  • 从业务场景出发
  • 什么是限速?
  • 为什么要限速?
  • 在nginx ingress的yaml文件里,都有哪些配置?

从业务场景出发

在业务开发过程中,我们有个需求是:通过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:突发请求大小的系数,主要用来定义连接的队列长度,默认是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"
  • 以上提到的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限速那些事浅析的详细内容,更多关于nginx ingress限速的资料请关注我们其它相关文章!

(0)

相关推荐

  • nginx ingress限速那些事浅析

    目录 从业务场景出发 什么是限速? 为什么要限速? 在nginx ingress的yaml文件里,都有哪些配置? 从业务场景出发 在业务开发过程中,我们有个需求是:通过filebrowser提供的下载服务需要进行限速处理.如用户在通过filebrowser进行文件下载的时候,需要限制每个用户的下载速率.从这个需求扩展开来,也可以限定特定用户的下载速率. 为了实现这个业务需求,结合我们当前的技术栈(k8s + nginx ingress),可以通过配置相应的nginx参数来实现. 什么是限速? 限

  • nginx ingress代理websocket流量

    1 概述: 1.1 环境 版本信息如下:a.操作系统:centos 7.6b.kubernetes版本:v1.15.0c.ingress nginx版本:0.47.0 2 nginx ingress是否支持代理websocket流量 nginx ingress 默认支持websocket协议,因此ingress实例不需要额外配置.值得注意的是,proxy-read-timeout和proxy-send-timeout的默认值是60秒,应该根据实际情况增加此两个参数的值.如果使用默认值60,则we

  • nginx-ingress-controller日志持久化方案的解决

    最近看到一篇公众号讲了nginx-ingress-controller的应用.下面有人评论如何做日志持久化,刚好工作上遇到该问题,整理一个方案,仅供参考. nginx-ingress-controller的日志 nginx-ingress-controller的日志包括三个部分: controller日志: 输出到stdout,通过启动参数中的–log_dir可已配置输出到文件,重定向到文件后会自动轮转,但不会自动清理 accesslog:输出到stdout,通过nginx-configurat

  • 解决国内k8s的ingress-nginx镜像无法正常pull拉取问题

    一.问题描述 我们期望运行Ingress就必须给我们的集群创建Ingress controller 目前官方推荐的controller有:[目前支持和维护 AWS, GCE 和 nginx Ingress 控制器] https://kubernetes.io/zh/docs/concepts/services-networking/ingress-controllers/ 我们使用nginx控制器,其官网给出的配置方法如下:https://kubernetes.github.io/ingress

  • k8s部署ingress-nginx的方法步骤

    目录 前言 一.部署配置Ingress 二.使用https 前言 k8s集群服务部署好之后,需要对外提域名访问,这时候就需要ingress-nginx了,今天来给大家分享一下 一.部署配置Ingress 1.获取配置文件 #文件已下载到本地 https://github.com/kubernetes/ingress-nginx/tree/nginx-0.20.0/deploy 2.准备镜像 unzip ingress-nginx-nginx-0.20.0.zip cd ingress-nginx

  • k8s之ingress-nginx详解和部署方案

    目录 1.ingress介绍 2.ingress的工作原理 3.ingress可以解决的问题 1)动态配置服务 2)减少不必要的端口暴露 4.部署ingress(deployment的方式) 1)配置文件准备(粘贴下面网址的yanl文件) 2)配置文件介绍和设置ingress的网络模式 3)修改配置文件 4)拉取镜像(通过查看ingress的yaml文件可以看出)和创建svc文件 5)指定运行节点(需要打标签) 5.部署ingress(DaemonSet的方式) 1)添加hostNetwork

  • nginx ingress代理websocket流量的配置方法

    目录 1 概述: 1.1 环境 2 nginx ingress是否支持代理websocket流量 3 ingress样例 4 部署 4.1 部署nginx ingress 4.2 设置域名 4.3 部署websocket服务端 4.4 创建ingress资源 4.5 下载websockt客户端 4.6 测试 5 小结: 1 概述: 1.1 环境 版本信息如下:a.操作系统:centos 7.6b.kubernetes版本:v1.15.0c.ingress nginx版本:0.47.0 2 ngi

  • nginx限速之连接数限制技巧分享

    前言 我们经常会遇到这种情况,服务器流量异常,负载过大等等.对于大流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑对同一个ip的连接数,并发数进行限制.nginx 内置模块限速怎么使用就不多说了,今天来说说连接数和单个连接数限速的事.话不多说了,来一起看看详细的介绍吧. 场景: A公司有100人,A公司只有一个公网IP,假设A公司可能有100个人同时在下载你的网站文件. 但是,你的连接数限制配置为: limit_conn_zone $binary_remote_addr zo

  • Nginx带宽控制(限速模块使用)

    有个老项目,通过 Squid 提供文件下载功能,利用 delay_parameters 实现带宽控制,问题是我玩不转 Squid,于是盘算着是不是能在 Nginx 里找到类似的功能. 好消息是 Nginx 提供了 limit_rate和limit_rate_after,举个例子来说明一下: 复制代码 代码如下: location /download/ {     limit_rate_after 500k;     limit_rate 50k; } 大概意思是:用户下载达到 500k 后,便控

  • Nginx常用功能详解

    一.NGINX目录保护及访问限制 Nginx保护目录的配置如下,目录密码保护文件是 /usr/local/nginx/htpasswd location ~ /admin { #admin为要保护的目录名称,location 的意思就是保护从网页根目录算起的admin 目录 auth_basic "PLEASE LOGIN"; #就是进入资料夹时会显示的信息 auth_basic_user_file /usr/local/nginx/htpasswd; #验证用户及密码文件,我这边设定

  • Ingress七层路由机制实现域名的方式访问k8s

    Ingress概念: 通俗来讲:Ingress和之前说的Service.Deployment一样,也是一个k8s的资源类型:Ingress用于实现域名的方式访问k8s的内部应用,Service可能更适于服务间访问. 这东西我们使用的k8s官方维护的本版,另外nginx官方也有一个版本,怎么用看个人. Ingress支持多种方案:包括 Nginx.Haproxy.Traefik.istio等:在实际中Ingress上面可能还有一层公司的硬件层代理. 大概的流程图如下: 创建一个Ingress: 这

  • k8s部署Ingress并创建规则的详细介绍

    目录 一.Ingress介绍 二.Ingress文件获取 1.1 .说明 1.2 .文件内容 三.k8s应用 ingress-controller.yaml 四.创建Ingress规则 五.应用文件 六.访问 一.Ingress介绍 Ingress由两部分组成:Ingress controller和Ingress服务 通过 Service 发现 Pod 进行关联.基于域名访问 通过 Ingress Controller 实现 Pod 负载均衡 支持 TCP/UDP 4 层负载均衡和 HTTP 7

  • 基于Docker+K8S+GitLab/SVN+Jenkins+Harbor搭建持续集成交付环境的详细教程

    环境搭建概述 亲爱的家人们可以到链接:http://xiazai.jb51.net/202105/yuanma/javayaml_jb51.rar  下载所需要的yaml文件. 1.K8S是什么? K8S全称是Kubernetes,是一个全新的基于容器技术的分布式架构领先方案,基于容器技术,目的是实现资源管理的自动化,以及跨多个数据中心的资源利用率的最大化. 如果我们的系统设计遵循了kubernetes的设计思想,那么传统系统架构中那些和业务没有多大关系的底层代码或功能模块,都可以使用K8S来管

随机推荐