Kubernetes networking · Beginner guide

Migrate ingress-nginx to Gateway API, Step by Step

Your cluster still sends web traffic through ingress-nginx. This guide walks you through moving a SeaGit cluster to Gateway API with Envoy, one button at a time. Each step has a screenshot, and you can go back until the last step.

By , Founder at SeaGit

·

Key takeaways

  • The migration is four buttons, in order: Prepare Envoy, Shift traffic (10%, 25%, 50%, 100%), Move DNS to Envoy, then Finish and remove NGINX.
  • Until DNS moves, every step can be undone. During the soak period after DNS moves, you can move DNS back to NGINX. Finish cannot be undone from the panel.
  • The soak period is your choice: 15 minutes, 1 hour, 6 hours or 24 hours.
  • The Ingress tab is available only for SeaGit clusters on Amazon EKS in your own AWS account.

What is this about?

Think of your cluster as an office building. Every visitor walks through the front door first. The front door reads the address on the request, such as shop.example.com/cart, and sends the visitor to the right room, which is your app. In Kubernetes, that front door is called an Ingress controller.

For years, many clusters used a front door called ingress-nginx. Kubernetes retired it in March 2026. Existing clusters keep working, but nobody will fix the next security bug in it. If you want the reasons and a check for your own cluster, read Kubernetes Ingress NGINX End of Life: Now What?. This article covers only the how.

The new standard for the same job is Gateway API. It splits the front door into parts: a Gateway that the platform team owns, and routes (called HTTPRoutes) that each app team owns. Envoy is a proxy, the program that actually forwards each request to the right app. SeaGit runs Envoy through Envoy Gateway, which reads the Gateway API objects.

The migration moves the front door in small steps. Envoy starts next to NGINX. A share of traffic goes to Envoy first. Only then does the DNS for your hostnames move. NGINX is removed last.

Words you will see

Ingress
A Kubernetes object that says which hostnames and paths go to which app.
Ingress controller
The program that reads Ingress objects and does the routing. ingress-nginx is one.
Gateway API
The newer Kubernetes standard for routing, with Gateway and HTTPRoute objects.
Envoy
A proxy that forwards requests. Envoy Gateway runs it and reads Gateway API objects.
Canary
Sending a small share of real traffic to something new first, and raising the share only while it behaves.
Load balancer
A cloud service with a public address. Traffic from the internet enters through it.
DNS
The internet’s phone book. It turns a hostname such as app.example.com into an address.
TTL
How long other computers keep a DNS answer before they ask again.
cert-manager
A cluster add-on that gets and renews TLS certificates, here from Let’s Encrypt, a free certificate authority.
kubectl
The Kubernetes command-line tool. Optional here: every step in this guide is a click in the console.
Soak period
The wait after DNS moves, when NGINX stays up so clients with the old answer still work.

What you need before you start

  • A SeaGit cluster on Amazon EKS in your own AWS account. The Ingress tab does not appear on other providers.
  • The cluster started. The panel says “Start the cluster to run a migration step” when it is stopped.
  • A supported Kubernetes version. The Envoy Gateway release SeaGit installs supports Kubernetes 1.33 to 1.36. The migration itself does not check the version, so confirm your cluster is in that range before you start.
  • No blockers. If an Ingress uses a setting Envoy cannot serve, the panel lists it. DNS stays on NGINX until you change that Ingress.
  • Time to watch your apps between steps. The soak period you choose is at least 15 minutes.

If you are new to Kubernetes, you do not need to write any YAML for this migration. Everything runs from the SeaGit panel.

The big picture

Figure 1 shows the five stages in the panel, and how a visitor’s request travels at each one. Read it once before you start. It tells you where you are when you look at the screenshots below.

The five stages of the migrationFive boxes in a row: NGINX, Envoy ready, Shifting traffic, DNS on Envoy, and Envoy only. Arrows point from left to right. Under the boxes, the traffic picture shows NGINX first, then a split, then Envoy only.1. NGINXRoutes on NGINX2. Envoy readyEnvoy has routes, no traffic3. Shifting trafficNGINX sends a share to Envoy4. DNS on EnvoyHostnames point at Envoy5. Envoy onlyNGINX removedTraffic pictureBefore:Visitor → DNS → NGINX → your appShifting:Visitor → DNS → NGINX → (a share) → Envoy → your appAfter DNS:Visitor → DNS → Envoy → your app (NGINX up during soak only)Each arrow is one button in the Ingress tab. You can stop or go back until the Finish step.
Figure 1. The five stages: NGINX, Envoy ready, Shifting traffic, DNS on Envoy, and Envoy only. The bottom lines show where a request goes before, during and after the migration.

Step-by-step walkthrough

