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 #\
  Tipo--set NodePortcontroller.service.nodePorts.http=30080 para\
  clúster--set localcontroller.service.nodePorts.https=30443 (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:

<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