一、背景:你为什么要读这篇文档
你是否因为Ingress Controller选择困难而纠结过?是否在凌晨三点被Nginx配置错误call醒过?还是说,你正在用ingress-nginx,突然发现Kubernetes社区宣布它2026年3月要退役了?
好了别慌。我干了10年运维,从最初用Nginx手写配置,到现在天天跟各种Ingress Controller和Istio打交道,踩过的坑估计能写本书。这篇文档不是官方手册的复制粘贴------我会直接把选型对比、部署方案、Istio集成思路以及线上真实踩过的坑都给你讲清楚。
读完本文,你将能:
- 搞清楚7种主流Ingress Controller的核心差异和适用场景
- 零基础完成一套生产级别的Ingress Controller部署
- 掌握Gateway API的迁移路径和最佳实践
- 理解Istio如何在Ingress/Gateway层发挥作用
(我用的版本:K8s v1.30+,ingress-nginx v1.10+,Istio 1.24+,后续再细说版本兼容性的坑。)
二、Ingress Controller到底是什么?
先说句实在话:Ingress本身只是个API对象,它定义的是一套路由规则,但自己压根不干活。真正干活的是Ingress Controller------它跑在集群里,监听Ingress(或Gateway API)资源的变化,然后动态配置底层的反向代理(如Nginx、Envoy、HAProxy等),把流量正确转发到后端Service。
前置条件(缺一不可,别再问为啥不生效了):
- Kubernetes集群版本≥1.19
- 集群内至少部署了一个Ingress Controller
- 有Cluster-admin权限(部署时用得到)
- 网络环境允许Service Type=LoadBalancer或NodePort暴露
三、主流Ingress Controller选型对比(7款)
好,这是我日常被问最多的问题:"到底选哪个?"。说实话,没有绝对的好坏,关键在于你的场景。
我先上一张对比表,后面再逐个拆:
|---------------------------|---------------------|-------------|-------------------------|--------------|------|----------|
| Controller | 核心引擎 | 协议支持(L4/L7) | 灰度能力 | Dashboard | 学习曲线 | Istio融合度 |
| ingress-nginx(社区版) | Nginx | L4+L7 | ✅原生支持(权重/Header/Cookie) | 无 | 低 | 低 |
| NGINX Inc(商业版) | Nginx Plus | L4+L7 | ✅更完善(JWT/主动健康检查) | ✅ | 中 | 中 |
| Traefik | Traefik | L4+L7 | ✅原生支持(权重/Header) | ✅ | 低 | 中 |
| HAProxy | HAProxy | L4+L7 | ✅ | 无 | 中 | 低 |
| Envoy Gateway | Envoy | L4+L7 | ✅Header匹配/权重切分 | 无 | 高 | 极高 |
| Istio Ingress Gateway | Envoy | L4+L7 | ✅(通过VirtualService直接支持) | 通过Kiali等组件提供 | 高 | 完整集成 |
| Kong | OpenResty/Nginx+Lua | L4+L7 | ✅权重/Header/Cookie | ✅(收费版) | 中 | 中(通过插件) |
补充:若你用云厂商托管版(ACK/CCE/TKE),直接优先选择云原生网关(如阿里云 MSE)或者负载均衡(如腾讯云CLB)方案,开箱即用,不需要自己运维。
3.1 ingress-nginx------行业事实标准
最流行、最成熟、最不用太动脑的选项。社区版本(kubernetes/ingress-nginx)覆盖了90%的使用场景,大多数团队都在用。
优点:
- 生态极大,几乎所有K8s相关问题都有人踩过
- 基于Annotation配置,简单粗暴,上手快
- 与K8s服务发现无缝集成
- 支持直接扩展Lua脚本(高级用户可用)
- 免费版本覆盖几乎所有生产需求
缺点:
- Annotation堆砌导致YAML文件越来越长
- 配置重载时必须重启或reload Nginx(虽然官方努力解决)
- 某些特殊场景性能偏弱(参见HAProxy官方性能测试报告,明确显示HAProxy在相同QPS下CPU资源消耗更低)
- 最关键的,也是最重要的一点------Kubernetes SIG Network已于2025年11月宣布ingress-nginx将于2026年3月正式退役。建议新项目直接考虑Gateway API生态,存量项目尽早规划迁移。
提个醒:ingress-nginx有两个版本------社区版(kubernetes/ingress-nginx)和F5商业版(nginxinc/kubernetes-ingress)。社区版用的人更多,免费。商业版有JWT验证、主动健康检查等额外功能,但多数场景不需要。
3.2 Traefik------云原生自动发现
如果你追求"配置越少越好",那Traefik是个好选择。它最大的亮点是自动服务发现------CRD或者甚至K8s Service Annotations就能配上路由,不用写Ingress也行。
我推荐这些场景用它:
- 微服务数量爆炸式增长(几百甚至上千,手写Ingress配置不现实)
- 团队想用社区化仪表版快速发现问题
- 给无状态、持续交付频率极高的业务做路由
但它有个明显缺点:默认配置性能偏弱。官方或第三方基准测试显示,在高并发场景下,Traefik的QPS只有HAProxy或类似控制器的约一半或更少,CPU占用还偏高。
3.3 HAProxy------性能神器
性能、连接数、延迟三方面都极其强悍。根据HAProxy官方发布的基准测试(用5个流量注入Pod、50个并发负载发生器全面测试),HAProxy Kuberentes Ingress Controller在RPS(每秒请求数)、延迟和HTTP错误率三个维度排第一。尤其惊人的是,它达到42000 RPS时,用户态CPU使用率竟然比竞品更优。
最佳场景:
- 极度追求性能的中间层(如API网关高并发接入层)
- 长连接负载(WebSocket、gRPC流式通信)
- 要求SLI延迟p99极低(游戏、实时同步类业务)
不过你得注意:社区文档相对少,配置有点复杂,不像ingress-nginx随便搜出几百篇教程。同时它的扩展机制更多依赖HAProxy本身的Lua或SPOE转发控制器,对K8s原生功能支持(如用户定义CRD)相对保守。
3.4 Envoy Gateway (带Gateway API)和Istio Ingress Gateway
这两个本质内核一样------都是Envoy(L7代理之王)。Gateway API的兴起让这两个方案逐渐成为大厂主力选择,尤其在服务网格或云原生高级流量治理层面。
Envoy Gateway :纯粹把Gateway API+K8s标准做得很好,不附带服务网格特性,专注南北向流量入口的Gateway功能,如果你需要纯净、不额外引入网格层的高性能Gateway,它很合适。但1.0版本之后其Operator模式必须自建CRD管理,功能相对单一。
Istio Ingress Gateway:实质是用Istio控制面管理Envoy数据面,提供Gateway流量入口功能。强大的流量镜像、故障注入、请求超时重试、丰富的权重和基于Header的动态路由,这些都是Istio的强项。
但Istio上Gateway得想明白两件事:
- Istio本身是服务网格系统,启用Ingress Gateway一般会顺带注入sidecar,资源消耗确实偏高;
- 配置相对复杂,需要学习Gateway、VirtualService、DestinationRule等几个概念才能用好。
个人观点:新项目如果要用Gateway API+Envoy,建议直接上Istio Ingress Gateway,因为未来Istio 1.24+会完全拥抱Gateway API方向,它的社区和商用支持更好。具体等下第六部分详细介绍。
3.5 Kong------API管理最强
假如你需要完善的API策略、开发者门户、多种认证插件甚至自定义Lua插件时,Kong是最佳选择。Kong底层基于Nginx+OpenResty,所以性能和扩展性都很好。
适用场景:
- 需要API Key、OAuth、JWT、ACL、请求转换等多层认证场景
- API产品化(需审计日志、流量控制、开发 Portal)
- 多团队租户隔离管理
四、生产环境部署与配置(以Nginx为例)
为了不空洞,这里直接用ingress-nginx生产部署来实操(我知道你关心怎么做)。
1)安装------Helm方式(强烈推荐)
我一般用Helm来管理,方便升级维护:
# 添加ingress-nginx官方仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
# 创建命名空间(如果还没建)
kubectl create namespace ingress-nginx
# 安装/升级(假设v1.11.3,建议查最新稳定版本)
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--set controller.replicaCount=2 \
--set controller.nodeSelector."kubernetes\.io/os"=linux \
--set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \
--set controller.service.type=LoadBalancer
关键点:生产环境副本数至少2,并确保它们分布在不同的节点上,避免资源抢占和单点故障。如果要极致性能,最好给Ingress Controller分配独占节点。
2)验证控制器是否正常工作
# 看Pod状态
kubectl get pods -n ingress-nginx
# 看Service获取外部IP
kubectl get svc -n ingress-nginx
预期输出应该能看到ingress-nginx-controller的EXTERNAL-IP(云环境)或(本地/自建)。
3)部署一个最小Ingress测试路由
先部署一个测试服务:
kubectl create deployment demo --image=nginx --port=80
kubectl expose deployment demo --port=80
再写一个Ingress规则(保存为test-ingress.yaml):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: demo.example.com
http:
paths:
- path: /test
pathType: Prefix
backend:
service:
name: demo
port:
number: 80
应用并测试:
kubectl apply -f test-ingress.yaml
# 获取Ingress入口IP(或用host header方式测试)
curl -H "Host: demo.example.com" http://<EXTERNAL-IP>/test
结果应该返回nginx欢迎页面,说明路由成功打通。
五、Gateway API:下一代流量管理标准
我已经不止一次遇到用户问:"ingress-nginx退役了,我们该用什么?"
首先是2025年11月11日,Kubernetes官方正式宣布ingress-nginx(社区版)将于2026年3月正式退役。这意味着不会再有任何新功能、安全补丁或bug修复,长期依赖这条路有问题。
那怎么办?Kubernetes官方给出的明确答案就是 Gateway API------ingress的下一代继任者,解决了ingress的灵活性、协作性和可移植性三大致命缺点。
5.1 Gateway API vs Ingress:核心差异
|-------|--------------------|--------------------------------------------|
| 维度 | Ingress API (老) | Gateway API (新) |
| 资源模型 | 单一Ingress对象 | GatewayClass + Gateway + Route(角色分离) |
| 协议支持 | HTTP/HTTPS(L7) | HTTP/HTTPS + gRPC + TLS + TCP + UDP(L4+L7) |
| 高级路由 | 依赖控制器特有Annotations | 标准API字段(Header匹配、流量切分、请求镜像) |
| 关注点分离 | 路由和基础设施配置混在一起 | 基础设施运维、集群管理员、应用开发三层清晰隔离 |
| 可移植性 | 低(Annotations不同) | 中等至高(核心规范一致) |
Gateway API的核心设计思想是角色分离:基础设施供应商定义GatewayClass,集群管理员配置Gateway,应用开发者创建HTTPRoute。一句话总结:之前一个人管所有,现在各管各的,乱不了。
5.2 Gateway API实现方案选型
截至2026年4月,主流Gateway API实现包括:
|--------------------------|-----------|---------------|-------|-------------------------|
| 实现方案 | 引擎 | Istio集成 | 生产就绪度 | 适合场景 |
| NGINX Gateway Fabric | NGINX | 通过独立部署集成 | GA ✅ | 想继续用Nginx但拥抱Gateway API |
| Envoy Gateway | Envoy | 通过独立部署集成 | GA ✅ | 高性能、纯Gateway需求 |
| Istio | Envoy | 原生集成(GAMMA倡议) | GA ✅ | 服务网格+Gateway一体化 |
| Cilium | Envoy | 原生集成 | GA ✅ | 网络+安全+可观测全栈 |
| Kong | OpenResty | 通过插件支持 | GA ✅ | API管理需求 |
个人强烈建议:新项目直接在Gateway API上构建,不用再回头看旧Ingress。具体实现选型参考上面的对比。
六、Istio集成:从Ingress到服务网格
很多用户在Ingress和Istio之间纠结。我直接说结论:
- Ingress:只处理集群边缘的南北向HTTP路由,简单配置就行。
- Istio Ingress Gateway:不仅做南北向入口,还与Istio网格深度结合,实现细粒度流量管理(金丝雀发布、故障注入、请求重试、全链路可观测等),南向内部服务也能统一治理。
官方文档说得也很清楚:即使不安装Istio,你也可以用独立Ingress Controller。但如果想让Istio接收外部流量,就必须启用Istio自己的Ingress Gateway,作为外部流量的南北代理。
6.1 快速集成Istio Ingress Gateway
假设你已经有Istio安装(我建议profile=minimal模式轻装):
istioctl install --set profile=minimal -y
kubectl label namespace default istio-injection=enabled
部署Envoy网关的Gateway资源:
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: my-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
再配合VirtualService定义路由规则:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: my-vs
spec:
hosts:
- "*"
gateways:
- my-gateway
http:
- match:
- uri:
prefix: /v1
route:
- destination:
host: my-service-v1
port:
number: 8080
- match:
- uri:
prefix: /v2
route:
- destination:
host: my-service-v2
命令走一遍,Istio就开始接管流量了。
6.2 Istio + Gateway API
在Istio 1.24+版本中,社区已全面拥抱Kubernetes Gateway API,不再推荐使用旧的Istio Gateway+VirtualService API来处理集群入口流量(但存量兼容)。
迁移到Gateway API后,用HTTPRoute代替VirtualService:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: my-http-route
spec:
parentRefs: # 上游指向Istio Gateway资源
- name: my-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /v1
backendRefs:
- name: my-service-v1
port: 8080
- matches:
- path:
type: PathPrefix
value: /v2
backendRefs:
- name: my-service-v2
port: 8080
这个过程体验更规范、表达能力显著增强。
七、生产实战:灰度发布与环境隔离
这里我以ingress-nginx的canary注解为例。
灰度发布需求------比如v1版本稳定跑着,v2版本要逐步放量,先5%再25%再到全量:
生产Ingress规则:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-v1
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-v1-svc
port:
number: 80
灰度Ingress(canary):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-canary
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "5" # 5%权重
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-v2-svc
port:
number: 80
应用后,5%流量自动切到v2服务------极其方便。Nginx灰度还支持基于Header、Cookie等其他条件,更复杂场景也能满足。
八、常见"坑"与排查手段
十年经验浓缩几个高频故障模式:
坑1:Ingress规则不生效------Service名写错或端口不对
经典手滑错误:YAML中定义路径正确但Service名拼错了,Ingress无任何反应。检查方法:
kubectl describe ingress <ingress-name> -n <namespace> # 看Events字段
kubectl logs -n ingress-nginx <controller-pod-name> | grep -E "^[WE]" # 看控制器日志
坑2:SSL证书不匹配和注解冲突
YAML里tls字段引用的Secret不存在或证书过期,直接导致路由全disable。如果某个Controller注解和其他注解(比如rewrite或者cors等)组合冲突,也会导致配置生成失败。
坑3:ingress-nginx不支持暴露TCP/UDP
默认ingress不支持TCP/UDP,需要额外修改ConfigMap配置。但用Gateway API就天然解决了。
坑4:Webhook拒绝部署
升级ingress-nginx或修改IngressClass时,webhook校验会拦截无效配置(如正则表达式写错或注解组合冲突)。简单诊断:
# 检查webhook配置有效性
kubectl get validatingwebhookconfigurations | grep ingress-nginx
坑5:Ingress跨namespace引用服务
一个Ingress只能引用同namespace下的Service,不少用户踩过坑,K8s原生限制不可绕过。
坑6:还是退役迁移问题也值得一提
如果还在用ingress-nginx 1.2以下的老版本,已经不再维护。建议逐步规划Gateway API迁移路径,有章可循。
九、总结与互动
好了,这篇文档从Ingress Controller选型讲到Gateway API趋势,从Istio集成讲到了灰度发布和避坑指南,我自认已经把最核心的东西梳理清楚了。
核心回顾:
- Ingress Controller不只是一个Ingress资源,它才是真正的流量入口执行者。选型时别只看流行度,要考虑性能、运维成本、云原生符合度和社区活跃度。
- ingress-nginx即将退役,Gateway API是明确未来方向。新项目直接上Gateway API,存量项目及早规划迁移。
- Istio Ingress Gateway在服务网格环境下优势巨大------统一治理南北+东西流量、原生多云可观测、超强灰度策略。
- 灰度发布的最佳实践:借助Ingress Controller自身的canary机制,用很短的变更流程就完成平滑上线,极大降低发布风险。
- 排查常规三板斧:查Ingress Events、查Controller Pods日志、看最终生成的配置(如nginx.conf) ,80%问题都能解决。
我个人强烈建议:中小团队继续用ingress-nginx完成退役前的过渡并准备Gateway API迁移,中等规模以上的企业直接上Istio Ingress Gateway配合Gateway API,这是最省心的长期方案。
最后问你一句:你的集群现在用的是什么Ingress Controller?遇到最坑的问题是什么?欢迎在评论区留言分享一下,我们一起讨论避免更多人掉坑。如果觉得文档有帮助,不妨收藏一下,或者转发给正在做网关选型的同事。