Skip to main content

Ingress

image.png

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:

  1. Ingress Resource:

    • Es un manifiesto YAML donde defines las reglas de acceso (host, path, backend service).

  2. 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 /app1 va 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

  1. Despliegas un Ingress Controller (por ejemplo, NGINX) como un Pod dentro de tu clúster.

  2. Ese Pod escucha los recursos Ingress que creas.

  3. Automáticamente configura un proxy inverso y expone los servicios según las reglas de tus manifiestos.


💡 Ejemplo:
  1. Usuario accede a https://myapp.dominio.com.

  2. Llega al Ingress Controller (que tiene la IP pública o está expuesto).

  3. 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:

<IP_DEL_INGRESS_CONTROLLER> myapp.dominio.com

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-nginx-controller para usar 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