Which Ingress Controller Do I Need?
There are two NGINX-based Ingress controller implementations out there: the one made by NGINX (nginxinc/kubernetes-ingress ) and the one made by Kubernetes (kubernetes/ingress-nginx ). 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.
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 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 via the Ingress resource|
|Merging Ingress rules with the same host||Supported||Supported via Mergeable Ingresses||Supported via Mergeable Ingresses|
|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 custom resources||Supported via custom resources|
|Websocket||Supported||Supported via an annotation||Supported via an annotation|
|TCP SSL Passthrough||Supported via a ConfigMap||Supported via custom resources||Supported via custom resources|
|JWT validation||Not supported||Not supported||Supported|
|Session persistence||Supported via a third-party module||Not supported||Supported|
|Canary testing (by header, cookie, weight)||Supported via annotations||Supported via custom resources||Supported via custom resources|
|Configuration templates *1||See the template||See the templates||See the templates|
|Load balancing configuration via Custom Resources|
|HTTP load balancing||Not supported||See VirtualServer and VirtualServerRoute resources||See VirtualServer and VirtualServerRoute resources|
|TCP/UDP load balancing||Not supported||See TransportServer resource||See TransportServer resource|
|TCP SSL Passthrough load balancing||Not supported||See TransportServer resource||See TransportServer resource|
|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.
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.