Cómo elegir el tipo de servicio de Kubernetes adecuado: ClusterIP vs NodePort vs LoadBalancer

Compara ClusterIP, NodePort y LoadBalancer para exponer aplicaciones Kubernetes con el tipo de servicio adecuado.

Elegir el Tipo de Servicio Kubernetes Correcto: ClusterIP vs NodePort vs LoadBalancer

Elegir el tipo de Servicio Kubernetes correcto determina quién puede acceder a tu aplicación y cómo llega el tráfico. Elegir el incorrecto puede resultar en una aplicación inalcanzable, sobreexpuesta o respaldada por recursos en la nube que no necesitabas.

Esta guía proporciona una comparación exhaustiva de los tres tipos fundamentales de Servicios Kubernetes: ClusterIP, NodePort y LoadBalancer. Al comprender el caso de uso, el mecanismo de implementación y las compensaciones asociadas para cada tipo, puedes tomar decisiones informadas que se alineen perfectamente con los requisitos de red de tu aplicación, asegurando que tanto la comunicación interna como la accesibilidad externa se gestionen de manera efectiva.

Entendiendo los Servicios Kubernetes

Antes de profundizar en los tipos específicos, es crucial recordar el rol de un Servicio Kubernetes. Los Pods son efímeros; sus direcciones IP cambian a medida que se crean, destruyen o reprograman. Un Servicio proporciona un punto final estable (una dirección IP fija y un nombre DNS) para un conjunto de Pods que cambian dinámicamente, permitiendo una comunicación confiable dentro del clúster.

Los Servicios se definen usando un manifiesto de objeto Service, que típicamente especifica un selector para encontrar los Pods relevantes y un type para definir cómo se expone ese Servicio.

ClusterIP: Comunicación Interna

ClusterIP es el tipo de Servicio predeterminado y más básico. Expone el Servicio en una dirección IP interna dentro del clúster. Este Servicio solo es accesible desde dentro del propio clúster.

Casos de Uso para ClusterIP

  • Servicios de Backend: Ideal para bases de datos, APIs internas, capas de caché o microservicios que solo necesitan comunicarse con otros servicios o aplicaciones frontend que se ejecutan dentro del mismo clúster Kubernetes.
  • Descubrimiento Interno: Aprovecha el DNS interno de Kubernetes para proporcionar nombres de servicio de descubrimiento estables (por ejemplo, mi-base-de-datos.namespace.svc.cluster.local).

Detalles de Implementación

Cuando se crea un servicio ClusterIP, Kubernetes le asigna una dirección IP virtual que solo es enrutable dentro de la red del clúster. El tráfico externo no puede alcanzar esta IP directamente.

Manifiesto de Ejemplo (ClusterIP):

apiVersion: v1
kind: Service
metadata:
  name: api-interna
spec:
  selector:
    app: servicio-backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP

Consejo: Si solo estás construyendo un sistema distribuido donde todos los componentes residen dentro del clúster, ClusterIP es la opción más segura y eficiente, ya que evita la exposición externa innecesaria.

NodePort: Exponiendo Servicios a Través de los Nodos del Clúster

NodePort es la forma más simple de exponer un Servicio externamente. Abre un puerto específico en cada Nodo (máquina virtual o física) del clúster y enruta el tráfico externo que llega a ese puerto hacia el Servicio.

Casos de Uso para NodePort

  • Desarrollo y Pruebas: Útil para probar rápidamente servicios accesibles externamente durante el desarrollo cuando una configuración completa de balanceador de carga en la nube es excesiva.
  • Entornos No Cloud: Esencial en instalaciones Kubernetes en servidores físicos o locales donde las integraciones nativas de balanceo de carga en la nube no están disponibles.

Detalles de Implementación

Cuando se crea un servicio NodePort, Kubernetes selecciona un puerto estático en el rango configurado (por defecto es 30000–32767) en cada nodo. El Servicio expone la aplicación mediante:

http://<IP-del-Nodo>:<PuertoNode>

Si tienes tres nodos con IPs 10.0.0.1, 10.0.0.2 y 10.0.0.3, y el NodePort es 30080, puedes acceder al servicio a través de cualquiera de esas tres IPs en el puerto 30080.

Manifiesto de Ejemplo (NodePort):

