Ingress NGINX: The Default Front Door of Kubernetes, Retired by the People Who Kept It Alive
Born as a sample controller inside the kubernetes/contrib repo, Ingress NGINX became the default traffic entry point for half the cloud-native world — then was archived after years of one-maintainer heroics.
Sources
- kubernetes/ingress-nginx repository (archived 2026-03-24)
- Founding commit 34b949c13 — 'Godeps', Prashanth Balasubramanian (2016-02-08, history preserved from kubernetes/contrib)
- Repo-split 'Initial commit' 3a595cd49 — Tim Hockin (2016-11-04)
- First PR #1 'Basic structure' — bprashanth, merged 2016-11-10
- kubernetes-retired/contrib — the incubator repo (archived)
- aledbf step down from ingress-nginx — PR #6729 (2021-01-07)
- Issue #13002 — maintainers' wind-down plan + InGate announcement (2025-03-20)
- IngressNightmare: CVE-2025-1974 — Wiz Research (2025-03-24)
- Ingress NGINX Retirement: What You Need to Know — Kubernetes blog (2025-11-11, Tabitha Sable)
- Statement from the Kubernetes Steering and Security Response Committees (2026-01-29)
- controller-v1.15.1 — final upstream release (2026-03-19)
- controller-v1.15.0 — last minor release (2026-03-09)
- kubernetes-sigs/ingate — the replacement that never matured (EOL)
- chainguard-forks/ingress-nginx — EmeritOSS maintenance fork (2025-12-04)
- controller-v1.15.10 — Chainguard fork latest (2026-08-05, CVE-2026-42533 backport)
- Announcing Ingress2gateway 1.0 — Kubernetes blog (2026-03-20)
- F5 acquires NGINX — press release (2019-03-11, $670M)
- NGINX Ingress Controller (F5/nginxinc, actively maintained — the naming trap)
- Gateway API — the successor standard (v1.6, SIG Network)
- The Register: Users scramble as critical open source project left to die (2025-12-02)
- The New Stack: CNCF Retires the Ingress Nginx Controller (2025-11-21)
- HN thread: Kubernetes Ingress Nginx is retiring (215 points, 2025-11-13)
Somewhere in your infrastructure right now, a controller is happily proxying traffic through an NGINX config nobody has updated in years. That's the Ingress NGINX story in one sentence: software so reliable that half the cloud-native world forgot it was maintained by one or two people in their spare time — until , when the Kubernetes project archived the repository and the forgetting stopped being free. This is the tale of the default front door of Kubernetes: built as a demo, adopted by millions, patched through a 9.8-CVSS nightmare, and finally retired not because it stopped working, but because it worked too well for anyone to notice it was dying.
The Origin: A Sample Implementation That Became the Standard
2015 — Ingress the API ships before Ingress the product exists
When Kubernetes 1.1 shipped in , it carried a new beta API
object called Ingress: a declarative way to say "route HTTP(S) traffic for these hosts
and paths to these services." The API was a spec with no engine — the Kubernetes docs explicitly told users to
pick an Ingress controller
implementation, and the ecosystem scrambled to build them. The reference implementations lived in
kubernetes/contrib, a grab-bag incubator repo for "components in the Kubernetes
ecosystem that aren't part of the Kubernetes core" — a repo that would itself be archived years later,
a detail that foreshadows this whole tale.
February 8, 2016 — commit 34b949c13, "Godeps"
The oldest commit preserved in the Ingress NGINX history is
34b949c13 — "Godeps",
pushed on by
Prashanth Balasubramanian (GitHub: bprashanth), a Google engineer
working on Kubernetes networking. The commit is nothing but vendored dependencies — a project being born
mid-gestation, already behind on its Go vendor tree. In those first months the repo lived under the
ingress/ path of kubernetes/contrib, with Manuel de Brito Fontes
(GitHub: aledbf, a Chilean engineer who lists the NGINX Ingress Controller as
his own creation from October 2015) landing the NGINX-specific machinery: Prometheus metrics, health checks,
DaemonSet support, and the first raw-config annotations that would later become the project's defining
feature — and its fatal flaw.
November 4, 2016 — repo split, and a ten-year identity crisis begins
On ,
Tim Hockin committed "Initial commit"
and the controller moved out of contrib into its own home: kubernetes/ingress-nginx.
The first PR, #1 "Basic structure",
was bprashanth's, merged November 10. At the same time, the company
NGINX, Inc. was building its own
controller in a repo named nginxinc/kubernetes-ingress (created March 2016). From
day one the ecosystem carried two confusingly named NGINX ingress controllers — community
ingress-nginx versus vendor nginx-ingress — a naming trap
that would still be biting buyers in 2026, after F5's
$670M acquisition of NGINX in March 2019
made the vendor one an F5 product line. The community one, free and cloud-agnostic, won the adoption war
decisively — 19,468 stars against the F5 controller's ~5,077 at archive time —
but the names remain a landmine: "nginx ingress" today means an actively maintained F5 product;
"ingress nginx" means an archived community project. Order matters.
The Timeline: From Contrib to Core to Archived
- 2015-11-09 — Kubernetes 1.1 ships with the beta Ingress API. The API is a spec without an engine; the ecosystem is invited to build controllers. NGINX, being the default reverse proxy of the era, is the obvious data plane.
- 2016-02-08 — Preserved first commit
34b949c13("Godeps") by Prashanth Balasubramanian, inside the kubernetes/contrib incubator. aledbf's NGINX work follows within weeks. - 2016-11-04 — Repo splits out as kubernetes/ingress-nginx (Tim Hockin, "Initial commit" 3a595cd49). PR #1 merges November 10. The project now has its own issue tracker, its own release cadence — and its own maintenance bill.
- 2017–2019 — The adoption flywheel: annotation-driven configurability (rewrite targets, CORS, auth snippets, canary weights) plus zero vendor lock-in makes ingress-nginx the de facto default. Helm charts ship; every managed-Kubernetes competitor bundles either it or something inspired by it.
- 2019-03-11 — F5 acquires NGINX Inc. for $670M. The community project keeps the name people actually type; F5's own controller keeps a different repo and a fraction of the adoption. Corporate NGINX now has a commercial incentive not to volunteer for community-controller maintenance.
- 2020-04 → 2021-04 — Helm chart 2.x era begins (2.0.0, April 2020); controller v0.46.0 lands April 2021 after a roughly monthly cadence. The project looks healthy from the outside: releases ship, issues close. The inside story: it's running on fumes.
- 2021-01-07 — aledbf opens PR #6729: "aledbf step down from ingress-nginx", merged February 5. The creator of the project reduces his role to emeritus. The bus factor drops to effectively one — and stays there for years.
- 2021-08-24 — controller v1.0.0: the 1.0 milestone finally lands, five years in. ElvinEfendi, Gacko (Marco Ebert), rikatz (Ricardo Katz) and strongjz (James Strong) carry the project through its nominal adulthood.
- 2023-12 → 2024-04 — Marco Ebert (Gacko), who had been carrying the Helm chart since 2023, promotes himself through the OWNERS files: chart maintainer in December 2023 (PR #10796), full
ingress-nginx-maintainersin April 2024 (PR #11165). By late 2024 the active maintainer bench is essentially him plus a handful of part-time approvers. - 2023-10-31 — Gateway API v1.0 ships — SIG Network's role-oriented, portable replacement for the annotation-driven Ingress model. Platform teams start planning the migration; the community's best networking engineers redirect their attention accordingly.
- 2024-11 → 2024-12 — At KubeCon NA 2024 the maintainers present their wind-down path in the project's maintainer talk, and the successor project InGate gets its repo (created 2024-12-02). The plan is documented for everyone in issue #13002 (opened 2025-03-20): monthly patches only, no new features, "1.13 in all likelihood will be the last minor release," and a migration path from ingress-nginx to InGate built with the Gateway API community.
- 2025-03-24 — Wiz Research discloses IngressNightmare: CVE-2025-1974 (CVSS 9.8) plus CVE-2025-1097, -1098, -24514 and -24513 — unauthenticated RCE chains through the admission webhook, exposing cluster secrets across namespaces. About 43% of cloud environments vulnerable; 6,500+ clusters including Fortune 500 exposed their admission webhooks to the public internet. Patches ship same-day as controller-v1.12.1/v1.11.5 (2025-03-25). The maintainer bench absorbs the worst security event in the project's history — still essentially part-time.
- 2025-07-07 — controller v1.13.0, the promised "last minor release" of the wind-down plan... except the plan quietly stretches: v1.14.0 follows on 2025-11-04 with dependency bumps (Go, Alpine, NGINX 1.27.1).
- 2025-11-11 — KubeCon NA Atlanta: SIG Network and the Security Response Committee announce the retirement. Best-effort maintenance until March 2026, then no releases, no bugfixes, no security patches. InGate "never progressed far enough to create a mature replacement; it will also be retired." HN thread: 215 points, and a community discovering the bus factor in real time.
- 2026-01-29 — The Steering + Security Response Committee statement: "About half of cloud native environments" (internal Datadog research) rely on the tool; "choosing to remain with Ingress NGINX after its retirement leaves you and your users vulnerable to attack." Tim Hockin, on the community pushback: "The people who currently work on ingress-nginx do so FOR FREE... In the two years this has been a topic, almost nobody has stepped up to help. Shuttering this project is necessary."
- 2026-03-09 → 2026-03-19 — Final releases: controller v1.15.0 (March 9) and v1.15.1 (March 19), plus final Helm charts 4.15.1/4.14.5/4.13.9 — dependency bumps (Go updates, Alpine 3.23.3, NGINX 1.27.1, Kubernetes 1.35 CI) to the end. Marco Ebert lands the last commits.
- 2026-03-20 — SIG Network ships Ingress2gateway 1.0 on the exact retirement date: a CLI that translates Ingress resources and 30+ common nginx annotations into Gateway API manifests, warning about the untranslatable ones. The migration tool arrived the same week the door closed.
- 2026-03-24 — The repository is archived (read-only), matching the README's own usage warning: "If you are not already using ingress-nginx, you should not be deploying it as it is not being developed." The default front door of Kubernetes is closed for new construction.
- 2025-12-04 → present — The afterlife begins before the funeral: Chainguard forks the repo on December 4, 2025 under its new EmeritOSS maintenance program (the same model it used for Kaniko). The fork ships controller-v1.15.2 on 2026-03-30 — six days after upstream archival — and continues through v1.15.10 (2026-08-05, backporting CVE-2026-42533 and CVE-2026-49975 patches into NGINX). Security maintenance, explicitly not feature development; community PRs not accepted.
Crisis Points: What Actually Killed It
1. The snippet flexibility (2016–2026, terminal)
The feature that made Ingress NGINX ubiquitous was raw escape hatches: annotations like
configuration-snippet and server-snippet that let any
Ingress author inject arbitrary NGINX directives into the generated config. In 2016 that was pragmatism —
the Ingress API couldn't express half of what NGINX could do, so the controller let you escape the API.
By 2025 the Kubernetes project's own retirement post called it what it had become: "Yesterday's flexibility
has become today's insurmountable technical debt." Arbitrary config injection is, by definition, a
configuration-injection attack surface — IngressNightmare's RCE chains went through exactly that machinery
in the admission webhook. The architectural sin was committed in year one; the CVE was just the receipt.
2. The maintainer arithmetic (2021–2026, terminal)
Every public statement from the project says the same thing in different words: for years, one or two people did the development work, on their own time, after hours and on weekends. The contributor numbers are stark — aledbf: 2,501 commits, more than the next three humans combined; the top non-bot, non-lead contributors (Gacko at 449, ElvinEfendi at 219, rikatz at 178, bprashanth at 163) mostly rotated to other projects. The creator stepped back to emeritus in 2021. The wind-down announcement in issue #13002 explicitly begged for help and got none at the required scale. Tim Hockin's summary is the harshest fact in this tale: "In the two years this has been a topic, almost nobody has stepped up. There are no new maintainers in the pipeline."
aledbf Manuel de Brito Fontes 2501 (creator; emeritus since 2021)
Gacko Marco Ebert 449 (last active maintainer)
ElvinEfendi Elvin Efendi 219
rikatz Ricardo Katz 178
bprashanth Prashanth B. 163 (founder, kubernetes/contrib era)
longwuyuan Long Wu Yuan 117
Compare the corporate footprint: F5 — the company that owns NGINX itself — employs engineers on its
own controller (nginx/kubernetes-ingress, actively maintained) but never
staffed the community one that had four times its adoption. The company with the most direct commercial
stake in "NGINX + Kubernetes" spent seven years letting volunteers carry the version everyone actually used.
3. InGate — the successor that wasn't (2024–2026)
The maintainers' 2024 plan was honest and reasonable: stop adding features, build InGate as an Ingress-plus-Gateway-API controller with the Gateway API community, then put ingress-nginx into formal maintenance mode. The InGate repo was created on , and the retirement post's verdict two years later is one of the most quietly devastating sentences the Kubernetes project has published: "InGate development never progressed far enough to create a mature replacement; it will also be retired." The repo now lives under kubernetes-retired with 719 stars and an EOL notice. Both the old tool and its designated successor died in the same announcement.
Community Engine & Corporate Influence: Who Actually Built It
The money question for any infrastructure tale: who paid? In Ingress NGINX's case the honest answer is
nobody, structurally — and that is precisely the point the retirement makes. The founding
engineers came through Google (bprashanth) and the early Kubernetes networking circle (aledbf, ElvinEfendi);
later maintainers arrived from the user side — Marco Ebert in the Helm-chart trenches, Ricardo Katz and
James Strong from the security and community angle. No vendor ever owned it, which was the adoption
superpower: every cloud, every distro, every homelab could ship it without asking a competitor for
permission. Kubernetes itself does not distribute it, so it never sat in a CNCF maturity level with the
foundation's institutional support either — it lived in the kubernetes/ GitHub org
on SIG Network's volunteer bench.
The corporate influence story is mostly about absence. F5 bought NGINX and invested in its own parallel controller. The hyperscalers bundled ingress-nginx into managed offerings (AKS's Application Routing add-on is an NGINX-based controller) but staffed their own alternatives — Azure Application Gateway for Containers, GKE Gateway — rather than the community project. Datadog, whose internal research says ~50% of cloud-native environments run the thing, contributed its co-chair of Kubernetes SIG Security (Tabitha Sable) to the retirement communication rather than maintainers to the code. The one company that did step up did so after the death sentence, commercially: Chainguard now maintains the EmeritOSS fork — free in source form on GitHub, with hardened CVE-free images as the commercial upsell. Rogers Communications, quoted in Chainguard's announcement, said out loud what most platform teams were thinking: a supported ingress-nginx "allows us to spend more time to evaluate the plan to move teams to another ingress controller or gateway API."
The successor standard, Gateway API, is where the community's networking engineering effort now actually lives — v1.6.0 in June 2026 (TCPRoute and UDPRoute to standard), v1.6.2 by September, with conformant implementations from Envoy Gateway, Istio, Cilium, Traefik, HAProxy's Unified Gateway, F5's own NGINX Gateway Fabric, and cloud providers. The lesson the ecosystem extracted: adoption without contribution is not sustainability, and "the default" is a role someone has to be paid to hold.
Current Trajectory: The Verdict
- Existing deployments keep working — that's the trap. The retirement post and the January 2026 steering statement are explicit: Helm charts and images remain available, existing proxies keep proxying. Nothing breaks on day one, which is exactly why half the affected environments will discover their dependency only when something does break — or when the next IngressNightmare lands with no patch coming. "Unless you proactively check, you may not know you are affected until you are compromised."
- The migration is real engineering, not a controller swap. The Steering Committee's own words: "None of the available alternatives are direct drop-in replacements." If you used more than basic host/path routing — auth annotations, snippets, canary weights, rewrite rules — Ingress2gateway 1.0 will translate some of it and warn you about the rest (configuration-snippet is explicitly unsupported, as it should be). Our Gateway API vs. Ingress guide covers the decision framework; the migration is a project, not a kubectl apply.
- Chainguard's fork is a bridge, not a resurrection. EmeritOSS is maintenance-only by design: dependency and CVE patches (v1.15.2 through v1.15.10 as of August 2026, including 2026 CVE backports), no features, no community PRs. If your plan is "stay on NGINX ingress," the honest version is "buy time on Chainguard's fork while you plan the Gateway API migration" — the Rogers quote is the template. The fork even patches NGINX-source CVEs upstream never shipped for this release line, with ABI caveats for third-party dynamic modules.
- Watch the naming trap when you buy. "NGINX Ingress Controller" (F5, nginx/kubernetes-ingress) is actively maintained and commercial; "ingress-nginx" is archived community software. If a vendor slides "NGINX ingress" into a renewal quote in 2026, make them type out which one. The managed paths — AKS Application Routing, GKE Gateway, AGC — each have their own lock-in trade-offs.
- The F5 abstention is the tale's moral. The company that owns the data plane, the trademark, and $670M of NGINX goodwill spent 2019–2026 not staffing the most-deployed controller built on its own software. When you evaluate "community edition vs. vendor edition" of any infrastructure tool, ingress-nginx is now the canonical case study of what happens when everyone assumes the community edition is someone else's job.
Who should still care: any team running the archived controller in
2026 owes itself one afternoon — the detection command is
kubectl get pods --all-namespaces --selector app.kubernetes.io/name=ingress-nginx —
followed by an honest inventory of which annotations actually made it into your manifests. Teams that never
left the basic host/path/TLS feature set will find the Gateway API migration cheap; teams with snippet-laden
legacy configs have found the hardest part of the migration is not the tooling but discovering what their
Ingress objects actually do.
Final verdict: Ingress NGINX is the purest specimen in the OSS graveyard of a success-theory failure: it won adoption completely, monetized nothing, staffed itself on evenings and weekends, and was retired by the same volunteer structure that built it — politely, publicly, and with a four-month warning the community roundly declared insufficient. The Kubernetes project's decision was correct and the maintainer burnout was real; so was the ecosystem's decade of free-riding on two people's spare time. The front door of half the cloud-native world is now a read-only repository, a security-maintained fork with a commercial upsell, and a migration CLI shipped the same week the door closed. Everything about how your cluster receives traffic in 2026 traces back to what this project normalized — and everything about how open-source infrastructure dies traces back to what it never solved.