Capítulo 8.2 - Ingress Controller
Objetivos de Aprendizagem
Ao final deste capítulo, você será capaz de:
- Entender o que é um Ingress Controller
- Instalar o NGINX Ingress Controller
- Configurar um Ingress Controller
- Compreender os diferentes tipos de controladores
- Gerenciar anotações e configurações avançadas
- Solucionar problemas de um Ingress Controller
Introdução
Um Ingress Controller é um Pod que monitora os recursos Ingress e configura um load balancer para implementar as regras de roteamento. Sem um Ingress Controller, os recursos Ingress não funcionam.
O que é um Ingress Controller?
Um Ingress Controller é um reverse proxy que:
- Monitora os recursos Ingress no cluster
- Configura um load balancer conforme as regras Ingress
- Gerencia o roteamento HTTP/HTTPS
- Faz a terminação TLS/SSL
- Fornece load balancing
Importante: Um Ingress Controller deve ser instalado separadamente. O Kubernetes não fornece um controlador por padrão.
Tipos de Ingress Controllers
1. NGINX Ingress Controller
O mais popular
Vantagens:
- Altíssimo desempenho
- Muitas funcionalidades
- Bem documentado
- Suporte ativo
Instalação:
# Kubernetes oficial
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
# Verificar a instalação
kubectl get pods -n ingress-nginx
2. Traefik
Simples e moderno
Vantagens:
- Auto-configuração
- Dashboard integrado
- Configuração simples
- Suporte Let's Encrypt integrado
Instalação:
# Helm
helm repo add traefik https://traefik.github.io/charts
helm install traefik traefik/traefik
3. HAProxy Ingress
Altíssimo desempenho
Vantagens:
- Desempenho excepcional
- Configuração avançada
- Suporte TCP/UDP
4. Istio Gateway
Para service mesh
Vantagens:
- Integração com Istio
- Funcionalidades avançadas
- Service mesh completo
Instalação do NGINX Ingress Controller
Método 1: Manifest Kubernetes
# Instalação padrão
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml
# Verificar
kubectl get pods -n ingress-nginx
kubectl get svc -n ingress-nginx
Método 2: Helm
# Adicionar o repositório
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
# Instalar
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace
Verificação
# Ver os Pods
kubectl get pods -n ingress-nginx
# Ver o Service
kubectl get svc -n ingress-nginx
# Ver o IP externo
kubectl get svc ingress-nginx-controller -n ingress-nginx
Configuração Básica
IngressClass
Definir qual classe de Ingress utilizar:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: nginx
spec:
controller: k8s.io/ingress-nginx
Ingress Resource
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
Anotações NGINX
As anotações permitem configurar o NGINX de forma avançada:
Rewrite
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /api/(.*)
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
SSL Redirect
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
Rate Limiting
metadata:
annotations:
nginx.ingress.kubernetes.io/limit-rps: "100"
CORS
metadata:
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
Autenticação
metadata:
annotations:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
Configuração Avançada
ConfigMap para NGINX
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
namespace: ingress-nginx
data:
proxy-body-size: "50m"
ssl-protocols: "TLSv1.2 TLSv1.3"
client-max-body-size: "50m"
Aplicar a Configuração
apiVersion: apps/v1
kind: Deployment
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
template:
spec:
containers:
- name: controller
args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/nginx-config
Exemplo Completo
Etapa 1: Service
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
ports:
- port: 80
targetPort: 8080
Etapa 2: Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
tls:
- hosts:
- example.com
secretName: example-tls
Comandos Úteis
Verificação
# Ver os Pods do Controller
kubectl get pods -n ingress-nginx
# Logs do Controller
kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller
# Ver os Services
kubectl get svc -n ingress-nginx
# Ver os Ingress
kubectl get ingress
kubectl describe ingress web-ingress
Solução de Problemas
# Verificar a configuração do NGINX
kubectl exec -n ingress-nginx <controller-pod> -- cat /etc/nginx/nginx.conf
# Testar a conectividade
curl -H "Host: example.com" http://<ingress-ip>/
# Ver os eventos
kubectl get events -n ingress-nginx
Boas Práticas
1. Namespace Dedicado
Instale o Ingress Controller em um namespace dedicado (ingress-nginx).
2. Recursos
Defina limites de recursos para o Controller.
3. Alta Disponibilidade
Implemente múltiplas réplicas do Controller para alta disponibilidade.
4. Monitoramento
Monitore as métricas do Controller (requisições, latência, erros).
5. Segurança
- Utilize TLS em todos os lugares
- Configure rate limits
- Ative autenticação se necessário
Resumo
Neste capítulo, você aprendeu:
Ingress Controller: Pod que implementa as regras Ingress
Tipos: NGINX (popular), Traefik (simples), HAProxy (performático), Istio (service mesh)
Instalação: Manifest Kubernetes ou Helm
Configuração: IngressClass, anotações, ConfigMap
Anotações: Rewrite, SSL redirect, rate limiting, CORS, auth
Solução de problemas: Logs, configuração NGINX, eventos
Boas práticas: Namespace dedicado, HA, monitoramento, segurança
Próximos Passos
Capítulo 8.3: Roteamento e TLS
Lab 8.1: Deploy de um Ingress Controller
Capítulo criado em: Dezembro 2024