apiVersion: v1
kind: Service
metadata:
  name: app-web-de-prueba
spec:
  selector:
    app: frontend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30080 # Opcional: Especifica el puerto externo, o Kubernetes elige uno
  type: NodePort

Advertencia: Debido a que el servicio está expuesto en cada nodo, tu capa de enrutamiento externo aún debe evitar nodos no saludables. El rango predeterminado de NodePort es 30000-32767, aunque los administradores del clúster pueden configurar un rango diferente.

LoadBalancer: Exposición Externa Nativa en la Nube

LoadBalancer expone un Servicio a través de un balanceador de carga externo cuando tu clúster tiene una integración que puede aprovisionar uno. Es común en plataformas Kubernetes gestionadas en la nube. En muchas configuraciones de producción, también puedes poner un Ingress o Gateway delante de varios servicios internos en lugar de crear un balanceador de carga por aplicación.

Casos de Uso para LoadBalancer

  • Despliegues en Producción: Proporciona acceso externo robusto y de alta disponibilidad que se integra perfectamente con la infraestructura del proveedor de la nube.
  • Gestión Automática de IPs: Abstrayendo la necesidad de conocer las IPs individuales de los nodos o gestionar conflictos de puertos.

Detalles de Implementación

Cuando se crea un Servicio de tipo LoadBalancer en un entorno compatible, el controlador del administrador de la nube o el controlador del balanceador de carga aprovisiona un balanceador de carga externo y lo configura para enrutar el tráfico hacia el Servicio.

La dirección externa es asignada por el proveedor. Puede ser estable durante la vida del Servicio, pero no siempre es una IP estática reservada a menos que la configures a través de ajustes específicos del proveedor.

Manifiesto de Ejemplo (LoadBalancer):

apiVersion: v1
kind: Service
metadata:
  name: servicio-web-publico
spec:
  selector:
    app: cara-al-publico
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

Cuando se crea esto, la salida (usando kubectl get svc) mostrará una IP externa asignada:

NAME                    TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
servicio-web-publico    LoadBalancer   10.96.45.11   34.120.200.55    80:30021/TCP   1m

La aplicación ahora es accesible a través de http://34.120.200.55.

Mejor Práctica: Para HTTPS, usa el patrón que mejor soporte tu plataforma: anotaciones del balanceador de carga en la nube, un controlador Ingress o la API Gateway de Kubernetes. Mantén la configuración TLS en una capa bien controlada en lugar de distribuirla en cada Pod.

Tabla Comparativa Resumen

Característica ClusterIP NodePort LoadBalancer
Uso Principal Comunicación interna de servicios Acceso externo simple (Pruebas/Servidores físicos) Acceso externo nativo en la nube para producción
Alcance Solo dentro del clúster Cada nodo en un puerto estático (30000-32767) IP externa gestionada por el proveedor de la nube
Estabilidad de IP IP interna estable IPs de nodo estables, pero requiere conocer el puerto
Dependencia de la Nube Ninguna Ninguna Requiere una integración de balanceador de carga
Costo Sin balanceador de carga externo Usa recursos del nodo Generalmente se factura como recursos de balanceador de carga externo
Complejidad de Configuración Más baja Baja Moderada (Requiere configuración en la nube)

Conclusión

Seleccionar el tipo de Servicio correcto es un paso fundamental en la red de Kubernetes:

  1. Comienza Interno (ClusterIP): Si tu servicio nunca necesita ser accedido desde fuera del clúster, usa siempre ClusterIP. Esto minimiza la superficie de ataque y la sobrecarga.
  2. Pruebas/Servidores Físicos (NodePort): Si necesitas pruebas externas básicas o estás ejecutando Kubernetes fuera de un entorno de nube importante, NodePort proporciona acceso externo inmediato, aunque menos robusto.
  3. Producción en la Nube (LoadBalancer): Para cualquier aplicación de producción alojada en AWS, GCP o Azure que requiera un punto de entrada externo duradero, estable y dedicado, LoadBalancer es la opción correcta, aprovechando la infraestructura de la nube para la resiliencia.

Al alinear el tipo de Servicio con la accesibilidad requerida y el entorno de despliegue, aseguras un rendimiento, seguridad e integración óptimos dentro de tu arquitectura de orquestación de contenedores.