在 Nginx Ingress 中配置限速(Rate Limiting)可以通过注解(annotations)或自定义模板实现。以下是几种常见的限速配置方法:
使用 nginx.ingress.kubernetes.io/limit-connections
、limit-rps
和 limit-rpm
注解实现。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/limit-connections: "10" # 每个IP允许的最大并发连接数
nginx.ingress.kubernetes.io/limit-rps: "5" # 每秒请求数(Requests Per Second)
nginx.ingress.kubernetes.io/limit-rpm: "100" # 每分钟请求数(Requests Per Minute)
nginx.ingress.kubernetes.io/limit-rate-after: "1m" # 响应超过1MB后开始限速
nginx.ingress.kubernetes.io/limit-rate: "100k" # 限速为100KB/s
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
通过 nginx.ingress.kubernetes.io/server-snippet
或 location-snippet
自定义Nginx配置。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/location-snippet: |
limit_req zone=req_limit burst=5 nodelay;
limit_conn conn_limit 10;
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
注意:需在Nginx Ingress Controller的ConfigMap中定义对应的限速zone(见下文)。
在Ingress Controller的ConfigMap中定义全局限速参数(如 limit-req-zone
和 limit-conn-zone
)。
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configuration
namespace: ingress-nginx
data:
http-snippet: |
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
通过自定义Nginx配置实现更复杂的限速逻辑(如针对特定用户或API Key)。
annotations:
nginx.ingress.kubernetes.io/server-snippet: |
map $http_cookie_api_key $limit_key {
default $binary_remote_addr;
"~*api_key=(?<key>[^;]+)" $key;
}
limit_req_zone $limit_key zone=api_limit:10m rate=5r/s;
注解/配置 | 作用 |
---|---|
limit-connections |
每个IP的最大并发连接数 |
limit-rps |
每秒请求数限制 |
limit-req zone |
Nginx的请求限速zone(需提前定义) |
limit-conn zone |
Nginx的连接数限制zone |
burst |
允许的突发请求数(配合limit_req 使用) |
nodelay |
立即拒绝超额请求(否则会延迟处理) |
日志检查:
查看Nginx Ingress Controller的日志,确认限速规则已加载:
kubectl logs -n ingress-nginx <ingress-controller-pod>
压力测试:
使用工具(如 wrk
或 ab
)模拟请求,观察是否返回 503
或 429
状态码:
wrk -t2 -c10 -d10s http://example.com
监控指标:
Nginx Ingress 暴露的Prometheus指标(如 nginx_ingress_controller_requests
)可查看限速效果。
限速不生效
限速范围错误
http-snippet
。性能影响
burst
和 nodelay
。通过以上配置,可以灵活实现从简单到复杂的限速策略。根据实际需求选择注解或自定义Nginx片段即可。