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.

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 /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://app.mi-cluster.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
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 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

Un ejemplo de Ingress que hace uso del controlador:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ejemplo-ingressexample
  namespace: default
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /foo

spec:
  ingressClassName: nginx
  rules:
  - host: app.mi-red.localwww.example.com
    http:
    paths:
    - path: / pathType: Prefix
      backend:
      service:
      name: miapp-serviceexampleService
      port:
        number: 80
      path: /
# This section is only required if TLS is to be enabled for the Ingress
tls:
- hosts:
  - www.example.com
  secretName: example-tls

If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:

apiVersion: v1
kind: Secret
metadata:
  name: example-tls
  namespace: foo
data:
  tls.crt: <base64 encoded cert>
  tls.key: <base64 encoded key>
type: kubernetes.io/tls

🚩 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:

<IP_DEL_INGRESS_CONTROLLER> app.mi-red.local

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

🧩 ¿Qué hicimos aquí?

  • Instalamos el Ingress Controller NGINX.

  • Exponemos servicios internos mediante un Ingress.

  • Ahora puedes acceder desde fuera vía HTTP.