Ingress 控制器
Ingress 控制器是 Kubernetes 网络流量管理的关键组件,决定了外部请求如何安全、高效地路由到集群内部服务,是实现弹性和可扩展网络架构的基础。
在 Kubernetes 集群中,若希望 Ingress 资源能够正常工作,必须部署至少一个 Ingress 控制器。与作为 kube-controller-manager 组件自动启动的其他控制器不同,Ingress 控制器需要用户根据实际需求单独部署和管理。选择合适的 Ingress 控制器对于集群的网络能力和安全性至关重要。
官方支持的控制器
Kubernetes 社区官方维护和支持多种 Ingress 控制器,适用于不同的云平台和场景。下表总结了主流官方控制器及其适用环境。
| 控制器名称 | 适用平台/说明 |
|---|---|
| AWS Load Balancer Controller | 专为 AWS 环境设计 |
| GCE Ingress Controller | Google Cloud 原生支持 |
| Ingress NGINX(kubernetes/ingress-nginx) | 曾经最流行的社区实现,已于 2026 年 3 月退役,仅作迁移参考 |
第三方控制器
除了官方控制器,社区还提供了丰富的第三方 Ingress 控制器选择,满足不同云环境、企业级和开源需求。
| 类别 | 控制器名称 | 说明/适用场景 | 链接 |
|---|---|---|---|
| 云服务商 | AKS 应用程序网关 Ingress 控制器 | Microsoft Azure 集成 | 文档 |
| 阿里云 MSE Ingress | 阿里云微服务引擎 | 文档 | |
| OCI Native Ingress Controller | Oracle Cloud Infrastructure | GitHub | |
| 企业级/商业 | Citrix Ingress 控制器 | 企业级负载均衡与安全 | GitHub |
| F5 BIG-IP Ingress 服务 | 高级流量管理与安全 | 文档 | |
| FortiADC Ingress 控制器 | 集成 Fortinet 安全能力 | 文档 | |
| NGINX Ingress Controller(F5,nginx/kubernetes-ingress) | F5 维护的独立项目,有开源版与 NGINX Plus 商业版,与已退役的社区 Ingress NGINX 无关 | 官网 | |
| Wallarm Ingress Controller | 集成 WAF,API 安全 | 官网 | |
| 开源社区 | Apache APISIX Ingress 控制器 | 高性能 API 网关 | GitHub |
| Traefik Kubernetes Ingress 提供程序 | 现代反向代理 | 文档 | |
| Contour | 基于 Envoy 的 Ingress 控制器 | 官网 | |
| Emissary-Ingress | 云原生 API 网关 | 官网 | |
| Istio Ingress | 服务网格集成 | 文档 | |
| Kong Ingress 控制器 | 云原生 API 网关 | GitHub | |
| HAProxy Ingress | 基于 HAProxy 的负载均衡器 | 官网 | |
| 新兴/专业化 | Cilium Ingress 控制器 | 基于 eBPF 的网络方案 | 文档 |
| Higress | 阿里云原生网关 | GitHub | |
| Kusk Gateway | OpenAPI 驱动的 API 网关 | 官网 | |
| ngrok Kubernetes Ingress 控制器 | 隧道与边缘连接 | GitHub | |
| Pomerium Ingress 控制器 | 零信任网络访问 | 文档 |
多控制器管理
在复杂的生产环境中,往往需要同时运行多个 Ingress 控制器,以满足不同业务或团队的需求。Kubernetes 提供了灵活的机制来实现多控制器共存和精细化流量管理。
使用 IngressClass 资源
通过 IngressClass 资源,可以在同一集群中部署和管理多个 Ingress 控制器。以下 YAML 示例展示了如何定义一个名为 nginx 的 IngressClass:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: nginx
spec:
controller: k8s.io/ingress-nginx指定控制器类型
创建 Ingress 资源时,可以通过 ingressClassName 字段明确指定所用控制器类型。以下 YAML 示例演示了如何将 Ingress 资源绑定到特定控制器:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80默认控制器设置
如果未在 Ingress 资源中指定 ingressClassName,Kubernetes 会自动应用默认的 IngressClass。可以通过为 IngressClass 资源添加如下注解来设置默认控制器:
metadata:
annotations:
ingressclass.kubernetes.io/is-default-class: "true"选择建议
选择合适的 Ingress 控制器时,建议综合考虑以下因素,以确保网络架构的稳定性和可扩展性。
| 考虑因素 | 说明 |
|---|---|
| Gateway API 支持 | Ingress API 特性已冻结,新项目应优先选择同时实现 Gateway API 的控制器,便于平滑演进 |
| 云环境兼容性 | 优先选择与云平台深度集成的控制器 |
| 功能需求 | 是否需要 WAF、缓存、认证等高级功能 |
| 性能要求 | 控制器的性能表现和资源消耗 |
| 社区支持 | 项目活跃度和文档完善性 |
| 运维复杂度 | 部署、配置和维护的易用性 |
总结
Ingress 控制器是 Kubernetes 网络流量管理的核心,直接影响集群的可扩展性、安全性和高可用性。随着 Ingress NGINX 退役和 Gateway API 走向成熟,流量入口正在从 Ingress 过渡到 Gateway API,选型时应把 Gateway API 支持作为首要考量,迁移方法参见 从 Ingress 迁移到 Gateway API。合理选择和配置 Ingress 控制器,结合 IngressClass 等机制实现多控制器协同,是构建现代云原生网络架构的关键。建议根据实际业务需求、云平台特性和团队运维能力,选择最适合的 Ingress 控制器方案,并持续关注社区动态和最佳实践。
参考文献
- Awesome Cloud Native - jimmysong.io
- Ingress Controllers - kubernetes.io
- Ingress NGINX Retirement: What You Need to Know - kubernetes.io
- Ingress NGINX: Statement from the Kubernetes Steering and Security Response Committees - kubernetes.io