K8S Ingress控制器两个实现版本(kubernetes-ingress 和 ingress-nginx)的区别

K8s 有2个基于 Nginx 的 Ingress 控制器实现版本: 一个是 nginx实现版本 nginxinc/kubernetes-ingress, 另一个是 k8s实现版本 kubernetes/ingress-nginx. 在这篇文章里, 我们将介绍两者实现的核心差异. 这些信息可以帮助你根据需要选择恰当的实现, 或者从其中一个迁移至另外一个.

我当前用的哪个?

如果你不确定你当前在使用的是哪个实现版本, 可以检查当前在运行的 Ingress 控制器的容器镜像来查看. 其中 nginxinc/kubernetes-ingress 实现版本的 Docker 镜像是发布在 DockerHub 的 nginx/nginx-ingress.

[译者补充] 我们可以通过如下命令查看:

$ sudo docker images | grep ingress
[sudo] password for faceless:
nginx/nginx-ingress                                                        1.5.5               1e674eebb1af        9 months ago        161MB

上面的输出显示我们当前使用的 nginx/nginx-ingress 实现.

核心差异

下面的表格总结了两个 Ingress 控制器实现的核心差异. 注意这个表格右边两列都是关于nginx实现版本的控制器, 他们是分别针对 Nginx 和 Nginx Plus的. 有关更多 Nginx Plus 相关的 Nginx实现版本的信息, 可以查看这里.

特性 K8S 实现版本 Nginx 实现版本 (NGINX) Nginx 实现版本 (NGINX Plus)
基础 -- -- --
作者 K8S 社区 Nginx 公司和社区 Nginx 公司和社区
Nginx版本 包含一些三方模块的定制的 Nginx 版本 Nginx 官方版本 Nginx Plus
商业支持 N/A N/A 包含
通过Ingress资源配置负载均衡 -- -- --
合并同一host的Ingress规则 支持 通过 Mergeable Ingresses 支持 通过 Mergeable Ingresses 支持
HTTP负载均衡扩展 -- 注解方式 K8S 支持的注解 Nginx 支持的注解 Nginx 支持的注解
HTTP负载均衡扩展 -- ConfigMap 方式 K8S 支持的 ConfigMap 主键 Nginx 支持的 ConfigMap 主键 Nginx 支持的 ConfigMap 主键
TCP/UDP 通过 ConfigMap 支持 通过 ConfigMap (原生 NGINX 配置) 支持 通过 ConfigMap (原生 NGINX 配置) 支持
Websocket 支持 通过注解支持 通过注解支持
TCP SSL Passthrough 通过 ConfigMap 支持 不支持 不支持
JWT 验证 不支持 不支持 支持
Session 持久化 通过三方库支持 不支持 支持
金丝雀测试 (通过 header, cookie, weight) 通过注解支持 通过定制的资源支持 通过定制的资源支持
配置模板 *1 模板 模板 模板
通过定制化资源配置负载均衡配置 -- -- --
HTTP负载均衡 不支持 VirtualServer 和 VirtualServerRoute 资源 VirtualServer 和 VirtualServerRoute 资源
部署 -- -- --
命令行参数 *2 K8S 版 参数列表 Nginx 版 参数列表 同左
默认 Server 的 TLS 证书和秘钥 必需(命令行参数) / 自动生成 必需(命令行参数) 必需(命令行参数)
Helm Chart 支持 支持 支持
运维 -- -- --
上报 Ingress 控制器的 IP地址到Ingress资源 支持 支持 支持
扩展的状态 通过三方模块支持 不支持 支持
Prometheus 整合 支持 支持 支持
动态配置 endpoints (无需重新加载配置) 通过三方模块支持 不支持 支持

注释:

*1 -- 用于 Ingress 控制器生成 Nginx 配置的配置模板是不同的. 造成的结果是, 对与同样的 Ingress 资源, 不同的控制器生成的配置文件是不同的. 这就意味着在某种情况下, Nginx的行为也可能不一样.

*2 -- 因为命令行参数是不一样的, 所以也就无法使用同一个部署清单来部署 Ingress 控制器.

如何切换 Ingress 控制器

如果你决定切换 Ingress 控制器的实现版本, 做好处理在上文中提到的差异. 至少, 你需要使用一个不同的部署清单.

翻译说明

本文翻译至: Differences Between nginxinc/kubernetes-ingress and kubernetes/ingress-nginx Ingress Controllers, 有细节补充.

翻译日期: 2020/06/07.

阅读 307

推荐阅读