<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Random_Round</title>
    <description>The latest articles on Forem by Random_Round (@random_round).</description>
    <link>https://forem.com/random_round</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3630945%2F163be4ca-8746-4f65-bb41-9b8fc7a4c2a4.png</url>
      <title>Forem: Random_Round</title>
      <link>https://forem.com/random_round</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/random_round"/>
    <language>en</language>
    <item>
      <title>Ingress-nginx EOL is 4 Months Away: Audit Your Ingresses NOW</title>
      <dc:creator>Random_Round</dc:creator>
      <pubDate>Thu, 27 Nov 2025 07:38:21 +0000</pubDate>
      <link>https://forem.com/random_round/ingress-nginx-eol-is-4-months-away-audit-your-ingresses-now-4od3</link>
      <guid>https://forem.com/random_round/ingress-nginx-eol-is-4-months-away-audit-your-ingresses-now-4od3</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Last week, Kubernetes announced ingress-nginx retirement by March 2026. We built IMK to audit your clusters for nginx usage and surface migration blockers before you're in panic mode. Open-source, MIT licensed, no magic—just visibility.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem (That's Real)
&lt;/h2&gt;

&lt;p&gt;Last week, the Kubernetes SIG Network announced: &lt;strong&gt;ingress-nginx is end-of-life March 2026.&lt;/strong&gt; Best-effort maintenance ends. No more security patches. No more features.&lt;/p&gt;

&lt;p&gt;Some of our infrastructure runs on it. 7 clusters. 200+ Ingress resources. Some configured years ago. Some with annotations nobody remembers why they exist.&lt;/p&gt;

&lt;p&gt;What followed was brutal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Manual audits under pressure&lt;/strong&gt;: Grep through 100+ YAML files. SSH into each cluster. Cross-reference Helm values. Realize you missed namespaces. Do it again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The annotation nightmare&lt;/strong&gt;: &lt;code&gt;nginx.ingress.kubernetes.io/rewrite-target&lt;/code&gt;—what's the Gateway API equivalent? Maybe a filter. Maybe a policy. Maybe it's unsupported and requires a custom controller.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blank HTTPRoute panic&lt;/strong&gt;: You open the Gateway API spec. It's elegant. It's minimal. How do your 50 nginx-specific settings translate?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The deadline crunch&lt;/strong&gt;: "We have 4 months." Four months is NOT a lot when you have 200+ ingresses, multiple teams, and no clear path forward.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We realized: &lt;strong&gt;time is the real problem.&lt;/strong&gt; You need visibility &lt;em&gt;fast&lt;/em&gt;, not perfect planning.&lt;/p&gt;

&lt;p&gt;So we built IMK.&lt;/p&gt;




&lt;h2&gt;
  
  
  What IMK Does
&lt;/h2&gt;

&lt;p&gt;IMK is an &lt;strong&gt;audit and planning tool for Gateway API migrations.&lt;/strong&gt; It does three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Audits fast&lt;/strong&gt; — Scans manifests or live clusters (multi-context, parallel)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Surfaces blockers&lt;/strong&gt; — Flags nginx-specific annotations and scores migration difficulty&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generates templates&lt;/strong&gt; — Creates Gateway API starter YAML so you don't start from blank&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What it does NOT do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rewrite your Lua scripts (you do that)&lt;/li&gt;
&lt;li&gt;Deploy for you (you test, validate, cutover)&lt;/li&gt;
&lt;li&gt;Solve your auth schemes (IMK flags them; you architect the solution)&lt;/li&gt;
&lt;li&gt;Handle canary/affinity (use Flagger, Cilium, or manual setup)&lt;/li&gt;
&lt;li&gt;Tell you if features work with Traefik/Kong/other controllers (Gateway API-specific)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;That's the point:&lt;/strong&gt; The tool gives you the map. You navigate.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works (Real Scenario)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Audit Your Clusters
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;imk scan &lt;span class="nt"&gt;--all-contexts&lt;/span&gt; &lt;span class="nt"&gt;--all-namespaces&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--plan-output&lt;/span&gt; imk-plan.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--scan-images&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--image-filter&lt;/span&gt; nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runs in parallel. Hits all your clusters. Finds every Ingress. Flags nginx usage. Spots nginx containers in Deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you see:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAMESPACE/NAME                        HOSTS               NGINX           DIFFICULTY
default/api-ingress                   api.example.com     class=nginx     LOW
prod/legacy-payments                  *.pay.example       annotations:5   HIGH
infrastructure/logging                logs.internal       none            LOW
prod/admin-dashboard                  admin.internal      class=nginx     MEDIUM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Translation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;api-ingress&lt;/code&gt; → Pure nginx, basic config → Easy migration (do first)&lt;/li&gt;
&lt;li&gt;🔴 &lt;code&gt;legacy-payments&lt;/code&gt; → 5 nginx annotations, unknown complexity → Will hurt (plan for it)&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;logging&lt;/code&gt; → Doesn't use nginx → Skip it&lt;/li&gt;
&lt;li&gt;⚠️ &lt;code&gt;admin-dashboard&lt;/code&gt; → nginx + some annotations → Medium effort&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Now you have a roadmap.&lt;/strong&gt; You know your 4-month timeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Understand What Won't Auto-Migrate
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;imk plan &lt;span class="nt"&gt;--path&lt;/span&gt; ./manifests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output shows per-ingress difficulty + blockers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INGRESS: prod/legacy-payments
Difficulty: HIGH
Blockers:
  ✗ nginx.ingress.kubernetes.io/lua-resty-waf → UNSUPPORTED
    (Requires custom controller or manual port)
  ⚠ nginx.ingress.kubernetes.io/auth-url → PARTIAL
    (Needs Gateway API + auth policy controller)
  ✓ nginx.ingress.kubernetes.io/rewrite-target → MAPPED
  ✓ nginx.ingress.kubernetes.io/ssl-redirect → MAPPED

