NGINX Ingress Controller Morreu? Conheça o NGINX Gateway Fabric

Se você trabalha com Kubernetes, provavelmente já usou ou pelo menos ouviu falar do NGINX Ingress Controller. Por muito tempo, ele foi a escolha padrão para expor aplicações ao mundo externo. Mas recentemente, a F5 (dona do NGINX) anunciou a descontinuação do projeto.

Calma, não entre em pânico! O NGINX não morreu — ele evoluiu. E neste post vou te mostrar o que é o NGINX Gateway Fabric, como funciona a Gateway API, e por que essa mudança é na verdade uma grande evolução para quem trabalha com Kubernetes.

O Que Aconteceu com o NGINX Ingress Controller?

O NGINX Ingress Controller foi descontinuado em favor de uma nova implementação: o NGINX Gateway Fabric. Mas por que essa mudança?

O Problema do Ingress Tradicional

O modelo de Ingress do Kubernetes, embora funcional, sempre teve algumas limitações:

  1. Tudo em um único recurso — O Ingress mistura configurações de infraestrutura com configurações de aplicação
  2. Annotation Hell — Funcionalidades avançadas como SSL redirect, timeouts, rate limiting dependiam de annotations específicas de cada controller
  3. Não é portável — Um Ingress configurado para NGINX não funciona igual no Traefik ou HAProxy
  4. Difícil separação de responsabilidades — Quem configura o Ingress? O time de infra ou o dev?

Veja um exemplo clássico de Ingress que ilustra esses problemas:

YAML
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: meu-ingress-confuso
  annotations:
    # --- ISTO É INFRAESTRUTURA (Annotation Hell) ---
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "120"
    aws-load-balancer-backend-protocol: "http"
    aws-load-balancer-ssl-ports: "443"
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    # -----------------------------------------------
spec:
  rules:
  # --- ISTO É RESPONSABILIDADE DO DESENVOLVEDOR ---
  - host: minhabloja.com
    http:
      paths:
      - path: /api/v1/pagamentos
        pathType: Prefix
        backend:
          service:
            name: servico-pagamentos
            port:
              number: 8080
  # ------------------------------------------------
Clique para expandir e ver mais

Percebe o problema? Configurações de infraestrutura e de aplicação estão misturadas no mesmo arquivo. Quem deveria gerenciar esse YAML? O SRE que entende de SSL e timeouts, ou o desenvolvedor que conhece sua aplicação?

A Solução: Gateway API

A Gateway API é a evolução natural do Ingress. É uma especificação oficial do Kubernetes (sig-network) que resolve esses problemas através de uma separação clara de responsabilidades.

Comparação entre Ingress e Gateway API

A Arquitetura da Gateway API

A Gateway API divide as configurações em três camadas:

RecursoResponsávelO que configura
GatewayClassProvedor (NGINX, Traefik, etc)Implementação do controller
GatewayTime de Infraestrutura/PlatformListeners, portas, TLS, IP
HTTPRouteTime de DesenvolvimentoRotas, hosts, paths, backends

Essa separação permite que:

Instalando o NGINX Gateway Fabric

Antes de começarmos com os exemplos práticos, precisamos instalar o NGINX Gateway Fabric no cluster. A instalação é feita em duas etapas:

1. Instalando os CRDs da Gateway API

Primeiro, precisamos ensinar ao Kubernetes o que é um Gateway, HTTPRoute, e os outros recursos da Gateway API. Fazemos isso instalando os CRDs (Custom Resource Definitions):

BASH
kubectl kustomize "https://github.com/nginx/nginx-gateway-fabric/config/crd/gateway-api/standard?ref=v2.2.1" | kubectl apply -f -
Clique para expandir e ver mais

Esse comando baixa e aplica os CRDs diretamente do repositório oficial do NGINX Gateway Fabric. Com isso, o cluster passa a entender os novos tipos de recursos.

2. Instalando o NGINX Gateway Fabric

Agora instalamos o controller em si. Você pode fazer isso via Helm:

BASH
# Adicionar o repo
helm repo add nginx-gateway https://nginx.github.io/nginx-gateway-fabric

# Instalar
helm install ngf nginx-gateway/nginx-gateway-fabric \
  --namespace nginx-gateway \
  --create-namespace
Clique para expandir e ver mais

Ou via manifests:

BASH
kubectl apply -f https://github.com/nginxinc/nginx-gateway-fabric/releases/latest/download/nginx-gateway.yaml
Clique para expandir e ver mais

Após a instalação, verifique se o controller está rodando:

BASH
kubectl get pods -n nginx-gateway
Clique para expandir e ver mais

Agora sim, estamos prontos para criar nossos Gateways e Rotas!

Entendendo o LoadBalancer: Gateway vs Ingress

Uma diferença importante que você vai notar: quando você aplica um Gateway, ele cria automaticamente um LoadBalancer com um IP dedicado.

AspectoIngress ControllerGateway API
LoadBalancerUm só para todo o clusterUm por Gateway (pode ter vários)
IPCompartilhado entre todas as appsDedicado por Gateway
IsolamentoTodas as apps no mesmo ponto de entradaCada Gateway pode ter seu próprio IP

Na prática, nas clouds:

