Ingress

Ingress en Kubernetes es un recurso que te permite gestionar el acceso externo a servicios del clúster a través de HTTP/HTTPS.
-
Define reglas de enrutamiento basadas en rutas (paths) y dominios (hosts).
-
Expone múltiples services de Kubernetes detrás de una misma IP pública.
-
Facilita la gestión de TLS (SSL) para HTTPS.
-
Es compatible con autenticación, reescritura de URL, balanceo de carga y más.
Componentes principales:
-
Ingress Resource:
-
Es un manifiesto YAML donde defines las reglas de acceso (host, path, backend service).
-
-
Ingress Controller:
-
Es el componente que escucha los recursos de Ingress y configura un proxy (como NGINX, HAProxy, Traefik) para aplicarlas.
-
No es parte nativa de Kubernetes; debes desplegarlo en el clúster.
-
Ingress Controller
Ingress Controller en Kubernetes es el componente que implementa las reglas definidas en un recurso Ingress y gestiona el tráfico HTTP/HTTPS desde fuera del clúster hacia los servicios internos.
-
El Ingress es solo una especificación, un manifiesto con reglas (por ejemplo: "el tráfico que llegue a
/app1va al Service A"). -
Pero el que realmente escucha esas reglas y configura un proxy HTTP es el Ingress Controller.
Sin Ingress Controller, el Ingress YAML no tendría efecto real.
Caracteristicas
-
Crea un proxy HTTP(S) que expone tus aplicaciones al exterior.
-
Gestiona:
-
Balanceo de carga de capa 7 (HTTP).
-
Redirecciones y reescrituras.
-
TLS/SSL (certificados).
-
Autenticaciones (Basic Auth, JWT, etc.).
-
Reglas por dominio y rutas.
-
Ingress Controllers populares
-
NGINX Ingress Controller (el más común).
-
Traefik.
-
HAProxy Ingress.
-
Kong Ingress Controller (API Gateway).
-
Istio Gateway (cuando usas Istio como service mesh).
Funcionamiento
-
Despliegas un Ingress Controller (por ejemplo, NGINX) como un Pod dentro de tu clúster.
-
Ese Pod escucha los recursos Ingress que creas.
-
Automáticamente configura un proxy inverso y expone los servicios según las reglas de tus manifiestos.
💡 Ejemplo:
-
Usuario accede a
https://myapp.dominio.com. -
Llega al Ingress Controller (que tiene la IP pública o está expuesto).
-
El Controller lee la regla del Ingress y redirige la petición al Service correspondiente.
Despliegue NGINX Ingress Controller
1️⃣ Instalar NGINX Ingress Controller
Mediante helm
# Añadir el repositorio de ingress-nginx a Helm
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
# Instalar
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx --create-namespace \
--set controller.service.type=NodePort \
--set controller.service.nodePorts.http=30080 \
--set controller.service.nodePorts.https=30443 \
--set controller.rbac.create=true
-
controller.service.type=NodePort: Define que el Service será de tipo NodePort, necesario en Cluster local -
controller.service.nodePorts.http=30080: Configura el puerto HTTP en el 30080. -
controller.service.nodePorts.https=30443: Configura el puerto HTTPS en el 30443.
👉 Esto instalará:
-
Deployment del NGINX Ingress Controller.
-
Service tipo LoadBalancer (o NodePort según el entorno).
-
RBAC y otros recursos necesarios.
2️⃣ Verificar que esté en ejecución
kubectl get pods -n ingress-nginx
kubectl get svc -n ingress-nginx
Verás un servicio llamado ingress-nginx-controller que será el punto de entrada de tu tráfico HTTP/HTTPS.
3️⃣ Exponerlo en entornos sin LoadBalancer
Si estás en un clúster sin proveedor de nube (bare-metal, Proxmox, etc.), cambia el tipo de Service a NodePort
kubectl edit svc ingress-nginx-controller -n ingress-nginx
Cambia type: LoadBalancer por type: NodePort y guarda.
Si instalaste con la opción: "--set controller.service.type=NodePort" no será necesario este paso
4️⃣ Manifiesto Ingress
Un ejemplo de Ingress que hace uso del controlador:
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
namespace: default
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: miapp.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-service
port:
number: 80
🚩 No olvides crear tu Service myapp-service previamente.
5️⃣ Configura tu DNS o /etc/hosts
Si es un entorno local puedes añadir en tu PC:
Desinstalar Ingress-NGINX con Helm
# Eliminar el release con Helm
helm uninstall ingress-nginx -n ingress-nginx
#(Opcional) Borrar el namespace si no lo necesitas más
kubectl delete namespace ingress-nginx
default-backend
Kubernetes no proporciona automáticamente una página por defecto para ingress-nginx. Sin embargo, podemos usar un simple Deployment y Service de Nginx para servir contenido estático de una página web para manejar las peticiones no encontradas. Se utiliza un default-backend, que es un servicio que responde con una página de error personalizada cuando no se encuentra una ruta coincidente en el controlador Ingress.
1. Crear un ConfigMap para la página web
El ConfigMap contendrá el contenido HTML de la página por defecto.
apiVersion: v1
kind: ConfigMap
metadata:
name: default-404-page
namespace: ingress-nginx
data:
index.html: |
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Página no encontrada</title>
<style>
body { font-family: Arial, sans-serif; text-align: center; margin: 50px; }
h1 { color: red; }
</style>
</head>
<body>
<h1>404 - Página no encontrada</h1>
<p>Lo sentimos, pero la página que buscas no existe.</p>
</body>
</html>
2. Crear el Deployment
Este Deployment utiliza la imagen de NGINX, monta el ConfigMap en el directorio de contenido web, crea el servicio y configura Ingress para mostrar "default-backend"
apiVersion: apps/v1
kind: Deployment
metadata:
name: default-backend
namespace: ingress-nginx
spec:
replicas: 1
selector:
matchLabels:
app: default-backend
template:
metadata:
labels:
app: default-backend
spec:
containers:
- name: nginx
image: nginx:latest
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
configMap:
name: default-404-page
---
apiVersion: v1
kind: Service
metadata:
name: default-backend
namespace: ingress-nginx
spec:
selector:
app: default-backend
ports:
- protocol: TCP
port: 80
targetPort: 80
3. Configurar Ingress-Nginxingress-nginx-controller para Usarusar el Default Backend
El controlador Ingress-Nginx puede configurarse para usar un backend por defecto modificando su Deployment.
Ejecuta el siguiente comando para editarlo en vivo:
kubectl edit deployment ingress-nginx-controller -n ingress-nginx
spec:
containers:
- name: controller
args:
- /nginx-ingress-controller
- --default-backend-service=ingress-nginx/default-backend # añade la siguiente linea