Open your cluster in the SeaGit dashboard and go to the Ingress tab. The steps below use the buttons on that tab, in the order shown. Each step has the same parts: what to click, what you will see, what happens behind the scenes, and whether you can undo it.

Step 1: Prepare Envoy

What to click. Open the cluster page and go to the Ingress tab. Click Prepare Envoy.

Ingress tab with the stage tracker on NGINX and a running Prepare Envoy step
The Ingress tab while Prepare Envoy runs. The panel shows the stage tracker and a progress bar.

What you will see. A progress bar and the line Running “Prepare Envoy”. When the step finishes, the tracker moves to Envoy ready. No traffic has moved yet.

What is happening behind the scenes. SeaGit installs Envoy Gateway next to NGINX. It then copies each route it can serve into Gateway API objects, and sends a small test request through the new path before it reports success.

Can I undo this? Yes. Abort migration is offered at this stage. It removes Envoy and the copied routes, and NGINX keeps serving everything.

Step 2: Shift traffic to Envoy

What to click. Under Send to Envoy, click 10%. When that finishes, click 25%, then 50%, then 100%. Each click is one step. Wait for the running step to finish before you click the next share.

Traffic split bar moving from NGINX 100 percent to Envoy 25 percent, with the NGINX and Envoy load balancer cards
The traffic bar while the step to 25 percent runs. NGINX and Envoy each have a load balancer card.
Traffic split bar moving from Envoy 25 percent to Envoy 100 percent
The step from 25 percent to 100 percent. At 100 percent, the next button is Move DNS to Envoy.

What you will see. A bar with two parts, NGINX on the left and Envoy on the right. The panel shows the running step as Running “Shift traffic” with the start and target share. Buttons for the other shares stay visible.

What is happening behind the scenes. This is a canary. NGINX forwards that share of each host’s requests to Envoy, using an NGINX canary Ingress, and serves the rest itself. Envoy is tested with real requests while NGINX stays in charge, and because your DNS records do not change in this stage, lowering the share takes effect without waiting on DNS caches.

Can I undo this? Yes. Click 0% to send all traffic back to NGINX. DNS never moved, so nothing else changes. Abort migration is also offered while the cluster is at this stage.

Step 3: Move DNS to Envoy

What to click. When Envoy serves 100%, open the Keep NGINX for dropdown and pick a soak period: 15 minutes, 1 hour (the default), 6 hours or 24 hours. Click Move DNS to Envoy, then confirm in the dialog.

Done: Shift traffic banner with Envoy at 100 percent and the Keep NGINX for dropdown next to Move DNS to Envoy
Envoy at 100 percent. The soak dropdown and Move DNS to Envoy appear together.
Keep NGINX for dropdown open, showing 15 minutes, 1 hour, 6 hours and 24 hours
The soak options. The panel offers four choices; 1 hour is selected by default.
Confirmation dialog asking to move DNS to Envoy, explaining that NGINX stays up during the soak period
The confirmation dialog. Read it before you confirm: it says NGINX stays up during the soak period.
Running step for moving DNS to Envoy shown in the Ingress panel
The DNS step running. SeaGit updates the hostnames in this step.

What you will see. The confirmation text: Your hostnames will point at Envoy’s load balancer. NGINX stays up during the soak period, and you can move DNS back until you finish. After the step, the tracker moves to DNS on Envoy.

What is happening behind the scenes. Before it changes DNS, SeaGit checks the path that real visitors will use: Envoy’s load balancer, then Envoy, then your app. Then it points your hostnames at Envoy’s load balancer. NGINX stays up for the soak period you picked.

Can I undo this? Yes, until you finish. During the soak period, click Move DNS back to NGINX. Your hostnames point at NGINX again, and Envoy keeps running.

Step 4: Wait out the soak period

What to click. Nothing to click. Use the time to check your app (see Check that it worked). The Finish and remove NGINX button does not appear until the soak period ends. Until then, the panel shows Finish available in with a countdown.

DNS on Envoy banner with a countdown for the NGINX soak period and a Move DNS back to NGINX button
During the soak. The banner gives the time left, and Move DNS back to NGINX is still available.

What you will see. The text DNS now points at Envoy. NGINX stays up for … so clients with the old DNS answer keep working; you can still move DNS back. The countdown reaches zero when the soak period is over.

What is happening behind the scenes. Some computers still hold the old DNS answer and keep sending requests to NGINX until their cached answer expires. NGINX stays up so those requests still work.

Can I undo this? Yes. Move DNS back to NGINX is offered until you finish.

Step 5: Finish and remove NGINX

What to click. After the soak period ends, click Finish and remove NGINX, then confirm. This is the last step, and it removes NGINX.

