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
Web por defecto
EjemploKubernetes deno cómoproporciona desplegarautomáticamente una página web “por defecto”defecto usandopara ingress-nginx. Sin embargo, podemos usar un Deployment,simple Deployment y Service ede IngressNginx enpara unservir clústercontenido Kubernetes con el controlador ingress-nginx.estático.
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-web-page
namespace: ingress-nginx
data:
index.html: |
<!DOCTYPE html>
<html>
<head>
<title>Pagina por defecto</title>
</head>
<body>
<h1>Bienvenido a Ingress-NGINX</h1>
<p>Esta es la pagina web por defecto.</p>
</body>
</html>
2. Crear unel Deployment
Este Deployment utiliza la imagen de NGINX yNGINX, monta el ConfigMap en el directorio de contenido web:web, crea el servicio y configura Ingress para mostrar "default-web"
apiVersion: apps/v1
kind: Deployment
metadata:
name: default-web
namespace: ingress-nginx
spec:
replicas: 1
selector:
matchLabels:
app: default-web
template:
metadata:
labels:
app: default-web
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
configMap:
name: default-web-page
3.---
Crear un Service
Este Service expondrá el Deployment para que el Ingress pueda enrutar el tráfico HTTP:
apiVersion: v1
kind: Service
metadata:
name: default-web
namespace: ingress-nginx
spec:
selector:
app: default-web
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: default-web-ingress
namespace: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: default.dominio.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: default-web
port:
number: 80
4. Configurar el controlador Ingress-NGINX para usar el nuevo backend por defecto
Para que el controlador Ingress-NGINX utilice este nuevo servicio como backend por defecto, debes modificar su Deployment y establecer el valor del flag --default-backend-service apuntando al servicio que acabas de crear. DEV Community
Si el controlador Ingress-NGINX fue desplegado usando Helm, puedes actualizar el valor controller.defaultBackend.service para que apunte al servicio default-web en el namespace ingress-nginx.
5. Despliegue y verificación
Aplicar los manifiestos: Guarda cada uno de los bloques anteriores en archivos YAML (puedes unirlos en uno solo) y aplícalos con:
kubectl apply -f default-web-ingress.yaml