🚀 Executive Summary

TL;DR: The Kubernetes community’s Ingress-NGINX controller is deprecated, causing confusion with the actively maintained F5/NGINX Inc. version due to similar naming. Users should verify their controller’s image tag to determine if they are affected, and if so, plan a migration to the more robust and future-proof Gateway API.

🎯 Key Takeaways

  • Only the Kubernetes Community Ingress-NGINX controller (from `kubernetes/ingress-nginx` GitHub repo, `registry.k8s.io` image) is deprecated; the F5/NGINX Inc. controller (from `nginxinc/kubernetes-ingress` GitHub repo, `docker.io/nginx` image) remains actively maintained.
  • To verify your Ingress controller, check the running pod’s image tag using `kubectl get pods -n -o jsonpath='{.items[0].spec.containers[0].image}’`; `registry.k8s.io` indicates the deprecated version, while `nginx/nginx-ingress` suggests the supported F5/NGINX version.
  • The Gateway API is the recommended future for Kubernetes ingress, offering a role-based model with GatewayClass, Gateway, and HTTPRoute resources that improve separation of concerns and enable developers to manage routing without cluster-level permissions.

Understanding the Ingress-NGINX Deprecation — Before You Migrate to the Gateway API

Confused by the Ingress-NGINX deprecation? You’re probably fine. This guide clarifies which controller is affected and outlines your real options before you panic-migrate to the Gateway API.

Wait, Which Ingress-NGINX is Deprecated? A Guide for the Trenches

I got a PagerDuty alert at 2 AM. The message was from a junior engineer, frantic: “URGENT: Core ingress controller is deprecated, need to migrate prod ASAP!” I stumbled to my laptop, my heart pounding, picturing our entire production environment about to go dark. After a quick check, I saw the truth: he’d read the Kubernetes announcement, panicked, and was about to rip out a perfectly stable, non-deprecated Ingress controller. We’ve all been there. A scary-looking announcement drops, and the impulse is to act immediately. But in this case, the real problem isn’t the code—it’s the name.

The Root of the Panic: Two Ingresses, One Name

This whole mess comes down to a simple, frustrating fact: there are two major projects called “Ingress-NGINX,” and they are not the same. One is a community project maintained by Kubernetes contributors, and that’s the one being deprecated. The other is maintained by F5/NGINX, and it’s alive and well. Most production setups I’ve seen are using the F5/NGINX version.

Here’s the breakdown so you can tell them apart:

Attribute Kubernetes Community (The Deprecated One) F5/NGINX Inc. (The Supported One)
Status Deprecated Actively Maintained
Maintainer Kubernetes SIG-Network F5/NGINX
GitHub Repo kubernetes/ingress-nginx nginxinc/kubernetes-ingress
Typical Image Registry registry.k8s.io/... docker.io/nginx/... or private registry
Common Annotation Class kubernetes.io/ingress.class: nginx nginx.org/ingress.class: nginx

The Kubernetes project is shifting its focus to the new, more powerful Gateway API, which is the right move for the ecosystem. But the poor naming choice has caused a lot of unnecessary fire drills.

Solution 1: The “Are You Sure?” Sanity Check

Before you do anything else, you need to verify which controller is actually running in your cluster. Don’t trust the Helm chart name or old documentation. Check the running pod directly. This is your five-minute fix to prevent a five-hour outage.

Run this command, replacing ingress-nginx with the namespace your controller is running in:

kubectl get pods -n ingress-nginx -o jsonpath='{.items[0].spec.containers[0].image}'

Now, look at the output:

  • If you see something like registry.k8s.io/ingress-nginx/controller:..., then yes, you are running the deprecated community version. Don’t panic, but proceed to the next solutions.
  • If you see nginx/nginx-ingress:... or something from your company’s private registry, you are likely using the F5/NGINX version. You can breathe a sigh of relief. The deprecation notice does not apply to you.

Pro Tip: I’ve seen teams get tripped up by this. The pod might be named `ingress-nginx-controller-xyz`, but the image source is the only ground truth. Always check the image tag!

Solution 2: The Proactive Path – Start Learning the Gateway API

Okay, so let’s say you’re safe for now—you’re running the F5/NGINX version. My advice? Don’t just close the ticket. The Gateway API is the future of ingress in Kubernetes, and it’s worth getting familiar with now.

