容器平台和外部网关从来不是二选一,而是各管一段:外部网关负责流量入口的七层路由和全局限流,容器平台负责服务发现和集群内的精细管控,两边通过统一的路由规则和标准化协议对接,才能把七层路由和限流做得既灵活又稳定。
为什么外部网关必须和容器平台分工
很多团队在容器化初期会问:K8s 自带 Ingress,为什么还要再架一层外部网关?这里有个常见的认知误区,K8s Ingress 解决的是集群内部的东西向流量调度,它懂 Pod、懂 Service、懂 Endpoint,但对外部流量的全局视角有限,外部网关则站在流量入口的位置,能看到所有来源、所有域名、所有 URL 路径,适合做全局路由策略和粗粒度限流。
拿实际场景举例,某电商平台大促期间,前端入口需要按 URL 路径分流:/api/order 走订单服务,/api/pay 走支付服务,静态资源直接回源 CDN,如果让 K8s Ingress 单独干这活,它虽然能配规则,但面对突增流量时,Ingress Controller 本身的扩容和限流能力会成为瓶颈,外部网关(OpenResty、Kong、APISIX)配合容器平台后,外部网关先做第一层清洗和分流,K8s Ingress 再做第二层精细化转发,链路清晰,各司其职。
k8s ingress 外部网关 区别,行业共识认为:Ingress 是容器世界的“内部交警”,外部网关是“大门保安”,两者职责不同但必须配合。
七层路由配合的两种主流姿势
七层路由的配合方式,业内大致分两派:一派是外部网关直连 Service,另一派是外部网关转发给 Ingress。
外部网关直连容器 Service
这种方式下,外部网关(如 APISIX)通过 K8s API 动态获取 Service 的 Endpoint 列表,直接转发到对应的 Pod IP,优点是少一跳,延迟低;缺点是网关需要集成 K8s 的服务发现插件,且要自己处理 Pod 重建带来的 IP 变化。
操作路径上,以 APISIX 为例:
- 在 K8s 中部署 APISIX 的 Kubernetes Ingress Controller 插件
- 通过
ApisixRoute自定义资源定义路由规则 - 网关自动 watch Service 变化,更新 upstream
外部网关转发给 Ingress
这是更常见的姿势,外部网关只负责域名解析、TLS 卸载、全局限流、WAF 防护,然后统一转发到 K8s Ingress 的 Service(nginx-ingress-controller 的 LoadBalancer IP),这样做的好处是容器平台内部依然保持统一的 Ingress 管理标准,外部网关更换不影响内部路由。
配置层面,外部 Nginx 的 upstream 直接指向 Ingress Controller:
upstream k8s_ingress {
server 10.96.0.10:80; # nginx-ingress-controller Service IP
}
server {
listen 443 ssl;
server_name api.example.com;
location / {
proxy_pass http://k8s_ingress;
proxy_set_header Host $host;
}
}
这种方式在百度搜“容器云平台 网关 配置 步骤”能找到大量类似方案,说明它已经是被广泛验证的落地路径。
限流策略的黄金三层结构
限流必须分层次,不能把所有压力都压在一层上,容器平台配合外部网关做限流,成熟的思路是三层限流。
第一层:外部网关全局限流(入口粗粒度)
这一层管的是“总量”,按 IP、按区域、按用户维度做全局配额,比如某 API 的全局 QPS 上限是 10000,超过就返回 429,外部网关的限流插件(如 APISIX 的 limit-req、Kong 的 rate-limiting)都支持分布式限流,配合 Redis 做计数,集群模式下依然准确。
第二层:Ingress 层路由规则限流(中粒度)
在 K8s Ingress 层,基于注解做 URL 维度的限流,nginx-ingress-controller 支持:
annotations: nginx.ingress.kubernetes.io/limit-rps: "50" nginx.ingress.kubernetes.io/limit-burst-multiplier: "5"
这里限制的是单个 Ingress 规则的每秒请求数,适合按业务模块划分:订单接口 50 QPS、商品接口 100 QPS,这个层级的好处是规则随 Ingress 一起版本管理,改配置就是改 YAML。
第三层:K8s HPA 自动伸缩(动态兜底)
限流不只是“挡”,还要“扛”,当流量上涨,HPA 根据 CPU、内存或自定义指标(如 QPS)自动扩容 Pod,容器平台限流方案对比中,相当一部分团队会犯的错是只做静态限流,流量一涨直接拒绝服务,没有给自动伸缩留出反应时间。
三层限流的配置配合,业内专家指出,核心在于各层的超时参数和返回码要统一约定,否则客户端看到的错误五花八门。
不同网关选型的成本与场景对比
关于容器平台 网关 选型 价格,这几年讨论热度很高,不同场景下的选择确实差别很大。
| 网关 | 七层路由能力 | 限流能力 | 适合场景 | 成本考量 |
|---|---|---|---|---|
| Nginx/OpenResty | 强,基于 Lua 扩展 | 需自研或搭配 lua-resty-limit-traffic | 已有 Nginx 运维能力的团队 | 软件免费,人力成本高 |
| APISIX | 强,插件生态丰富 | 内置 limit-req/limit-count | 云原生架构重度用户 | 开源免费,企业版收费 |
| Kong | 强,声明式配置 | 内置 rate-limiting | 网关团队规模较大的企业 | 社区版免费,企业版按节点收费 |
| ALB/SLB(云厂商) | 中,七层能力有限 | 依赖配置或搭配 WAF 能力 | 中小规模业务,图省事 | 按量付费,成本可控 |
选型时不能只看功能列表,如果你的团队已经熟悉 OpenResty,可能不需要引入新组件;如果是从零搭建,APISIX 或 Kong 的声明式路由规则与 K8s 的契合度会更高,价格方面,云厂商网关按规格和流量计费,自建网关则需要预算运维人力。
路由规则同步与一致性保障
外部网关和容器平台之间最大的坑是路由规则不同步,解决这个问题,主流做法是引入配置中心,让两边从同一个数据源拉取配置。
具体操作路径:
- 使用 etcd 作为统一配置存储
- APISIX 的 Admin API 或 K8s ConfigMap 都从 etcd 读取规则
- 通过 watch 机制监听变更,热更新路由和限流参数
这样改路由不再需要手动登到网关机器改配置,也不需要 kubectl apply 两次,规则只有一份,两边自动同步,从根源上杜绝“网关改了 Ingress 没改”的问题。
生产环境中的落地避坑清单
真实生产环境中,容器平台配合外部网关做七层路由与限流,以下问题比较容易踩坑:
- 健康检查不一致:外部网关的健康检查路径和 K8s 的 readinessProbe 路径要统一,否则网关觉得后端活着,K8s 觉得 Pod 没就绪,流量转发到不可用节点
- 超时时间传递:外部网关到 Ingress 的超时时间要大于 Ingress 到 Pod 的超时时间,形成递减链路,避免客户端提前断开
- 限流维度要对齐:外部网关按 IP 限,Ingress 按 URL 限,要确保这两个维度不会叠加出意外效果,比如某个 IP 的某条 URL 被双重限流导致 QPS 远低于预期
- TLS 证书管理:证书在外部网关终结后,转发到 Ingress 时默认走 HTTP,如果内部链路也需要加密,Ingress 侧要配
proxy_set_header X-Forwarded-Proto转发原始协议
还有一点容易被忽略:日志链路标识,外部网关生成的 request-id 要透传到容器内的应用日志,否则排查问题时两边日志对不上,根本没有头绪。
配置示例:一个真实的电商场景
某电商平台接外部网关 APISIX 配合 K8s Ingress 的完整链路:
外部网关 APISIX 配置:
curl http://127.0.0.1:9180/apisix/admin/routes/1 -X PUT -d '
{
"uri": "/api/order/",
"plugins": {
"limit-req": {
"rate": 100,
"burst": 200,
"rejected_code": 429,
"key": "remote_addr"
}
},
"upstream": {
"type": "service",
"service_name": "ingress-nginx-controller",
"discovery_type": "k8s"
}
}'
K8s Ingress 内部规则:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: order-ingress
annotations:
nginx.ingress.kubernetes.io/limit-rps: "50"
spec:
rules:
- host: api.example.com
http:
paths:
- path: /api/order
pathType: Prefix
backend:
service:
name: order-service
port:
number: 8080
这个配置中,外部网关先限制每个 IP 每秒 100 个请求,超过的返回 429;Ingress 再限制该路由每秒 50 个请求作为模块级兜底,层层递减,既防止单个 IP 刷接口,又不至于全局 QPS 过高打垮后端。
常见问题解答
容器平台用 K8s,还需要单独买外部网关吗?
需要,K8s Ingress 解决的是集群内部路由问题,对外部流量的全局管理(如多集群统一入口、跨环境灰度、全局限流、WAF 防护)能力很弱,如果你的业务只需简单转发,Ingress 够用;但涉及多业务线复用集群、有精细限流需求,外部网关是刚需,这个结论在搜“k8s ingress 外部网关 区别”时能看到大量同类案例。
容器平台限流方案中,网关层的限流参数怎么定比较合理?
按两个维度估算:一是后端服务的真实承载能力,先用压测得出单 Pod 的 QPS 上限,再乘以 Pod 数量冗余量;二是业务容忍度,核心交易链路限流值偏宽松,非核心查询链路可以更激进,初期配置建议用网关限流值的 80% 作为 K8s HPA 的扩容触发阈值,给自动伸缩留缓冲空间。
外部网关和 K8s 的 Ingress 之间会不会存在重复限流?
会,这是最常见的问题,网关限了 100 QPS,Ingress 又限 50 QPS,实际生效的是更小的那个值,解决思路是明确各层职责:网关管总流量入口,Ingress 管单服务配额,两层限流是叠加关系而非替代关系,配置时要保留足够的冗余空间,避免意外拦截正常流量。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/639293.html





