Nginx 是独立的反向代理 / 负载均衡软件;Ingress 是 K8s 的路由规则 API,本身不处理流量,需要 Ingress Controller(最常见就是 Nginx Ingress)来落地。
下面从定位、关系、用法、场景四个方面讲清楚。
一、定位与本质区别
Nginx
- 独立软件:Web 服务器 + 反向代理 + 负载均衡。
- 直接处理流量:监听端口、解析请求、转发到后端。
- 无 K8s 依赖:任何服务器都能部署。
- 配置静态为主:改配置 → reload 生效。
Ingress(K8s 资源)
- K8s API 对象:只是 “规则描述”(YAML)。
- 不处理流量:只定义 “域名 / 路径 → 哪个 Service”。
- 必须搭配控制器:如Nginx Ingress Controller、Traefik、HAProxy。
- 动态配置:kubectl apply 规则,控制器自动更新配置。
简单类比:
- Nginx = 物理路由器(自己干活)
- Ingress = 路由表(只写规则)
- Nginx Ingress Controller = 带自动更新的路由器(读路由表 + 干活)
二、三者关系:Ingress ↔ Nginx ↔ Nginx Ingress
Ingress(规则)YAML 里写:
host: a.com/path → service-a。Nginx Ingress Controller(执行者)监听 K8s Ingress 变化 → 自动生成 Nginx 配置 → reload Nginx。
Nginx(底层引擎)真正接收请求、路由、负载均衡的进程。
流程:用户请求 → Nginx Ingress(Nginx 进程)→ 按 Ingress 规则 → 转发到 K8s Service → Pod。
三、核心功能对比
表格
| 维度 | Nginx(独立) | Ingress(K8s 规则) | Nginx Ingress Controller |
|---|---|---|---|
| 流量处理 | ✅ 直接处理 | ❌ 不处理 | ✅ 基于 Nginx 处理 |
| 路由规则 | 静态配置 | 声明式 YAML | 动态生成 Nginx 配置 |
| K8s 集成 | 需手动对接 Service | 原生 K8s API | 原生集成,自动发现 Service |
| 负载均衡 | 强(多种算法) | 依赖控制器 | 强(继承 Nginx) |
| SSL/TLS | 支持 | 支持(通过控制器) | 支持 |
| 动态更新 | 需 reload | 自动触发 | 自动 reload |
| 适用场景 | 物理机 / 虚拟机 / 非容器 | K8s 集群 | K8s 集群入口 |
四、什么时候用哪个?
用独立 Nginx
- 非 K8s 环境(物理机、虚拟机)。
- 需要极强定制化(复杂 Lua 脚本、第三方模块)。
- 简单站点、静态资源、传统架构。
用Nginx Ingress(Ingress + Controller)
- K8s 集群,需要统一入口管理多个服务。
- 希望声明式配置(YAML),不手动改 Nginx 配置。
- 域名 / 路径路由、SSL 终止、流量灰度、负载均衡。
五、常见误区澄清
Ingress 不是 Nginx 的替代品Ingress 是 K8s 的规则标准;Nginx 是其中一种实现引擎。
Nginx Ingress ≠ IngressIngress 是规则;Nginx Ingress 是 “规则 + Nginx 实现” 的整体方案。
Ingress API 已冻结(K8s 官方)新项目推荐用Gateway API(Ingress 升级版),但 Nginx Ingress 仍广泛使用。
六、总结
- Nginx:通用、成熟、高性能的独立反向代理,非容器环境首选。
- Ingress:K8s 的七层路由规则 API,只定义规则,不处理流量。
- Nginx Ingress Controller:Ingress 的标准实现,用 Nginx 做数据面,K8s 环境入口首选。
一句话:非 K8s 用 Nginx;K8s 用 Nginx Ingress(Ingress+Controller)。