Servicios e Ingress: Exposición de aplicaciones

Clase 7 de 24Curso de Kubernetes

Resumen

La capacidad de exponer aplicaciones al mundo exterior es fundamental en los entornos de Kubernetes. Entre las diversas opciones disponibles, el Ingress destaca por ofrecer una capa adicional de personalización que va más allá de los servicios tradicionales. Comprender las diferencias entre estos mecanismos de exposición permite a los desarrolladores y administradores de sistemas elegir la solución más adecuada para cada escenario.

¿Qué opciones tenemos para exponer servicios en Kubernetes?

Antes de profundizar en el Ingress, es importante revisar los diferentes tipos de servicios que Kubernetes ofrece para exponer aplicaciones:

  • NodePort: Expone un puerto específico en cada uno de los nodos del clúster de Kubernetes. Esto permite aceptar tráfico desde Internet o desde el interior del clúster hacia un grupo de pods, simplemente especificando la dirección IP y el puerto configurado.

  • ClusterIP: Asigna a cada servicio una IP dentro del rango del cluster CIDR. Este tipo facilita la comunicación entre diferentes pods del mismo namespace, de diferentes namespaces o incluso de diferentes hosts, lo cual es esencial para aplicaciones expuestas al mundo real o microservicios que necesitan comunicarse internamente.

  • LoadBalancer: Cuando trabajamos con un clúster de Kubernetes en AWS, este tipo de servicio es gestionado automáticamente por la capa de red de AWS.

  • ExternalName: Similar a los registros CNAME en DNS, actúa como un wrapper de una dirección bien construida (como una dirección de base de datos en AWS). Estos servicios permiten agregar capacidades de caché y resolución de nombres que optimizan el tráfico desde el interior del clúster hacia servicios externos.

¿Qué es el Ingress y cómo se diferencia de los otros servicios?

El Ingress va más allá de los servicios mencionados anteriormente y proporciona capacidades avanzadas para exponer aplicaciones:

  • Permite realizar balanceo de carga
  • Ofrece validación de terminación SSL
  • Facilita la gestión de hosting virtual mediante paths y subpaths en los hosts registrados

Un caso de uso típico sería un cliente que desea acceder a una aplicación llamada "myapp.com". Con Ingress, podemos configurar diferentes rutas:

  • api.myapp.com/login que dirige al usuario a servicios de backend
  • myapp.com/dashboard que conduce a servicios frontend con interfaces de usuario

Esta separación lógica mediante nombres de dominio y paths hace que las aplicaciones sean mucho más accesibles para los usuarios finales.

¿Cómo implementar un Ingress Controller en un clúster local?

En Kubernetes, el Ingress es altamente personalizable y existen diferentes tipos de Ingress Controllers como Nginx, Traefik y HAProxy. En un entorno de desarrollo local con Minikube, podemos implementarlo de la siguiente manera:

  1. Primero habilitamos el addon de Ingress en Minikube:
minikube addons enable ingress
  1. Verificamos que el Ingress Controller esté funcionando:
kubectl get pods -n ingress-nginx
  1. Desplegamos una aplicación de ejemplo:
kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0
  1. Exponemos la aplicación como un servicio NodePort:
kubectl expose deployment web --type=NodePort --port=8080
  1. Verificamos que el servicio esté creado correctamente:
kubectl get service
  1. Para acceder a la aplicación a través de NodePort en Minikube:
minikube service web --url

¿Cómo configurar un Ingress para nuestra aplicación?

Para crear un Ingress que apunte a nuestro servicio, necesitamos definir un recurso Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: helloworld.example
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web
            port:
              number: 8080

Después de aplicar esta configuración con kubectl apply -f ingress.yaml, podemos verificar el estado del Ingress:

kubectl get ingress
kubectl describe ingress example-ingress

Para que el Ingress funcione correctamente en un entorno local, debemos configurar la resolución DNS editando el archivo hosts del sistema (/etc/hosts en macOS y Linux). Agregamos una entrada que apunte a nuestra IP local:

127.0.0.1 helloworld.example

Finalmente, habilitamos el túnel de Minikube para exponer el Ingress:

minikube tunnel

Ahora podemos acceder a nuestra aplicación utilizando el dominio configurado: http://helloworld.example

¿Qué ventajas ofrece el Ingress en entornos de producción?

En ambientes de producción, el Ingress ofrece ventajas significativas:

  • Gestión centralizada de rutas: Permite administrar múltiples servicios desde un único punto de entrada.
  • Terminación TLS/SSL: Facilita la configuración de certificados SSL sin necesidad de configurarlos en cada servicio.
  • Enrutamiento basado en contenido: Posibilidad de enrutar tráfico basado en hosts, paths o incluso headers.
  • Integración con proveedores cloud: Los principales proveedores cloud ofrecen implementaciones optimizadas de Ingress Controllers.

El Ingress representa una capa de abstracción poderosa que simplifica la gestión del tráfico entrante en clústeres de Kubernetes, proporcionando una experiencia más amigable tanto para los desarrolladores como para los usuarios finales. Su flexibilidad permite adaptarlo a diversos escenarios, desde entornos de desarrollo local hasta complejas infraestructuras en la nube.

Te invito a experimentar creando tu propio deployment con un nombre diferente y configurando un Ingress personalizado para él. ¡Comparte tus resultados y aprendizajes en la sección de comentarios!