Ready to finish state with the Finish and remove NGINX button
The soak period is over, so the Finish and remove NGINX button is on.
Confirmation dialog saying NGINX and its load balancer are removed and this cannot be undone from here
The confirmation dialog. It says this cannot be undone from the panel.
Running Finish step while NGINX is removed
The finish step running.

What you will see. The running step, then the stage Envoy only. The panel reads This cluster serves all traffic through Envoy (Gateway API). NGINX has been removed. Some buttons stay on the panel, such as Re-sync routes and Reinstall the gateway.

What is happening behind the scenes. SeaGit removes NGINX and its load balancer. After this, Envoy serves all traffic for the cluster.

Can I undo this? No. After Finish, the panel has no step that brings NGINX back. Do this step only when your apps work on Envoy.

Check that it worked

After the last step, the stage reads Envoy only. Then check the result from the outside, the way a visitor would.

The test app’s default page, titled Welcome to nginx, reachable on its hostname after the migration
The test app still answers on its hostname after the migration. The app itself is the stock nginx web server image, which is why its page says “Welcome to nginx” — the request reached it through Envoy.
Certificate details for the app hostname issued by Let’s Encrypt
The app keeps its Let’s Encrypt certificate through the move. cert-manager renews it by answering the check through NGINX until DNS moves, and through Envoy after.

If you have kubectl access to the cluster, three terminal checks help. Replace the example hostname with your own.

  • kubectl get gateway,httproute -A lists the Gateway and HTTPRoute objects in every namespace. Your app routes should appear.
  • dig +short your-app.example.com prints what DNS returns for the hostname. After DNS moves, the answer should lead to the Envoy load balancer shown in the panel.
  • curl -I https://your-app.example.com prints only the response headers, so you can see that the app answers over HTTPS.
shell
kubectl get gateway,httproute -A
shell
dig +short your-app.example.com
shell
curl -I https://your-app.example.com

These commands print only what the cluster returns. Their output depends on your cluster and hostnames, so none is shown here.

If something goes wrong

The panel shows a red banner that starts with Last step … failed, followed by the reason. Read the reason, fix the cause, and then use the same button again. These options cover the rest:

  • Stop before DNS moves. Click Abort migration, offered while the stage is Envoy ready or Shifting traffic. Envoy and the copied routes are removed, and NGINX keeps serving. You can also click 0% to send all traffic back to NGINX first.
  • Move DNS back. During the soak period, click Move DNS back to NGINX. Envoy keeps running, so you can move DNS to it again later.
  • Blockers stay on the list. The DNS step checks again when you click it. Fix the Ingress named in the list, then try again.
  • Routes still in step after Finish. The panel shows which Ingress objects the migration still keeps in step. Click Re-sync routes.
  • Gateway needs reinstalling. On a finished cluster, Reinstall the gateway re-runs the Gateway install and route checks. It does not bring NGINX back.

Frequently asked questions

Migrate ingress-nginx: FAQ

Will this cause downtime?

The panel is built so NGINX keeps serving until you finish. Traffic moves in shares, DNS moves with a soak period, and you can move DNS back during the soak. SeaGit does not publish a downtime figure for this migration, so run it on a test cluster first.

Can I run the migration on a cluster that is not on AWS?

No. The Ingress tab appears only for clusters on Amazon EKS in your own AWS account. Other providers do not show it.

How long does it take?

There is no fixed time. Each step shows a running state and an elapsed timer. The soak period is the wait you choose before finishing: 15 minutes, 1 hour, 6 hours or 24 hours.

Do I have to change my app?

The migration converts the Ingress objects your apps already have into Gateway API routes. Apps that talk TLS to their backend stay on NGINX until the DNS step. Check the blockers list before you start.

Can I go back after I finish?

Not from the panel. Finish removes NGINX and its load balancer, and the confirmation says this cannot be undone from there. Make sure your apps are healthy on Envoy during the soak period first.

What does the soak period protect?

Computers that still hold the old DNS answer keep reaching NGINX until their cached answer expires. Keeping NGINX up for the soak period means those clients keep working.

Next steps

Want the same steps as API calls, for scripts or automation? The API guide lists the actions the panel uses and how to call them.

Sources

Checked 10 October 2026.

  1. Ingress NGINX Retirement: What You Need to Know (Kubernetes blog, 11 November 2025) — why ingress-nginx is retired and what the March 2026 cutoff means
  2. A Welcome Guide for Ingress-NGINX Users (Gateway API documentation) — which role owns the Gateway and which owns the HTTPRoute
  3. Envoy Gateway release compatibility matrix (gateway.envoyproxy.io) — the Kubernetes and Gateway API versions the Envoy Gateway release supports
  4. kubernetes/ingress-nginx (GitHub repository) — archived and read-only since 24 March 2026

Read next