Isso significa que você pode ter:

Com Ingress tradicional, tudo passa pelo mesmo IP — com Gateway API, você tem flexibilidade total.

Exemplo Prático: Migrando de Ingress para Gateway API

Vamos ver na prática como fica mais simples e organizado com a Gateway API.

1. Gateway (Gerenciado pelo Time de Infra)

O Gateway define a “porta de entrada” do cluster. É aqui que o time de plataforma configura portas, protocolos, e quais namespaces podem criar rotas:

YAML
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: gateway-principal
  namespace: default
spec:
  gatewayClassName: nginx
  listeners:
  - name: http
    protocol: HTTP
    port: 80
    allowedRoutes:
      namespaces:
        from: All
Clique para expandir e ver mais

Note o allowedRoutes.namespaces.from: All — isso permite que qualquer namespace crie rotas apontando para esse Gateway. Você também pode restringir para namespaces específicos, dando controle granular sobre quem pode expor serviços.

2. HTTPRoute (Gerenciado pelo Time de Dev)

O desenvolvedor só precisa se preocupar com sua rota e seu serviço:

YAML
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: rota-cafe
  namespace: default
spec:
  parentRefs:
  - name: gateway-principal
  hostnames:
  - "cafe.homelab.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: cafe-svc
      port: 80
Clique para expandir e ver mais

É isso! Nada de annotations, nada de configurações de SSL ou timeouts. O dev apenas declara: “Quero que cafe.homelab.com aponte para meu serviço cafe-svc”.

3. Aplicação Completa

Completando o exemplo, aqui está o Deployment e Service:

YAML
# deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cafe
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cafe
  template:
    metadata:
      labels:
        app: cafe
    spec:
      containers:
      - name: nginx
        image: nginxdemos/nginx-hello:plain-text
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 512Mi
---
# service.yml
apiVersion: v1
kind: Service
metadata:
  name: cafe-svc
  namespace: default
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: cafe
Clique para expandir e ver mais

Multi-Tenancy: Múltiplas Aplicações, Um Gateway

Uma das grandes vantagens da Gateway API é o suporte nativo a multi-tenancy. Você pode ter um único Gateway servindo múltiplas aplicações de times diferentes.

Exemplo: Adicionando um Serviço de Pagamentos

Imagine que outro time quer expor a API de pagamentos no mesmo cluster:

YAML
# deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pagamentos-svc
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pagamentos-svc
  template:
    metadata:
      labels:
        app: pagamentos-svc
    spec:
      containers:
      - name: nginx
        image: nginxdemos/nginx-hello:plain-text
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 512Mi
---
# service.yml
apiVersion: v1
kind: Service
metadata:
  name: pagamentos-svc
  namespace: default
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: pagamentos-svc
Clique para expandir e ver mais

E a rota:

YAML
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: rota-api
  namespace: default
spec:
  parentRefs:
  - name: gateway-principal
  hostnames:
  - "api.homelab.com"  # Outro domínio!
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: pagamentos-svc  # Outro serviço!
      port: 80
Clique para expandir e ver mais

Pronto! Agora temos:

Cada time gerencia apenas sua própria HTTPRoute, e o time de plataforma gerencia o Gateway central. Zero conflitos, zero annotations duplicadas.

Testando as Rotas

Para testar, basta fazer requisições com o header Host correto:

BASH
# Obtendo o IP do Gateway
export IP_VIP=$(kubectl get gateway gateway-principal -o jsonpath='{.status.addresses[0].value}')

# Testando o serviço Café
curl -v -H "Host: cafe.homelab.com" http://$IP_VIP

# Testando o serviço de API/Pagamentos
curl -v -H "Host: api.homelab.com" http://$IP_VIP

# Testando um host não configurado (deve retornar 404)
curl -v -H "Host: errado.com" http://$IP_VIP
Clique para expandir e ver mais

Por que Migrar para Gateway API?

✅ Benefícios Claros

AspectoIngressGateway API
Separação de responsabilidades❌ Tudo junto✅ Gateway vs HTTPRoute
Portabilidade❌ Annotations específicas✅ API padronizada
Multi-tenancy❌ Complexo✅ Nativo
Evolução/Extensibilidade❌ Limitado✅ Novos recursos (GRPCRoute, TCPRoute, etc)
Suporte da comunidade⚠️ Estável mas estagnado✅ Ativamente desenvolvido

O NGINX Gateway Fabric

O NGINX Gateway Fabric é a implementação da F5/NGINX da Gateway API. Ele substitui o antigo Ingress Controller e traz:

Conclusão

O NGINX Ingress Controller pode ter sido descontinuado, mas o NGINX está mais vivo do que nunca com o Gateway Fabric. A migração para a Gateway API não é apenas uma atualização — é uma evolução arquitetural que traz:

Se você ainda está usando Ingress, agora é o momento perfeito para começar a planejar sua migração. A Gateway API veio para ficar, e quanto antes você adotar, mais preparado estará para o futuro do Kubernetes.


Tem dúvidas sobre a migração ou quer ver mais exemplos? Deixa nos comentários!

Advertisement

Comments

Iniciar busca

Digite palavras-chave para buscar

↑↓
ESC
⌘K Atalho