资讯动态

NGINX Ingress Controller 中 Policy 资源实现速率限制的实战与源码解析

发布时间:2026/10/14 7:18:39 来源:尧图企业网站定制
API网关云原生负载均衡可观测性微服务【免费下载链接】kubernetes-ingressNGINX and NGINX Plus Ingress Controllers for Kubernetes项目地址https://gitcode.com/gh_mirrors/ku/kubernetes-ingress点击查看免费下载本文以 NGINX Ingress Controller 官方示例examples/custom-resources/rate-limit为主线演示如何通过Policy自定义资源为VirtualServer配置基于源 IP 的请求速率限制1r/s并结合仓库源码说明该配置如何被校验、转换为 NGINX 的limit_req_zone/limit_req指令以及rateLimit各字段的完整取值规则与默认值。示例场景概述该示例的目标是部署一个 Web 应用通过VirtualServer为其配置负载均衡再叠加一个速率限制策略。最终效果是——当同一个客户端 IP 每秒发超过 1 个请求时NGINX 将拒绝多余请求并返回 503默认rejectCode。示例目录包含三个清单文件webapp.yaml应用 Deployment Servicerate-limit.yaml速率限制Policy资源virtual-server.yaml引用该策略的VirtualServer准备工作按照官方安装说明部署 Ingress Controller需要启用 CRDPolicy、VirtualServer资源由 deploy/crds.yaml 定义。将 Ingress Controller 的公网 IP 存入 shell 变量IC_IPXXX.YYY.ZZZ.III将 Ingress Controller 的 HTTP 端口存入 shell 变量IC_HTTP_PORTport number第 1 步部署 Web 应用kubectl apply -f webapp.yaml清单内容如下一个nginxdemos/nginx-hello:plain-text镜像的 Deployment监听容器端口 8080以及将 Service 端口 80 转发到 8080 的webapp-svcapiVersion: apps/v1 kind: Deployment metadata: name: webapp spec: replicas: 1 selector: matchLabels: app: webapp template: metadata: labels: app: webapp spec: containers: - name: webapp image: nginxdemos/nginx-hello:plain-text ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: webapp-svc spec: ports: - port: 80 targetPort: 8080 protocol: TCP name: http selector: app: webapp第 2 步创建速率限制策略创建一个名为rate-limit-policy的策略只允许来自单个 IP 地址每秒 1 个请求。kubectl apply -f rate-limit.yamlapiVersion: k8s.nginx.org/v1 kind: Policy metadata: name: rate-limit-policy spec: rateLimit: rate: 1r/s key: ${binary_remote_addr} zoneSize: 10M三个核心字段含义rate: 1r/s—— 允许速率单位只能是r/s每秒或r/m每分钟key: ${binary_remote_addr}—— 限流键按客户端二进制源 IP 区分变量必须用${}包裹zoneSize: 10M—— 共享内存区大小用于存储所有被限流键的计数状态。第 3 步配置负载均衡VirtualServerkubectl apply -f virtual-server.yamlapiVersion: k8s.nginx.org/v1 kind: VirtualServer metadata: name: webapp spec: host: webapp.example.com policies: - name: rate-limit-policy upstreams: - name: webapp service: webapp-svc port: 80 routes: - path: / action: pass: webapp注意spec.policies引用了第 2 步创建的rate-limit-policy这是策略生效的挂载点。第 4 步测试配置以超过 1 次/秒的频率访问应用NGINX 会开始拒绝请求。首次请求正常返回curl --resolve webapp.example.com:$IC_HTTP_PORT:$IC_IP http://webapp.example.com:$IC_HTTP_PORT/Server address: 10.8.1.19:8080 Server name: webapp-dc88fc766-zr7f8 . . .紧接着的第二次请求被拒绝默认rejectCode为 503curl --resolve webapp.example.com:$IC_HTTP_PORT:$IC_IP http://webapp.example.com:$IC_HTTP_PORT/html headtitle503 Service Temporarily Unavailable/title/head body centerh1503 Service Temporarily Unavailable/h1/center /body /htmlrateLimit 字段全集参数、默认值与校验规则示例只用了 3 个字段但 types.go 中的RateLimit结构体定义了完整的参数集CRD 文档见 k8s.nginx.org_policies.md字段类型说明默认值/约束ratestring允许的请求速率必填格式必须匹配[1-9]\d*r/[sSmM]如16r/s、32r/m校验见 validateRatekeystring限流键可含文本、变量或两者组合必填允许变量$binary_remote_addr、$request_uri、$uri、$args、$request_method及特殊前缀http_、arg_、cookie_Plus 下另有jwt_claim_、apikey_见 validateRateLimitKeyzoneSizestring共享内存区大小必填仅正值后缀k/m缺省按k处理必须大于 31k见 validateRateLimitZoneSizeburstint超出速率的请求先被延迟数量超过 burst 后被直接拒绝可选正整数delayint指定一个较低的延迟阈值超过该阈值才开始延迟请求可选正整数noDelaybool禁用对超额请求的延迟直接拒绝同时设置时覆盖delay可选缺省falsedryRunbool演练模式不实际限流但超额请求照常计入共享内存区可选缺省falselogLevelstring拒绝/延迟请求的日志级别可选仅info/notice/warn/error缺省errorrejectCodeint被拒绝请求返回的状态码可选范围 400..599缺省 503scalebool将配置速率除以当前服务流量的 Ingress Pod 数实现恒定总速率自动扩缩容场景启用 zone-sync 时该设置被抑制可选conditionobject条件限流可按 JWT claim 或变量匹配值分组限流可选JWT 条件仅 NGINX Plus 支持所有字段的默认值在 generateLimitReqOptions 中集中体现DryRun默认false、LogLevel默认error、RejectCode默认503—— 这正是示例中第二次 curl 返回 503 页面的原因。源码实现Policy 如何变成 NGINX 限流指令1. 准入校验。Policy资源应用时先经过 validateRateLimit检查zoneSize必须大于 31k、rate匹配正则[1-9]\d*r/[sSmM]、key只包含白名单变量、rejectCode在 400..599 区间、logLevel在四个合法级别内。任一不满足资源都不会被 Controller 接受。2. 生成限流配置。addRateLimitConfig 为每个被VirtualServer/VirtualServerRoute引用的策略生成一组内部对象Zone 名称按pol_rl_policy ns_policy name_父资源 ns_父资源名_父资源类型推导见rfc1123ToSnake调用处保证同一策略被不同 VirtualServer 引用时不冲突generateLimitReqZone 将key/zoneSize/rate原样映射到LimitReqZone若策略开启了scale且未启用 zone-sync则调用 scaleRatelimit 把速率除以 Pod 副本数结果小于 1r/s 时自动换算为r/m单位generateLimitReq 处理burst/delay/noDelay其中noDelay为真时强制把delay置 0与 API 文档覆盖 delay的语义一致同一上下文中引用多个限流策略时dryRun/logLevel/rejectCode以第一个被引用的策略为准后续策略会输出overridden警告policy.go 第 234-244 行。3. 渲染模板。最终配置由 nginx.virtualserver.tmpl 渲染# http 块内为每个策略生成一条 zone limit_req_zone ${binary_remote_addr} zonepol_rl_...:10M rate1r/s; # server 块内 limit_req zonepol_rl_... ;模板同时按需渲染limit_req_dry_run on、limit_req_log_level level、limit_req_status code模板第 195-210 行burst/delay/nodelay参数追加在limit_req指令之后。与传统 Ingress 注解限流的对应关系如果使用的是原生Ingress资源而非Policy等价的注解在 parseRateLimitAnnotations 中解析nginx.org/limit-req-rate、nginx.org/limit-req-key、nginx.org/limit-req-zone-size、nginx.org/limit-req-delay、nginx.org/limit-req-no-delay、nginx.org/limit-req-burst、nginx.org/limit-req-dry-run、nginx.org/limit-req-log-level、nginx.org/limit-req-reject-code。两者最终汇入同一套limit_req指令生成逻辑差别在于Policy支持condition条件分组、scale自动均分速率并可被多个VirtualServer/VirtualServerRoute复用。相关进阶示例与测试进阶用法按 JWT claim 限流 rate-limit-jwt-claim、分层限流 rate-limit-tiered-apikey、rate-limit-tiered-request-method以及无主机名 VSR 场景下的限流 vsr-hostless/rate-limit.yaml单元测试策略解析与模板生成的断言见 policy_test.go、virtualserver_policy_test.go 与 virtualserver_ratelimit_groups_test.go集成测试Policy限流的功能性验证在 test_rl_policies.pyIngress 注解限流在 test_rl_ingress.py测试数据位于 tests/data/rate-limit/ 目录。小结这套示例完整展示了 NGINX Ingress Controller 限流的最小闭环Policy定义策略 →VirtualServer.policies引用策略 → 请求超过rate且无burst缓冲时被拒绝并返回rejectCode默认 503。从源码看字段级校验、Zone 命名、速率均分scale与模板渲染共同保证了策略声明式地、可复用地下发为标准的limit_req_zone/limit_req指令生产环境中可按需补齐burst、dryRun演练与rejectCode定制。赞分享API网关云原生负载均衡可观测性微服务【免费下载链接】kubernetes-ingressNGINX and NGINX Plus Ingress Controllers for Kubernetes项目地址https://gitcode.com/gh_mirrors/ku/kubernetes-ingress点击查看免费下载相关推荐基于 JWT claim 的速率限制NGINX Ingress Controller Policy 与 VirtualServer 实战指南基于 JWT claim 的速率限制NGINX Ingress Controller Policy 与 VirtualServer 实战指南 本文以仓库示例API网关云原生负载均衡可观测性微服务NGINX Ingress Controller Egress MTLS 实战用 Policy 资源实现到上游后端的双向 TLSNGINX Ingress Controller Egress MTLS 实战用 Policy 资源实现到上游后端的双向 TLS 本篇技术指南以 kubernAPI网关云原生负载均衡可观测性微服务NGINX Ingress Controller用 API Key 分层限流 Policy 实现基于客户端等级的速率控制NGINX Ingress Controller用 API Key 分层限流 Policy 实现基于客户端等级的速率控制 NGINX Ingress ContAPI网关云原生负载均衡可观测性微服务上一篇魔兽争霸III完整优化指南如何免费解决宽屏变形、地图过大与帧率锁死问题下一篇魔兽争霸3在Win10/11频繁翻车WarcraftHelper免费插件5分钟完成兼容性修复创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