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

Web por defecto

Ejemplo de cómo desplegar una página web “por defecto” usando un Deployment, Service e Ingress en un clúster Kubernetes con el controlador ingress-nginx.

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>Página por defecto</title>
      </head>
      <body>
        <h1>Bienvenido a Ingress-NGINX</h1>
        <p>Esta es la página web por defecto.</p>
      </body>
    </html>

2. Crear un Deployment

Este Deployment utiliza la imagen de NGINX y monta el ConfigMap en el directorio de contenido 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:alpine
        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

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