Ingress 限流实战:访问速率限制与 Nginx Ingress 限流机制

Ingress 限流实战:访问速率限制与 Nginx Ingress 限流机制

一、配置访问速率限制

Ingress官网关于rate-limiting说明

1.1 配置访问速率限制

在 Kubernetes 中使用 Nginx Ingress Controller,可以实现速率限制的功能,以限制对后端服务的请求速率。速率限制是为了防止过多的请求压力导致后端服务过载,保护服务的稳定性。

下面针对该场景进行演示说明:

1.创建没有限制访问速率的ingress

[root@k8s-master01 ~]# vim auth-no-rate-limit.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  namespace: study-ingress
spec:
  ingressClassName: nginx # for k8s >= 1.22+
  rules:
  - host: test.zhang-qing.com
    http:
      paths:
      - backend:
          service:
            name: nginx
            port:
              number: 80
        path: /
        pathType: ImplementationSpecific
# 应用
[root@k8s-master01 ~]# kaf auth-no-rate-limit.yaml

2.在没有设置加速率限制的条件下,使用 ab 进行访问,使用 10 个并发连接(并发用户)发送 100 个请求到 https://nginx.test.com/ 进行性能测试,观察到失败请求数为 0

[root@k8s-master01 ~]# ab -c 10 -n 100 https://test.zhang-qing.com/ | grep requests
Complete requests:      100
Failed requests:        0
Time per request:       0.532 [ms] (mean, across all concurrent requests)
Percentage of the requests served within a certain time (ms)

上面参数说明:

  • -c 10: 表示使用 10 个并发连接,也就是同时有 10 个用户发送请求

  • -n 100: 表示总共发送 100 个请求

  • https://nginx.test.com/: 这是要进行性能测试的目标 URL,其中 https 表示使用 HTTPS 协议

3.环境复原


[root@k8s-master01 ~]# k delete -f auth-no-rate-limit.yaml

4.添加速率限制,限制只能有一个连接,只需要添加 nginx.ingress.kubernetes.io/limit-connections 为 1 即可

[root@k8s-master01 ~]# vim auth-rate-limit.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/limit-connections: "1"
  name: nginx-ingress
  namespace: study-ingress
spec:
  ingressClassName: nginx # for k8s >= 1.22+
  rules:
  - host: test.zhang-qing.com
    http:
      paths:
      - backend:
          service:
            name: nginx
            port:
              number: 80
        path: /
        pathType: ImplementationSpecific

上面参数说明:

  • nginx.ingress.kubernetes.io/limit-connections 注解设置了连接数限制为 1,意味着每个客户端 IP 地址最多只能同时保持一个连接到后端服务。如果同一客户端的第二个连接请求到达,Nginx Ingress Controller 将会将其排队等待,直到之前的连接关闭。

更新Ingress


[root@k8s-master01 ~]# kaf auth-rate-limit.yaml

5.再次使用 ab 测试,观察到失败请求数为 62,起到了一定的访问限制作用

[root@k8s-master01 ~]# ab -c 10 -n 100 https://test.zhang-qing.com/ | grep requests
Complete requests:      100
Failed requests:        62
Time per request:       0.577 [ms] (mean, across all concurrent requests)
Percentage of the requests served within a certain time (ms)

6.环境复原


[root@k8s-master01 ~]# k delete -f auth-rate-limit.yaml

二、限流机制拓展知识

除了上面的限流参数外,还有一些其他常用的限流参数:

1、nginx.ingress.kubernetes.io/limit-rps

配置示例(限制单个 IP 每秒请求数)


annotations:

  nginx.ingress.kubernetes.io/limit-rps: "100"  # 每秒最多 100 个请求

  nginx.ingress.kubernetes.io/limit-burst: "150" # 突发流量缓冲容量(可选)

生产场景

  • 高频 API 防护

防止 API 被恶意高频调用(如短信验证码接口、登录接口)。

“`shell

# 攻击者行为

curl -X POST http://api.example.com/send-sms -d “phone=123456789”

# 当同一 IP 每秒请求超过 100 次时,返回 503 错误

“`

  • 电商秒杀活动

控制商品抢购页面的请求频率,避免服务器过载。

2、nginx.ingress.kubernetes.io/limit-rpm

配置示例(限制单个 IP 每分钟请求数)


annotations:

  nginx.ingress.kubernetes.io/limit-rpm: "6000"  # 每分钟 6000 次(即每秒 100 次)

  nginx.ingress.kubernetes.io/limit-burst: "200"  # 突发缓冲

生产场景

  • 爬虫流量控制

限制爬虫每分钟的数据抓取频率(如新闻网站防内容盗用)。

“`shell

# 爬虫行为

wget –mirror http://news.example.com/articles

# 超过 6000 次/分钟后,爬虫 IP 被限流

“`

  • 报表导出功能

限制用户频繁触发大数据量导出操作(如财务系统)

3、nginx.ingress.kubernetes.io/limit-rate

配置示例(限制客户端下载速率)


annotations:

  nginx.ingress.kubernetes.io/proxy-buffering: "on"  # 必须开启

  nginx.ingress.kubernetes.io/limit-rate: "1024"     # 限制为 1024 KB/s(即 1MB/s)

生产场景

  • 大文件下载限速

防止单个用户占用过多带宽(如视频平台、软件下载站)。

“`yaml

# 用户下载行为

wget http://download.example.com/large-file.iso

# 下载速度被限制为 1MB/s

“`

  • 云存储服务

平衡多用户访问共享存储资源时的带宽分配。

4、nginx.ingress.kubernetes.io/limit-whitelist

配置示例(IP 白名单)


annotations:

  nginx.ingress.kubernetes.io/limit-whitelist: "192.168.1.0/24, 10.10.10.1"  # CIDR 格式

  nginx.ingress.kubernetes.io/limit-rps: "100"  # 对非白名单 IP 生效

生产场景

  • 内部系统豁免限流

允许监控系统、运维工具绕过限流规则(如 Prometheus 抓取指标)。

“`shell

# 监控服务器 IP 10.10.10.1 不受限流影响

curl http://api.example.com/metrics

“`

  • 合作伙伴 API 访问

为合作方 IP 提供更高的请求配额(如第三方支付回调)。

5、组合配置示例

场景:电商平台防护

annotations:
  # 基础限流(针对普通用户)
  nginx.ingress.kubernetes.io/limit-rps: "50"
  nginx.ingress.kubernetes.io/limit-rpm: "3000"
  nginx.ingress.kubernetes.io/limit-burst: "100"
  # 白名单(内部管理系统)
  nginx.ingress.kubernetes.io/limit-whitelist: "10.20.30.0/24, 172.16.1.5"
  # 下载限速(防止资源滥用)
  nginx.ingress.kubernetes.io/proxy-buffering: "on"
  nginx.ingress.kubernetes.io/limit-rate: "512"  # 512 KB/s

效果

  1. 普通用户
  • 每秒最多 50 次请求,突发允许 100 次。

  • 下载速度限制为 512KB/s。

  1. 白名单 IP
  • 内部管理系统(如订单处理后台)不受限流影响。
  1. 攻击者
  • 高频请求或大文件下载会被拦截或限速。
© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容