Saltar al contenido principal

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