NGINX Ingress Controller: Kubernetes Traffic Routing
NGINX Ingress Controller is F5's own Kubernetes Ingress implementation, running on open-source NGINX or paid NGINX Plus. Standard Ingress covers host/path routing and TLS termination; VirtualServer and TransportServer custom resources add traffic splitting and TCP/UDP/TLS-passthrough routing plain Ingress can't do. Reach for it for first-party NGINX support with a Plus path; skip it to avoid a second CRD set alongside stock Ingress.
Understanding the NGINX Ingress Controller
NGINX Ingress Controller is the official Ingress Controller for Kubernetes, built and maintained by the NGINX team at F5. It runs as a pod in your cluster, watching Ingress and its own VirtualServer/VirtualServerRoute resources to reconfigure the NGINX load balancer โ handling host/path routing, TLS termination, and load balancing for Websocket, gRPC, TCP, and UDP. It's a different codebase from kubernetes/ingress-nginx.
Key Features for Kubernetes Traffic
- โContent-based routing via standard Ingress: host-based routing (e.g., foo.example.com vs bar.example.com) and path-based routing (e.g., /serviceA vs /serviceB).
- โTLS/SSL termination configured per hostname.
- โVirtualServer and VirtualServerRoute custom resources for traffic splitting and advanced content-based routing beyond what the Ingress spec supports.
- โThe TransportServer resource covers TCP, UDP, and TLS Passthrough traffic.
- โLoad balancing for Websocket and gRPC applications in addition to HTTP.
- โExtra NGINX/NGINX Plus behavior exposed through annotations and the ConfigMap resource, without needing a custom resource for every tweak.
Installing the Ingress Controller
The README doesn't paste install commands directly โ it points to a Helm chart or a set of Kubernetes manifests, both linked from the docs, so treat those pages as the source of truth for exact steps. What is confirmed: the current stable release is 5.5.4, and its images are published to DockerHub, the GitHub Container registry, the Amazon ECR Public Gallery, and Quay.io (NGINX Plus images come from F5's own container registry, or you build your own from source). The README stresses that the image, the manifests/Helm chart, and the docs you follow all need to match versions โ pairing an edge image with the 5.5.4 manifests, for example, isn't supported. After installing, the README's own next step is configuring a simple app either through the plain Ingress resource (its Cafe example) or the VirtualServer resource (its basic-configuration example).
Configuring Ingress and Advanced Routing
Two configuration paths exist side by side. The plain Ingress resource handles host- and path-based routing plus per-hostname TLS termination โ the same shape as any Kubernetes Ingress, extended with annotations and a ConfigMap resource when you need to reach past the Ingress spec's own fields. VirtualServer and VirtualServerRoute are the second path, purpose-built for traffic splitting and content-based routing the plain Ingress object can't express, and the README ships a basic-configuration example for that route. For traffic that isn't HTTP at all, the TransportServer resource handles TCP, UDP, and TLS Passthrough. Beyond routing shape, the controller load-balances Websocket and gRPC traffic the same way it does HTTP. Every example referenced lives in the repo's examples/ directory, alongside the fuller configuration-examples docs.
Why Choose NGINX for Kubernetes Ingress?
- โBuilt and maintained by the NGINX team at F5 itself, not a third-party reimplementation โ you're running the same engine's own controller.
- โVirtualServer/VirtualServerRoute and TransportServer resources cover traffic splitting, TCP/UDP, and TLS Passthrough that plain Kubernetes Ingress has no spec for.
- โOne controller handles HTTP, Websocket, gRPC, TCP, and UDP, so there's no separate L4 load balancer to run alongside Ingress for non-HTTP traffic.
- โSBOMs ship for both binaries and Docker images (SPDX format via syft), so you can run a supply-chain scan like grype against the exact image you deploy.
- โApache-2.0 licensed, so the open-source NGINX edition has no restrictions on production use even without a Plus contract.
- โA recurring public community call every other Monday covers PRs, issues, and feature requests in the open, per the README.
Considerations and Potential Limitations
- โณTwo parallel configuration models to learn โ plain Ingress with annotations/ConfigMap, and the VirtualServer/VirtualServerRoute CRDs โ instead of one.
- โณThe commercial support contract is only for NGINX Plus customers; the README doesn't mention an equivalent for the free NGINX edition.
- โณThe README insists documentation only be used against the exact stable release you're running (currently 5.5.4) โ mismatch the image, manifests, and docs versions and you're on your own.
- โณInstall steps aren't spelled out in the README itself โ you're sent to separate Helm chart or manifest docs, so there's no copy-pasteable quick start in the facts here.
- โณEasy to confuse with kubernetes/ingress-nginx โ same 'NGINX Ingress Controller' idea, different codebase, and the README has to call that out explicitly.
Distinguishing from Other NGINX Ingress Options
Frequently Asked Questions
NGINX Ingress Controller runs on either open-source NGINX or NGINX Plus, per its README, with NGINX Plus adding a commercial support contract on top of the same controller.
NGINX Ingress Controller (this repo, nginx/kubernetes-ingress) and kubernetes/ingress-nginx are explicitly different projects, per this README's own note โ separate codebases, not two names for the same controller.
NGINX Ingress Controller supports the standard Kubernetes Ingress feature set: host-based and path-based content routing, plus TLS/SSL termination for each hostname.
NGINX Ingress Controller load-balances Websocket, gRPC, TCP, and UDP applications in addition to HTTP, per its README, with TCP/UDP and TLS Passthrough specifically handled through the TransportServer resource.
VirtualServer and VirtualServerRoute are NGINX Ingress Controller's own custom resources, offered as an alternative to plain Ingress for cases like traffic splitting and advanced content-based routing that the standard Ingress object doesn't support.
NGINX Ingress Controller has commercial support when paired with NGINX Plus โ the README states that pairing is covered by a support contract for NGINX Plus customers, with no mention of an equivalent paid tier for the free NGINX edition.
The problem it solves
Kubernetes' built-in Ingress resource only standardizes the basics โ host/path routing and per-hostname TLS โ and leaves protocols like gRPC, raw TCP/UDP, and traffic-splitting patterns like canary releases outside its spec entirely. NGINX Ingress Controller exists to close that gap for people already running NGINX: it implements the standard Ingress object, then layers its own VirtualServer/VirtualServerRoute and TransportServer custom resources on top so those un-standardized cases don't require bolting on a second, unrelated load balancer.
Best use cases
- โขRunning production HTTP(S) ingress for services on Kubernetes where the team already standardizes on NGINX and wants vendor support behind it.
- โขSplitting traffic โ canary or blue-green style routing โ via VirtualServer/VirtualServerRoute when plain Ingress's simple path/host matching isn't enough.
- โขLoad balancing non-HTTP protocols โ Websocket, gRPC, raw TCP/UDP โ through one controller instead of bolting on a separate L4 load balancer.
- โขTLS Passthrough for workloads that need to terminate TLS themselves rather than at the ingress, handled through the TransportServer resource.
- โขTeams on NGINX Plus who want a commercial support contract tied directly to their ingress layer.
Who should try it โ and who should skip
Reach for NGINX Ingress Controller if your team already standardizes on NGINX, needs routing beyond what plain HTTP Ingress can express โ traffic splitting, gRPC, raw TCP/UDP โ or wants a straight line to NGINX Plus's commercial support. Skip it if you just need basic HTTP routing with no existing NGINX preference, since you'd be learning the VirtualServer/VirtualServerRoute CRDs on top of standard Ingress for capabilities you may not need, or if you're already deep in kubernetes/ingress-nginx and don't want a second, differently-configured controller running alongside it.
Related repositories
Curious whether kubernetes-ingress is right for you?
Let ChatGPT, Claude, or Perplexity look into it โ click below and see what AI actually says about kubernetes-ingress.
