Capítulo 8.2 - Ingress Controller
Objetivos de Aprendizaje
Al final de este capítulo, usted será capaz de:
- Comprender qué es un Ingress Controller
- Instalar NGINX Ingress Controller
- Configurar un Ingress Controller
- Comprender los diferentes tipos de controladores
- Gestionar anotaciones y configuraciones avanzadas
- Solucionar problemas de un Ingress Controller
Introducción
Un Ingress Controller es un Pod que supervisa los recursos Ingress y configura un load balancer para implementar las reglas de enrutamiento. Sin un Ingress Controller, los recursos Ingress no funcionan.
¿Qué es un Ingress Controller?
Un Ingress Controller es un reverse proxy que:
- Supervisa los recursos Ingress en el clúster
- Configura un load balancer según las reglas Ingress
- Gestiona el enrutamiento HTTP/HTTPS
- Termina TLS/SSL
- Proporciona balanceo de carga
Importante: Un Ingress Controller debe instalarse por separado. Kubernetes no proporciona un controlador por defecto.
Tipos de Ingress Controllers
1. NGINX Ingress Controller
El más popular
Ventajas:
- Muy alto rendimiento
- Muchas funcionalidades
- Bien documentado
- Soporte activo
Instalación:
# Kubernetes oficial
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
# Verificar la instalación
kubectl get pods -n ingress-nginx
2. Traefik
Sencillo y moderno
Ventajas:
- Auto-configuración
- Dashboard integrado
- Configuración simple
- Soporte Let's Encrypt integrado
Instalación:
# Helm
helm repo add traefik https://traefik.github.io/charts
helm install traefik traefik/traefik
3. HAProxy Ingress
Muy alto rendimiento
Ventajas:
- Rendimiento excepcional
- Configuración avanzada
- Soporte TCP/UDP
4. Istio Gateway
Para service mesh
Ventajas:
- Integración con Istio
- Funcionalidades avanzadas
- Service mesh completo
Instalación de NGINX Ingress Controller
Método 1: Manifest Kubernetes
# Instalación estándar
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
# Agregar el repositorio
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
Verificación
# Ver los Pods
kubectl get pods -n ingress-nginx
# Ver el Service
kubectl get svc -n ingress-nginx
# Ver la IP externa
kubectl get svc ingress-nginx-controller -n ingress-nginx
Configuración Básica
IngressClass
Definir qué clase 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
Anotaciones NGINX
Las anotaciones permiten configurar NGINX de manera avanzada:
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: "*"
Autenticación
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"
Configuración Avanzada
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 la Configuración
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
Ejemplo Completo
Paso 1: Service
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
ports:
- port: 80
targetPort: 8080
Paso 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 Útiles
Verificación
# Ver los Pods del Controller
kubectl get pods -n ingress-nginx
# Logs del Controller
kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller
# Ver los Services
kubectl get svc -n ingress-nginx
# Ver los Ingress
kubectl get ingress
kubectl describe ingress web-ingress
Solución de Problemas
# Verificar la configuración de NGINX
kubectl exec -n ingress-nginx <controller-pod> -- cat /etc/nginx/nginx.conf
# Probar la conectividad
curl -H "Host: example.com" http://<ingress-ip>/
# Ver los eventos
kubectl get events -n ingress-nginx
Buenas Prácticas
1. Namespace Dedicado
Instalar el Ingress Controller en un namespace dedicado (ingress-nginx).
2. Recursos
Definir límites de recursos para el Controller.
3. Alta Disponibilidad
Desplegar varios réplicas del Controller para alta disponibilidad.
4. Monitoreo
Supervisar las métricas del Controller (solicitudes, latencia, errores).
5. Seguridad
- Utilizar TLS en todo momento
- Configurar límites de tasa
- Activar autenticación si es necesario
Resumen
En este capítulo, usted ha aprendido:
Ingress Controller: Pod que implementa las reglas Ingress
Tipos: NGINX (popular), Traefik (sencillo), HAProxy (alto rendimiento), Istio (service mesh)
Instalación: Manifest Kubernetes o Helm
Configuración: IngressClass, anotaciones, ConfigMap
Anotaciones: Rewrite, SSL redirect, rate limiting, CORS, auth
Solución de problemas: Logs, configuración NGINX, eventos
Buenas prácticas: Namespace dedicado, HA, monitoreo, seguridad
Próximos Pasos
Capítulo 8.3: Enrutamiento y TLS
Lab 8.1: Despliegue de un Ingress Controller
Capítulo creado el: Diciembre 2024