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