一、配置访问速率限制

Ingress官网关于rate-limiting说明

配置访问速率限制

在 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. 普通用户
  2. 每秒最多 50 次请求,突发允许 100 次。
  3. 下载速度限制为 512KB/s。
  4. 白名单 IP
  5. 内部管理系统(如订单处理后台)不受限流影响。
  6. 攻击者
  7. 高频请求或大文件下载会被拦截或限速。