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 # Tipo NodePort para clúster bare-metallocal (por defecto LoadBalancer)
Mediante kubectl
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0/deploy/static/provider/cloud/deploy.yaml
👉 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