Feature counts: mapped=2, partial=1, unsupported=1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This is the conversation you have with your team on day 1. Not day 100.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Get a Starting Point (Don't Start Blank)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;imk plan &lt;span class="nt"&gt;--path&lt;/span&gt; ./manifests &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--gateway-dir&lt;/span&gt; ./out &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--gateway-name&lt;/span&gt; my-gateway &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--gateway-namespace&lt;/span&gt; default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;./out/gateway.yaml&lt;/code&gt; — Your Gateway resource&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./out/&amp;lt;namespace&amp;gt;-&amp;lt;name&amp;gt;-httproute.yaml&lt;/code&gt; — One HTTPRoute per ingress&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;imk-plan.json&lt;/code&gt; — Detailed migration plan with blockers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sample generated Gateway:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gateway.networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Gateway&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-gateway&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;gatewayClassName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;standard&lt;/span&gt;
  &lt;span class="na"&gt;listeners&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http&lt;/span&gt;
    &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;HTTP&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https&lt;/span&gt;
    &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;HTTPS&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;443&lt;/span&gt;
    &lt;span class="na"&gt;tls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Terminate&lt;/span&gt;
      &lt;span class="na"&gt;certificateRefs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api-cert&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;legacy-payments-cert&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Sample HTTPRoute (with rewrite):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gateway.networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;HTTPRoute&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;legacy-payments-httproute&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prod&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;parentRefs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-gateway&lt;/span&gt;
    &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
  &lt;span class="na"&gt;hostnames&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pay.example.com&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;matches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PathPrefix&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/api&lt;/span&gt;
    &lt;span class="na"&gt;filters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;URLRewrite&lt;/span&gt;
      &lt;span class="na"&gt;urlRewrite&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ReplaceFullPath&lt;/span&gt;
          &lt;span class="na"&gt;replaceFullPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/v2/api&lt;/span&gt;
    &lt;span class="na"&gt;backendRefs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;payments-service&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You still need to tune auth policy, TLS details, maybe adjust paths. But you're not staring at the HTTPRoute spec wondering what goes where.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Actually Supported
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Annotations IMK Maps to Gateway API
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Fully mapped (will work):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;rewrite-target&lt;/code&gt;, &lt;code&gt;use-regex&lt;/code&gt; → HTTPRoute rewrite filter&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;permanent-redirect&lt;/code&gt; → HTTPRoute redirect filter&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ssl-redirect&lt;/code&gt;, &lt;code&gt;force-ssl-redirect&lt;/code&gt; → HTTPS listener&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Partially mapped (needs extra work):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;auth-url&lt;/code&gt; → Requires auth policy controller (Envoy, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;enable-cors&lt;/code&gt;, &lt;code&gt;cors-*&lt;/code&gt; → Needs policy or filter&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;proxy-body-size&lt;/code&gt;, &lt;code&gt;proxy-timeout&lt;/code&gt; → Policy/extension tuning&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;limit-rps&lt;/code&gt;, &lt;code&gt;limit-connections&lt;/code&gt; → Rate-limit policy&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;websocket-services&lt;/code&gt; → Manual HTTPRoute tuning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Not supported (manual porting required):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;lua-*&lt;/code&gt; (Lua scripts) → Custom controller or manual rewrite&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;configuration-snippet&lt;/code&gt;, &lt;code&gt;server-snippet&lt;/code&gt; → Controller-specific behavior&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;auth-*&lt;/code&gt; (auth schemes beyond basic) → Depends on your auth system&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;canary*&lt;/code&gt; (canary deployments) → Use Flagger or similar&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;affinity*&lt;/code&gt; (session affinity) → Manual setup&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;server-alias&lt;/code&gt;, &lt;code&gt;grpc-backend&lt;/code&gt; → Requires custom config&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See the &lt;a href="https://github.com/ubermorgenland/ingress-migration-kit/blob/main/README.md#nginx-annotation-coverage-plan" rel="noopener noreferrer"&gt;full annotation coverage list&lt;/a&gt; in the README.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Honest Limitations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What IMK IS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ An audit tool (shows what you have)&lt;/li&gt;
&lt;li&gt;✅ A planning tool (scores difficulty, surfaces blockers)&lt;/li&gt;
&lt;li&gt;✅ A template generator (Gateway API starter YAML)&lt;/li&gt;
&lt;li&gt;✅ A decision-making aid ("which ingresses should I tackle first?")&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What IMK IS NOT
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;❌ A silver bullet (some features require manual work)&lt;/li&gt;
&lt;li&gt;❌ Controller-agnostic (Gateway API-focused; doesn't know Traefik/Kong/Cilium support)&lt;/li&gt;
&lt;li&gt;❌ An auto-converter (generates templates, not production-ready YAML)&lt;/li&gt;
&lt;li&gt;❌ A deployment tool (you handle testing, validation, cutover)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  If You're Picking Another Controller
&lt;/h3&gt;

&lt;p&gt;If you decide to migrate to Traefik, Kong, or Cilium instead of Gateway API, IMK still helps with the audit ("which ingresses use nginx-specific features?"). But you'd need to check that controller's docs separately for annotation support. IMK is Gateway API-specific.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started (Right Now)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/ubermorgenland/ingress-migration-kit@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or grab a binary from &lt;a href="https://github.com/ubermorgenland/ingress-migration-kit/releases" rel="noopener noreferrer"&gt;releases&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  First scan (manifests)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;imk scan &lt;span class="nt"&gt;--path&lt;/span&gt; ./manifests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output: &lt;code&gt;imk-inventory.json&lt;/code&gt; + summary table to stdout.&lt;/p&gt;

&lt;h3&gt;
  
  
  First scan (live cluster)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;imk scan &lt;span class="nt"&gt;--context&lt;/span&gt; my-cluster &lt;span class="nt"&gt;--all-namespaces&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uses your kubeconfig. Finds all Ingresses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generate a migration plan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;imk plan &lt;span class="nt"&gt;--path&lt;/span&gt; ./manifests &lt;span class="nt"&gt;--gateway-dir&lt;/span&gt; ./out
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See: difficulty scores + generated Gateway/HTTPRoute YAML + &lt;code&gt;imk-plan.json&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why We Open-Sourced This
&lt;/h2&gt;

&lt;p&gt;Because March 2026 is coming for &lt;em&gt;everyone&lt;/em&gt; running ingress-nginx. And migrations shouldn't be opaque or panic-driven.&lt;/p&gt;

&lt;p&gt;IMK gives you &lt;strong&gt;visibility first.&lt;/strong&gt; Then you decide: Gateway API, another controller, or hybrid approach. But at least you'll know what you're deciding about.&lt;/p&gt;




&lt;h2&gt;
  
  
  Feedback Welcome
&lt;/h2&gt;

&lt;p&gt;We built this for &lt;em&gt;our&lt;/em&gt; migration. If you're doing the same, try it. If it breaks, file an issue. If it's missing something, tell us.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/ubermorgenland/ingress-migration-kit" rel="noopener noreferrer"&gt;ubermorgenland/ingress-migration-kit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Issues/discussions: Go for it&lt;/li&gt;
&lt;li&gt;Contributions: PRs welcome (see CONTRIBUTING.md)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What nginx annotations are &lt;em&gt;you&lt;/em&gt; most worried about migrating? We can prioritize.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;You have &lt;strong&gt;4 months&lt;/strong&gt; until ingress-nginx stops getting patched. That's enough time if you start today with a clear plan.&lt;/p&gt;

&lt;p&gt;IMK gives you that clarity in 10 minutes.&lt;/p&gt;

&lt;p&gt;Run it. See your ingresses. Know your effort. Plan your migration.&lt;/p&gt;

&lt;p&gt;Don't wait until February.&lt;/p&gt;




</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>ingress</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
