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.
-
ejemplo manifiesto
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mi-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: miapp.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: miapp-service
port:
number: 80
apiVersion: v1
kind: Pod
metadata:
name: test-pd1
labels:
app: test-nginx
spec:
containers:
- image: nginx
name: test-container1
---
apiVersion: v1
kind: Pod
metadata:
name: test-pd2
labels:
app: test-apache
spec:
containers:
- image: httpd
name: test-container2
---
apiVersion: v1
kind: Service
metadata:
name: nginx1
spec:
type: NodePort
selector:
app: test-nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: apache1
spec:
type: NodePort
selector:
app: test-apache
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress1
spec:
rules:
- http:
paths:
- path: /nginx
pathType: Prefix
backend:
service:
name: nginx1
port:
number: 80
- path: /apache
pathType: Prefix
backend:
service:
name: apache1
port:
number: 80
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://app.mi-cluster.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
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
Kubectlkubectl 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 o usa un MetalLB:
kubectl edit svc ingress-nginx-controller -n ingress-nginx
Cambia type: LoadBalancer por type: NodePort y guarda.
4️⃣ Crear tu primer Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ejemplo-ingress
namespace: default
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: app.mi-red.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: miapp-service
port:
number: 80
🚩 No olvides crear tu Service miapp-service previamente.
5️⃣ Configura tu DNS o /etc/hosts
Si es un entorno local puedes añadir en tu PC:
🧩 ¿Qué hicimos aquí?
-
Instalamos el Ingress Controller NGINX.
-
Exponemos servicios internos mediante un Ingress.
-
Ahora puedes acceder desde fuera vía HTTP.