首页/云/云与容器速查/Ingress Controller 与 IngressClass
Kubernetes68 条

Ingress Controller 与 IngressClass

Ingress 的实际实现:监听 Ingress 对象并生成反向代理配置。集群里通常只装一种主 controller;ingressClassName 用来在多个 controller 间分配规则。

云与容器速查云更新于 2026-10-13

Ingress 与 Controller 的关系

Ingress 只是一份路由规则声明,真正干活的是 Ingress Controller:它监听 Ingress 对象的变化并生成反向代理配置。集群里通常只装一种主 controller;IngressClass 用来声明实现类,Ingress 通过 ingressClassName 关联到具体 controller。多套 controller 并存时,类不匹配的规则不会被任何一方处理,表现就是规则看着没问题但请求返回 404。

基本信息

部署形态通常以 Deployment 或 DaemonSet 加 Service(LoadBalancer 或 NodePort)运行
真实入口controller 的 Service 拿到外部 IP 或端口,那才是用户实际访问的入口
IngressClass声明实现类,可指定默认类;Ingress 通过 ingressClassName 关联
常见实现ingress-nginx、Traefik、云厂商的 LB Controller
生效方式controller 监听到对象变化后重载配置,通常数秒到数十秒生效
行为差异超时、上传大小、重定向等大多由注解控制,不同实现不通用

典型使用场景

  • 用域名与路径把多个服务收敛到一个入口,减少暴露面
  • TLS 终止与证书集中管理,后端服务只管明文 HTTP
  • 灰度发布:按比例或按请求头分流到不同后端
  • 多 controller 分工:内网与公网各一套,或按业务线隔离
  • 配置默认 IngressClass 后简化规则,不必每条都写 className

查看与验证

查看与验证
kubectl get pods -n ingress-nginx                            # controller 是否在运行
kubectl get ingressclass                                     # 有哪些实现类、谁是默认
kubectl get svc -n ingress-nginx ingress-nginx-controller    # 外部 IP 才是入口
kubectl describe ingress web | tail -10                      # 规则与后端解析结果
kubectl logs -n ingress-nginx deploy/ingress-nginx-controller --tail=50  # 转发与重载日志
curl -H 'Host: web.example.com' http://<入口IP>/             # 绕过 DNS 直接验证规则

逐层排查顺序

层级检查命令典型症状
入口地址kubectl get svc -n ingress-nginx外部 IP 长时间 pending,说明 LB 未就绪
controllerkubectl get pods -n ingress-nginxPod 未就绪时所有请求连接被拒或 502
IngressClasskubectl get ingressclass类不匹配时规则被忽略,返回 404
规则与 Servicekubectl describe ingress web后端端口或名称写错时返回 502
Endpoints 与 Podkubectl get endpoints为空说明 selector 错或就绪探针未通过
controller 的 Service 一旦以公网负载均衡或 NodePort 暴露,入口就等于对全网开放:需要配合安全组限制来源、只放开 80 与 443,必要时叠加 WAF,避免后端服务被直接扫描。
接入链路要按层排查:LB 或 NodePort → controller → Ingress 规则 → Service → Endpoints → Pod,任一层断掉都表现为 404、502 或超时。注解在不同实现间不通用,换 controller 时注解要一并迁移,否则会被静默忽略。

易错点

  • Ingress 规则没问题但返回 404:请求根本没进到该 controller,需检查类匹配与入口地址是否正确
  • 集群装了两套 controller:className 没写的规则归属不明,行为随机,重启后可能换另一方接管
  • 只改 Ingress 不看 Endpoints:Service 的 selector 写错时规则全对但一直 502
  • 注解从其他实现照搬:不同 controller 的注解不通用,被忽略后表现为「配置写了但不生效」

数据来源与参考

  • Kubernetes Docs:Ingress Controllers
  • ingress-nginx 文档

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