Unlike the old Ingress object, which crammed everything into one resource, the Gateway API splits responsibilities in a way that actually makes sense for teams:

  • GatewayClass: Defined by the cluster admin (that’s us!). It says, “We have an NGINX-based gateway available for use.”
  • Gateway: Also managed by us. It requests a load balancer from the cloud provider and opens ports (e.g., “Open port 443 for the `prod-web-gateway`”).
  • HTTPRoute: Managed by developers. They can attach their services to a Gateway without needing cluster-level permissions (e.g., “Route traffic for `api.myapp.com/v1` to the `api-v1-service`”).

This role-based approach is a massive improvement. It means developers can manage their own routing without us having to review every single path change. Start reading the docs, maybe even spin up a test implementation in a dev cluster. This is the way forward.

Solution 3: The “Okay, I’m Actually Affected” Migration Plan

If your sanity check revealed you *are* running the deprecated `k8s.io/ingress-nginx`, it’s time to plan a migration. This is not a “rip and replace” job for a Tuesday morning; it’s a project. You’re moving from a simple Ingress object to a Gateway API implementation.

Here’s the high-level battle plan:

  1. Install a Gateway API Provider: The Gateway API is just a set of standards. You need a controller that implements them. Options include NGINX Gateway Fabric, Istio, Cilium, Traefik, etc.
  2. Deploy a Gateway Resource: The infrastructure team creates a `Gateway` resource that defines the entry point, like your old controller service.
  3. Translate Ingress to HTTPRoute: This is the bulk of the work. You need to convert your existing `Ingress` rules into `HTTPRoute` rules.

For example, this old Ingress rule:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
spec:
  rules:
  - host: "example.com"
    http:
      paths:
      - path: /foo
        pathType: Prefix
        backend:
          service:
            name: my-foo-service
            port:
              number: 8080

Becomes something like this new `HTTPRoute`:

apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: my-app-httproute
spec:
  parentRefs:
  - name: prod-web-gateway # This attaches to the Gateway we made
    namespace: networking
  hostnames: ["example.com"]
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /foo
    backendRefs:
    - name: my-foo-service
      port: 8080

Once you’ve translated your rules, you test them using a temporary hostname or by editing your local hosts file. When you’re confident everything works, you make the final DNS switch to point to the new Gateway’s load balancer IP. Done.

Warning: Treat this like any other infrastructure migration. Do it in a staging environment first. Test everything: TLS, redirects, headers, and path routing. Have a rollback plan that involves simply pointing the DNS back to the old Ingress controller’s IP.

Conclusion

So, before you wake up your lead engineer in a panic, take a deep breath. Check your image tags. Most of you reading this will discover you’re fine and can go back to your regularly scheduled work. For those who are affected, don’t see it as a crisis. See it as a planned opportunity to adopt a more robust, scalable, and secure API for managing traffic into your cluster. The future is here, it just requires a map and a bit of planning.

Darian Vance - Lead Cloud Architect

Darian Vance

Lead Cloud Architect & DevOps Strategist

With over 12 years in system architecture and automation, Darian specializes in simplifying complex cloud infrastructures. An advocate for open-source solutions, he founded TechResolve to provide engineers with actionable, battle-tested troubleshooting guides and robust software alternatives.


🤖 Frequently Asked Questions

❓ How can I determine if my Kubernetes Ingress-NGINX controller is the deprecated community version?

Check the image tag of your running Ingress controller pod. If the image starts with `registry.k8s.io/ingress-nginx/controller:…`, you are using the deprecated community version. If it’s `nginx/nginx-ingress:…` or from a private registry, you are likely using the supported F5/NGINX Inc. version.

❓ What are the key advantages of migrating to the Gateway API compared to traditional Ingress objects?

The Gateway API provides a superior role-based model, separating infrastructure concerns (GatewayClass, Gateway) from application routing (HTTPRoute). This allows developers to manage their own routing rules without needing cluster-level permissions, leading to better scalability, security, and team autonomy compared to the monolithic Ingress object.

❓ What is a critical step to ensure a smooth migration from a deprecated Ingress controller to the Gateway API?

Treat the migration as a full infrastructure project. Always perform thorough testing in a staging environment, covering TLS, redirects, headers, and path routing. Crucially, have a detailed rollback plan, such as reverting DNS to the old Ingress controller’s IP, to mitigate potential issues.

Leave a Reply

Discover more from TechResolve - SaaS Troubleshooting & Software Alternatives

Subscribe now to keep reading and get access to the full archive.

Continue reading