Adiós Ingress NGINX en EKS: Guía Práctica de Migración a Kubernetes Gateway API

Adiós Ingress NGINX en EKS: Guía Práctica de Migración a Kubernetes Gateway API
Palabras clave SEO: Ingress NGINX retirement, Kubernetes Gateway API, EKS migración, AWS Load Balancer Controller, HTTPRoute, ingress2gateway
El fin de una era: Ingress NGINX se retira en marzo 2026
Si tenés Kubernetes en producción, probablemente usás Ingress NGINX. Y si es así, tenés que leer esto.
La comunidad de Kubernetes anunció el retiro oficial del controlador Ingress NGINX en marzo de 2026. Esto significa no más releases, no más bug fixes, no más parches de seguridad. El proyecto está en modo de solo mantenimiento mínimo y se considera EOL (End of Life).
No es un cambio menor. Ingress NGINX es uno de los controladores de ingress más usados del ecosistema, especialmente en Amazon EKS. Pero la buena noticia es que su sucesor — Kubernetes Gateway API — es significativamente mejor, y AWS ya tiene soporte GA a través del AWS Load Balancer Controller.
En este artículo te explico por qué Gateway API es superior, y cómo migrar paso a paso en tu clúster EKS.
¿Por qué Gateway API es mejor que Ingress?
La API de Ingress original fue diseñada para casos simples: enrutar tráfico HTTP/HTTPS. Con el tiempo, los equipos empezaron a meter toda la configuración en anotaciones, resultando en YAML como este:
# La forma vieja y dolorosa
annotations:
alb.ingress.kubernetes.io/target-group-attributes: |
deregistration_delay.timeout_seconds=30,
stickiness.enabled=true,
stickiness.type=lb_cookie
alb.ingress.kubernetes.io/healthcheck-path: /health
alb.ingress.kubernetes.io/scheme: internet-facing
Sin validación, sin IDE support, errores que explotan en runtime. Un desastre.
Gateway API resuelve esto con tres mejoras clave:
1. Modelo orientado a roles
Gateway API separa responsabilidades claramente:
| Rol | Recurso | Quién lo gestiona |
|---|---|---|
| Proveedor de infraestructura | GatewayClass |
Equipo de plataforma / AWS |
| Operador del clúster | Gateway |
DevOps / SRE |
| Desarrollador de la app | HTTPRoute |
Dev teams |
Esto hace que el acceso sea más seguro y el modelo multi-tenant más manejable.
2. CRDs tipadas con validación
En vez de anotaciones como strings, usás CRDs con schema validation:
# La forma nueva con Gateway API
apiVersion: gateway.k8s.aws/v1beta1
kind: TargetGroupConfiguration
spec:
targetGroupAttributes:
- key: deregistration_delay.timeout_seconds
value: "30"
- key: stickiness.enabled
value: "true"
Los errores se detectan en kubectl apply, no en producción.
3. Soporte para más protocolos
Ingress solo soporta HTTP/HTTPS. Gateway API soporta también:
TCPRoute— para bases de datos, gRPC, etc.TLSRoute— terminación TLS a nivel TCPUDPRoute— para casos de uso como DNS o gaming
AWS Load Balancer Controller: soporte GA para Gateway API
En marzo 2026, AWS anunció el soporte en disponibilidad general (GA) para Kubernetes Gateway API en el AWS Load Balancer Controller. Esto cubre:
- ALB (Application Load Balancer) → tráfico HTTP/HTTPS layer 7
- NLB (Network Load Balancer) → tráfico TCP/UDP layer 4
- VPC Lattice → tráfico east-west entre servicios
Es la solución nativa recomendada para EKS.
Guía de migración paso a paso
Prerrequisitos
- Clúster EKS con Kubernetes 1.29 o posterior
kubectlconfigurado- AWS Load Balancer Controller v2.13.0+
- Permisos IAM apropiados para provisionar ALBs/NLBs
Paso 1: Verificar si usás Ingress NGINX
kubectl get pods --all-namespaces \
--selector app.kubernetes.io/name=ingress-nginx
Si devuelve resultados, tenés trabajo por hacer.
Paso 2: Instalar las CRDs de Gateway API
kubectl apply -k \
"github.com/kubernetes-sigs/gateway-api/config/crd?ref=v1.1.0"
Verificá que se instalaron:
kubectl get crd | grep gateway
Deberías ver: gateways.gateway.networking.k8s.io, httproutes.gateway.networking.k8s.io, etc.
Paso 3: Crear el GatewayClass
El GatewayClass le dice a Kubernetes qué controlador va a gestionar los Gateways:
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: aws-alb
spec:
controllerName: ingress.k8s.aws/alb
kubectl apply -f gatewayclass.yaml
Paso 4: Crear el Gateway
El Gateway representa el balanceador de carga real (el ALB en AWS):
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: my-gateway
namespace: default
annotations:
alb.ingress.k8s.aws/scheme: internet-facing
alb.ingress.k8s.aws/target-type: ip
spec:
gatewayClassName: aws-alb
listeners:
- name: http
port: 80
protocol: HTTP
- name: https
port: 443
protocol: HTTPS
tls:
mode: Terminate
certificateRefs:
- kind: Secret
name: my-tls-cert
Verificá que el ALB se provisione:
kubectl get gateway my-gateway -n default
# ADDRESS debería mostrar el DNS del ALB cuando esté listo
Paso 5: Migrar los Ingress a HTTPRoutes
Antes tenías un Ingress así:
# Ingress NGINX - la forma vieja
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: app.midominio.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /web
pathType: Prefix
backend:
service:
name: web-service
port:
number: 3000
El equivalente en Gateway API:
# HTTPRoute - la forma nueva
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: my-app-route
namespace: default
spec:
parentRefs:
- name: my-gateway
hostnames:
- "app.midominio.com"
rules:
- matches:
- path:
type: PathPrefix
value: /api
backendRefs:
- name: api-service
port: 80
- matches:
- path:
type: PathPrefix
value: /web
backendRefs:
- name: web-service
port: 3000
Paso 6: Usar ingress2gateway para automatizar la conversión
Para clústeres con muchos Ingress, usá la herramienta oficial:
# Instalar ingress2gateway
go install sigs.k8s.io/ingress2gateway@latest
# Convertir todos los Ingress NGINX del namespace default
ingress2gateway print \
--providers=ingress-nginx \
--namespace=default
Revisá la salida, ajustá lo necesario y aplicá.
Paso 7: Estrategia de migración sin downtime
No apagues Ingress NGINX de golpe. La estrategia recomendada es correr ambos en paralelo:
- Desplegá el Gateway y los HTTPRoutes
- El ALB nuevo tendrá su propio DNS
- Testeá en staging apuntando al DNS nuevo
- En producción, hacé el cambio de DNS con TTL bajo (60s)
- Monitoreá por 24-48hs
- Recién entonces desinstalá Ingress NGINX
# Verificar estado de HTTPRoutes
kubectl get httproute -A
# Ver si están Accepted y Programmed
kubectl describe httproute my-app-route
Consideraciones adicionales
cert-manager
Si usás cert-manager para TLS, tiene soporte nativo para Gateway API desde v1.12. Solo actualizá tu Issuer o ClusterIssuer y usá certificateRefs en el listener del Gateway.
Anotaciones sin equivalente directo
Algunas anotaciones muy específicas de Ingress NGINX (como nginx.ingress.kubernetes.io/lua-resty-waf) no tienen equivalente en Gateway API. En esos casos, necesitás evaluar si el AWS Load Balancer Controller (con WAF nativo via AWS WAF) o Envoy Gateway cubren el caso de uso.
Traffic splitting para canary deployments
Una de las features más potentes de Gateway API que Ingress no soporta nativamente:
rules:
- backendRefs:
- name: my-app-stable
port: 80
weight: 90
- name: my-app-canary
port: 80
weight: 10
Con Ingress necesitabas anotaciones específicas de cada controlador. Con Gateway API es estándar.
Resumen
| Feature | Ingress NGINX | Gateway API (AWS LBC) |
|---|---|---|
| Estado | ⚠️ EOL marzo 2026 | ✅ GA, activamente desarrollado |
| Validación de config | ❌ Strings en anotaciones | ✅ CRDs tipadas |
| Modelo de roles | ❌ Todo mezclado | ✅ Infraestructura / Operador / Dev |
| Traffic splitting | ⚠️ Anotaciones propietarias | ✅ Nativo en HTTPRoute |
| Soporte TCP/UDP | ❌ Solo HTTP/HTTPS | ✅ TCPRoute, UDPRoute |
| Integración AWS | ⚠️ Vía anotaciones | ✅ Nativa con ALB/NLB/VPC Lattice |
La migración no es opcional, y tampoco tiene que ser traumática. Con la herramienta ingress2gateway y una estrategia de migración progresiva, podés hacerlo con zero downtime.
¿Tenés preguntas sobre la migración en tu stack específico? Dejame tu caso en los comentarios.
Tags: Kubernetes, EKS, AWS, DevOps, Gateway API, Ingress, Migración




