Traefik vs Nginx: Ingress Controller para Kubernetes em 2026
SCHEMA MARKUP JSON-LD | ✎ Duarte Spínola | Tags:
O Kubernetes precisa de um Ingress Controller para expor serviços HTTP/HTTPS ao mundo exterior. Em 2026, duas opções dominam: Nginx Ingress (clássico, estável, omnipresente) e Traefik Ingress (moderno, dinâmico, auto-descoberta). A escolha afecta tudo — desde a configuração de HTTPS à gestão de múltiplos namespaces. Este artigo configura ambos com certificados TLS automáticos, compara performance e custos para PME, e dá um guia de decisão por cenário (Traefik docs, Nginx Ingress docs).
Neste artigo
- Entender Ingress Controller no Kubernetes
- Pré-requisitos e Instalação
- Passo 1 — Configurar Traefik Ingress com Helm
- Passo 2 — Configurar Nginx Ingress com Helm
- Passo 3 — HTTPS Automático com cert-manager
- Passo 4 — Rate Limiting e Middlewares
- Passo 5 — Monitorização e Dashboards
- Passo 6 — Múltiplos Namespaces e IngressRoute
- Traefik vs Nginx — Comparação Prática
- Erros Comuns
- Checklist Rápido de Verificação
1. Entender Ingress Controller no Kubernetes
No Kubernetes, os pods têm IPs efémeros que mudam a cada restart. Os Services dão um IP estável dentro do cluster, mas não expõem nada ao exterior. O Ingress Controller é a camada que recebe tráfego HTTP/HTTPS de fora do cluster e encaminha para o Service correcto baseado no host e path.
Analogia: o Ingress Controller é como a recepção de um hotel. Os hóspedes (pods) mudam de quarto frequentemente, mas a recepção (Ingress) sabe sempre onde cada um está e encaminha os visitantes (tráfego) correctamente.
| Conceito | Função | Analogia |
|---|---|---|
| Pod | Container que corre a aplicação | Hóspede do hotel |
| Service | IP estável dentro do cluster | Lista de hóspedes no andar X |
| Ingress | Regra HTTP que encaminha tráfego externo | Placa na recepção: “hóspede Y → andar 3” |
| Ingress Controller | Implementa as regras Ingress | Recepcionista que executa as regras |
| cert-manager | Obtém e renova certificados TLS | Funcionário que trata das credenciais |
A diferença fundamental entre Traefik e Nginx:
| Característica | Traefik | Nginx Ingress |
|---|---|---|
| Configuração | Dinâmica (auto-descoberta) | Estática (reload ao mudar Ingress) |
| Descoberta de serviços | Label watching automático | Via Ingress resources |
| Dashboard web | Nativo, em tempo real | Requer instalação separada |
| Middlewares | Nativo (chain de filtros) | Via annotations (limitado) |
| Protocolo suportado | HTTP, TCP, UDP, gRPC | HTTP, HTTPS (TCP limitado) |
| Let’s Encrypt | Integrado (ACME nativo) | Requer cert-manager externo |
| Linguagem | Go | C (Nginx) + Lua |
| Binário | ~100 MB | ~50 MB |
2. Pré-requisitos e Instalação
| Requisito | Detalhe |
|---|---|
| Cluster Kubernetes | k3s, k8s, EKS, GKE ou AKS |
| kubectl | Configurado e a comunicar com o cluster |
| Helm 3 | Gestor de packages Kubernetes |
| IP público no LoadBalancer | Ou NodePort para clusters sem LB |
| Domínio configurado | Registo A a apontar para o IP do LoadBalancer |
Instalar Helm se não estiver presente:
Se não tiveres curl, usar wget -qO- URL | bash como alternativa.
Verificar que o cluster está acessível:
kubectl get pods -A
O output deve mostrar todos os nós em estado Ready e os pods do cluster a correr (CoreDNS, CNI, etc.).
3. Passo 1 — Configurar Traefik Ingress com Helm
O Traefik é o Ingress Controller padrão do K3s. Para clusters Kubernetes standard, instalar via Helm:
helm repo update
helm install traefik traefik/traefik \
–namespace traefik \
–create-namespace \
–set service.type=LoadBalancer \
–set ports.web.redirectTo=websecure \
–set ports.websecure.tls.enabled=true
O que cada parâmetro faz:
namespace traefik— instala o Traefik num namespace separado (boa prática)service.type=LoadBalancer— expõe o Traefik via LoadBalancer (cloud) ou MetalLB (on-premises)ports.web.redirectTo=websecure— redirecciona HTTP (porta 80) para HTTPS (porta 443) automaticamenteports.websecure.tls.enabled=true— ativa TLS na porta 443
Criar um Ingress para expor uma aplicação:
kind: Ingress
metadata:
name: grafana-ingress
namespace: monitoring
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
spec:
rules:
– host: grafana.empresa.pt
http:
paths:
– path: /
pathType: Prefix
backend:
service:
name: grafana
port:
number: 3000
Aplicar:
O Traefik detecta automaticamente o novo Ingress e começa a encaminhar tráfego — sem reload, sem restart. Isto é a vantagem principal do Traefik: configuração dinâmica (Traefik Kubernetes Ingress).
4. Passo 2 — Configurar Nginx Ingress com Helm
Para clusters que preferem Nginx (compatibilidade, comunidade, performance):
helm repo update
helm install nginx-ingress ingress-nginx/ingress-nginx \
–namespace ingress-nginx \
–create-namespace \
–set controller.service.type=LoadBalancer \
–set controller.metrics.enabled=true
O que cada parâmetro faz:
controller.service.type=LoadBalancer— expõe o Nginx via LoadBalancercontroller.metrics.enabled=true— ativa métricas Prometheus para monitorização
Criar o mesmo Ingress para Nginx (a sintaxe é standard Kubernetes):
kind: Ingress
metadata:
name: grafana-ingress
namespace: monitoring
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: “true”
spec:
tls:
– hosts:
– grafana.empresa.pt
secretName: grafana-tls
rules:
– host: grafana.empresa.pt
http:
paths:
– path: /
pathType: Prefix
backend:
service:
name: grafana
port:
number: 3000
Aplicar:
⚠️ Atenção
Ao contrário do Traefik, o Nginx faz reload (não restart) quando um Ingress é adicionado ou modificado. Em clusters com centenas de Ingress, o reload pode causar latência momentânea. O Traefik não tem este problema.
5. Passo 3 — HTTPS Automático com cert-manager
O cert-manager é o standard de facto para gestão de certificados TLS no Kubernetes. Funciona com ambos Traefik e Nginx.
Instalar cert-manager:
helm repo update
helm install cert-manager jetstack/cert-manager \
–namespace cert-manager \
–create-namespace \
–set installCRDs=true
Criar um ClusterIssuer para Let’s Encrypt:
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: [email protected]
privateKeySecretRef:
name: letsencrypt-prod
solvers:
– http01:
ingress:
class: traefik # ou nginx
O que cada campo faz:
server— endpoint ACME de produção do Let’s Encrypt (não usar o staging para certificados reais)email— email para notificações de expiraçãoprivateKeySecretRef— nome do Secret onde a chave ACME é guardadahttp01.ingress.class— qual Ingress Controller vai responder ao challenge HTTP-01
Aplicar e o cert-manager vai obter certificados automaticamente quando um Ingress referenciar este issuer via annotation cert-manager.io/cluster-issuer: letsencrypt-prod (cert-manager docs).
6. Passo 4 — Rate Limiting e Middlewares
Traefik — Rate Limiting via Middleware
kind: Middleware
metadata:
name: rate-limit
namespace: monitoring
spec:
rateLimit:
average: 100
burst: 200
Aplicar no Ingress:
annotations:
traefik.ingress.kubernetes.io/router.middlewares: monitoring-rate-limit@kubernetescrd
O que cada parâmetro faz:
average: 100— 100 pedidos por segundo em médiaburst: 200— permite rajadas de 200 pedidosrouter.middlewares— referencia o middleware pelo nome@provider
Nginx — Rate Limiting via Annotations
annotations:
nginx.ingress.kubernetes.io/limit-rps: “100”
nginx.ingress.kubernetes.io/limit-burst: “200”
nginx.ingress.kubernetes.io/limit-connections: “50”
limit-rps— pedidos por segundo por IPlimit-burst— rajada permitidalimit-connections— máximo de ligações simultâneas por IP
ℹ️ Nota: O Traefik suporta middlewares mais ricos (compressão, autenticação, headers, redirect, retry) como recursos CRD separados. O Nginx faz tudo via annotations no Ingress, que pode tornar-se difícil de gerir com muitas regras.
7. Passo 5 — Monitorização e Dashboards
Traefik Dashboard
O Traefik tem um dashboard web nativo acessível em /dashboard/:
kind: Ingress
metadata:
name: traefik-dashboard
namespace: traefik
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure
spec:
rules:
– host: traefik.empresa.pt
http:
paths:
– path: /
pathType: Prefix
backend:
service:
name: traefik-dashboard
port:
number: 9000
⚠️ Atenção
O dashboard do Traefik mostra informações sensíveis (rotas, serviços, IPs internos). Proteger com autenticação ou restringir a VPN/IPs autorizados.
Nginx Dashboard
O Nginx não tem dashboard nativo. Instalar o Grafana + Prometheus e importar o dashboard oficial (ID 9614):
Métricas Prometheus do Nginx Ingress:
8. Passo 6 — Múltiplos Namespaces e IngressRoute
O Traefik suporta IngressRoute — um CRD próprio mais expressivo que o Ingress standard:
kind: IngressRoute
metadata:
name: api-route
namespace: production
spec:
entryPoints:
– websecure
routes:
– match: Host(`api.empresa.pt`) && PathPrefix(`/v1`)
kind: Rule
services:
– name: api-v1
port: 8080
– match: Host(`api.empresa.pt`) && PathPrefix(`/v2`)
kind: Rule
services:
– name: api-v2
port: 8080
tls:
certResolver: letsencrypt
O que cada linha faz:
entryPoints: websecure— escuta apenas na porta 443 (HTTPS)match: Host(...) && PathPrefix(...)— encaminha baseado em host E path simultaneamenteservices— pode encaminhar para múltiplos serviços com load balancingtls.certResolver— usa o resolver ACME configurado no Traefik para obter certificados
O Nginx não tem equivalente ao IngressRoute — tudo via Ingress standard com annotations.
9. Traefik vs Nginx — Comparação Prática
| Critério | Traefik | Nginx Ingress | Vencedor |
|---|---|---|---|
| Facilidade de setup | Helm + auto-descoberta | Helm + annotations | Traefik |
| HTTPS auto | ACME nativo | Requer cert-manager | Traefik |
| Performance (RPS) | ~50k RPS | ~80k RPS | Nginx |
| Dashboard | Nativo, real-time | Requer Grafana | Traefik |
| Comunidade/docs | Crescente | Enorme | Nginx |
| Middlewares | CRD rico (chain) | Annotations (limitado) | Traefik |
| Configuração dinâmica | Zero reload | Reload a cada mudança | Traefik |
| TCP/UDP | Suportado | Limitado | Traefik |
| Estabilidade | Bom (projeto maduro) | Excelente (battle-tested) | Nginx |
| Para PME | Simples, rápido | Standard, robusto | Depende |
Recomendação para PME: Traefik se valorizas simplicidade e auto-descoberta. Nginx se já tens experiência com Nginx e preferes a configuração standard. Para K3s, o Traefik já vem instalado por defeito — não há motivo para mudar.
10. Erros Comuns
| Problema | Causa | Solução |
|---|---|---|
| 502 Bad Gateway | Service backend não existe ou porta errada | Verificar kubectl get svc e kubectl get endpoints |
| Certificado não obtido | Domínio não aponta para o IP do LoadBalancer | Verificar dig dominio.pt — tem de apontar para o LB externo |
| Too many redirects | SSL redirect em loop com backend que também força HTTPS | desativar SSL redirect no backend ou usar ssl-redirect: "false" |
| Traefik não encaminha | IngressRoute com match incorrecto | Verificar traefik.ingress.kubernetes.io/router.entrypoints annotation |
| Nginx reload lento | Muitos Ingress resources | Considerar Traefik (zero reload) ou dividir namespaces |
| Dashboard Traefik 404 | Path errado | O dashboard fica em /dashboard/ (com barra no fim) |
| cert-manager stuck | ClusterIssuer não aplicado ou email inválido | Verificar kubectl get clusterissuer e logs kubectl logs -n cert-manager deployment/cert-manager |
| Rate limit não funciona | Middleware não referenciado no Ingress | Verificar annotation router.middlewares com nome@provider correctos |
11. Checklist Rápido de Verificação
- [ ] Ingress Controller instalado e a correr (
kubectl get pods -n traefikouingress-nginx) - [ ] LoadBalancer com IP externo (
kubectl get svc -n traefikouingress-nginx) - [ ] Domínio a apontar para o IP do LoadBalancer (
dig dominio.pt) - [ ] HTTPS funciona no browser (cadeado verde)
- [ ] cert-manager instalado e ClusterIssuer Ready
- [ ] Rate limiting configurado em APIs expostas
- [ ] Dashboard acessível (Traefik) ou métricas Prometheus (Nginx)
- [ ] Pods backend acessíveis (
kubectl get endpoints) - [ ] Logs sem erros (
kubectl logs -n traefik deployment/traefik) - [ ] Reinício do pod — Ingress Controller volta automaticamente (Deployment replica)
Artigos Relacionados
- K3s: Kubernetes Leve para PME em Edge Computing 2026 — Cluster Kubernetes leve que traz Traefik por defeito
- Caddy 2026: Reverse Proxy Automático com HTTPS — Alternativa simples ao Ingress para PME sem Kubernetes
- Nginx Reverse Proxy 2026 — Nginx como reverse proxy fora do Kubernetes
- Grafana para PME 2026: Dashboards com Prometheus — Monitorizar o Ingress Controller com Grafana
- Zero Trust para PMEs 2026 — Segurança complementar ao Ingress
