Differences Between nginxinc/kubernetes-ingress and kubernetes/ingress-nginx Ingress Controllers
There are two NGINX-based Ingress controller implementations out there: the one you can find in this repo (nginxinc/kubernetes-ingress) and the one from kubernetes/ingress-nginx repo. In this document, we explain the key differences between those implementations. This information should help you to choose an appropriate implementation for your requirements or move from one implementation to the other.
Which One Am I Using?
If you are unsure about which implementation you are using, check the container image of the Ingress controller that is running. For the nginxinc/kubernetes-ingress Ingress controller its Docker image is published on DockerHub and available as nginx/nginx-ingress.
The Key Differences
The table below summarizes the key difference between nginxinc/kubernetes-ingress and kubernetes/ingress-nginx Ingress controllers. Note that the table has two columns for the nginxinc/kubernetes-ingress Ingress controller, as it can be used both with NGINX and NGINX Plus. For more information about nginxinc/kubernetes-ingress with NGINX Plus, read here.
|Aspect or Feature||kubernetes/ingress-nginx||nginxinc/kubernetes-ingress with NGINX||nginxinc/kubernetes-ingress with NGINX Plus|
|Authors||Kubernetes community||NGINX Inc and community||NGINX Inc and community|
|NGINX version||Custom NGINX build that includes several third-party modules||NGINX official mainline build||NGINX Plus|
|Load balancing configuration|
|Merging Ingress rules with the same host||Supported||Supported||Supported|
|HTTP load balancing extensions - Annotations||See the supported annotations||See the supported annotations||See the supported annotations|
|HTTP load balancing extensions -- ConfigMap||See the supported ConfigMap keys||See the supported ConfigMap keys||See the supported ConfigMap keys|
|TCP/UDP||Supported via a ConfigMap||Supported via a ConfigMap with native NGINX configuration||Supported via a ConfigMap with native NGINX configuration|
|Websocket||Supported||Supported via an annotation||Supported via an annotation|
|TCP SSL Passthrough||Supported via a ConfigMap||Not supported||Not supported|
|JWT validation||Not supported||Not supported||Supported|
|Session persistence||Supported via a third-party module||Not supported||Supported|
|Configuration templates *1||See the template||See the templates||See the templates|
|Command-line arguments *2||See the arguments||See the arguments||See the arguments|
|TLS certificate and key for the default server||Required as a command-line argument/ auto-generated||Required as a command-line argument||Required as a command-line argument|
|Reporting the IP address(es) of the Ingress controller into Ingress resources||Supported||Supported||Supported|
|Extended Status||Supported via a third-party module||Not supported||Supported|
|Dynamic reconfiguration of endpoints (no configuration reloading)||Supported with a third-party Lua module||Not supported||Supported|
*1 -- The configuration templates that are used by the Ingress controllers to generate NGINX configuration are different. As a result, for the same Ingress resource the generated NGINX configuration files are different from one Ingress controller to the other, which in turn means that in some cases the behavior of NGINX can be different as well.
*2 -- Because the command-line arguments are different, it is not possible to use the same deployment manifest for deploying the Ingress controllers.
How to Swap an Ingress Controller
If you decide to swap an Ingress controller implementation, be prepared to deal with the differences that were mentioned in the previous section. At minimum, you need to start using a different deployment manifest.