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,
ClusterIPes 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:
- Comienza Interno (
ClusterIP): Si tu servicio nunca necesita ser accedido desde fuera del clúster, usa siempreClusterIP. Esto minimiza la superficie de ataque y la sobrecarga. - Pruebas/Servidores Físicos (
NodePort): Si necesitas pruebas externas básicas o estás ejecutando Kubernetes fuera de un entorno de nube importante,NodePortproporciona acceso externo inmediato, aunque menos robusto. - 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,LoadBalanceres 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.