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.