Skip to content

docs: add RFC 0007 for Gateway API ingress migration - #7

Open
mani-thumu wants to merge 4 commits into
RADAR-base:mainfrom
mani-thumu:docs/rfc-0007-gateway-api-ingress-migration
Open

docs: add RFC 0007 for Gateway API ingress migration#7
mani-thumu wants to merge 4 commits into
RADAR-base:mainfrom
mani-thumu:docs/rfc-0007-gateway-api-ingress-migration

Conversation

@mani-thumu

Copy link
Copy Markdown

Summary

Adds RFC 0007 proposing the migration of RADAR-base ingress from the annotation-driven NGINX Ingress Controller to the Kubernetes Gateway API, implemented with NGINX Gateway Fabric (NGF) 2.6.6.

The two stacks run in parallel: NGINX Ingress keeps serving production on its own NLB while the Gateway API stack is stood up alongside it, validated one service at a time, and cut over per-service via DNS. The rollout starts on the stage cluster with radar-gateway as the first migrated service. The whole stack is Helm/Helmfile-managed behind opt-in _install flags and is fully reversible.

What's included

  • Full RFC following the repo template (Motivation → Reference design →Compatibility → Alternatives → Ops → Security → Testing → Open questions).
  • An architecture / traffic-flow diagram (Mermaid) showing the parallel live (nginx-ingress) and new (Gateway API) paths converging on the shared radar-gateway Service.
  • Rationale for pinning NGF 2.6.6 over 2.5.1 (CVE, leader-failover, and Agent mTLS fixes; same Gateway API 1.5.1 CRD surface).

Notes

  • Draft status — opening for review/discussion.
  • Removing NGINX Ingress is explicitly out of scope and will be a later, separate change.

@github-actions github-actions Bot added rfc RFC document and related discussion area: platform Platform-wide concerns, infra, deployment labels Jul 17, 2026
@mani-thumu
mani-thumu force-pushed the docs/rfc-0007-gateway-api-ingress-migration branch from 71f6a59 to 8728f4c Compare July 17, 2026 23:06
@yatharthranjan yatharthranjan added the status: draft RFC is in draft and under review label Jul 23, 2026

@yatharthranjan yatharthranjan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks Mani, great work. Just some comments.

Also had a question on other redirect / proxy properties that we configure for some of the components such as path rewrites/redirects, rate limiting, etc. Is there provision for these already?


Summary
-------
This RFC proposes migrating RADAR-base ingress from the annotation-driven [NGINX Ingress Controller](https://github.com/kubernetes/ingress-nginx) to the [Kubernetes Gateway API](https://gateway-api.sigs.k8s.io/), implemented by [NGINX Gateway Fabric (NGF)](https://github.com/nginx/nginx-gateway-fabric). The two stacks run **in parallel**: NGINX Ingress keeps serving production traffic on its own load balancer while the Gateway API stack is stood up alongside it, validated one service at a time, and cut over per-service. The rollout starts on the **stage** cluster with **radar-gateway** as the first migrated service. Everything is delivered as Helm charts and wired through Helmfile behind `_install` flags, so the entire stack is GitOps-managed and reversible.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since this is open-source radar-base RFC, leave out any specifics of KCL deployments. You can mention using generic canary releases or blue-green deployment as a good to have.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated ✅ - removed the KCL-specifics - cluster name, hostname and infra IDs from the diagram and rollout, and framed the parallel run + per-service DNS cutover as a generic canary / blue-green pattern (weighted split noted as a good-to-have).

6. Repeat step-by-step for remaining services. Only after all are migrated, plan NGINX Ingress removal (separate RFC/PR).
7. Promote the same flow to production once stage is stable.

**Resource footprint (NGF):** one controller Deployment plus per-Gateway nginx data-plane pods; sizeable but comparable to the existing ingress controller. Node placement can be constrained via `nodeSelector`/`tolerations` under the `nginx_gateway_fabric` values.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we have an indication for initial setting of requests and limits?


Open questions
--------------
- **Gateway naming:** the chart names the Gateway `radar-base` (via `fullnameOverride`); the old manual stage Gateway was `nginx` (now deleted). `radar-base` is uncontested going forward — confirm we standardise on it.

@yatharthranjan yatharthranjan Jul 23, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we name it radar-base-k8s-gateway ?

Open questions
--------------
- **Gateway naming:** the chart names the Gateway `radar-base` (via `fullnameOverride`); the old manual stage Gateway was `nginx` (now deleted). `radar-base` is uncontested going forward — confirm we standardise on it.
- **Migration order:** sequence of services after `radar-gateway`, and any that need special routing (redirects, path rewrites) not yet covered by the HTTPRoute template.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be discussed or checked (via existing helm-charts / production.yaml files) before cutting over

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed. Before any service is cut over, I audit its ingress annotations against the existing helm-charts / per-cluster values and reproduce each as an HTTPRoute filter or NGF policy — a per-service gate, not a global one. I've inventoried the annotations in use across all services; the ones needing extra care are those relying on CORS preflight, session-cookie affinity, basic auth, or raw config snippets (which use NGF's SnippetsFilter).
As discussed, radar-gateway (first) needs a URL rewrite, CORS headers, a body-size policy, and one small snippet.
The full mapping is in the new "Routing feature parity" section, and each service's HTTPRoute is validated with curl --resolve against the new NLB before its DNS moves.

--------------
- **Gateway naming:** the chart names the Gateway `radar-base` (via `fullnameOverride`); the old manual stage Gateway was `nginx` (now deleted). `radar-base` is uncontested going forward — confirm we standardise on it.
- **Migration order:** sequence of services after `radar-gateway`, and any that need special routing (redirects, path rewrites) not yet covered by the HTTPRoute template.
- **NGF sizing / placement:** dedicated nodes or tolerations for the NGF data plane on stage/production?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lets use DMZ (public subnet) ones, same as nginx currently

@github-actions
github-actions Bot requested a review from yatharthranjan July 24, 2026 14:43
@mani-thumu

mani-thumu commented Jul 24, 2026

Copy link
Copy Markdown
Author

Thanks Mani, great work. Just some comments.

Also had a question on other redirect / proxy properties that we configure for some of the components such as path rewrites/redirects, rate limiting, etc. Is there provision for these already?

Yes, mostly. I've added a "Routing feature parity" section mapping every ingress annotation we actually use to its Gateway API equivalent:

Redirects (HTTP→HTTPS) — already in our HTTPRoute template (RequestRedirect filter).
Path rewrites (rewrite-target) — core URLRewrite filter; the template exposes a generic filters block so it's set in values.
Header manipulation / CORS — Request/ResponseHeaderModifier filters (full CORS preflight needs an NGF SnippetsFilter).
Body size (proxy-body-size) — NGF ClientSettingsPolicy.
Buffering / raw snippets / basic auth — NGF SnippetsFilter (NGF-specific; noted as a portability caveat).
Rate limiting — not configured on any service yet, so nothing to port; when needed it's SnippetsFilter (limit_req) or an external solution to evaluate.
So AFAIK common cases are core filters, and the long tail has an NGF escape hatch. Per-service parity is to be verified before each cutover.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: platform Platform-wide concerns, infra, deployment rfc RFC document and related discussion status: draft RFC is in draft and under review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants