Minikube: LoadBalancer
¡El café, la fotografía, el manga, los cómics y la tecnología son mis grandes pasiones!
Magíster en Ingeniería de Sistemas y Computación. Actualmente, instructor de la Facultad de Ingeniería de la Universidad de los Andes.
Introducción a LoadBalancer en Kubernetes
El tipo de servicio LoadBalancer representa uno de los métodos para exponer aplicaciones en Kubernetes a usuarios externos. A diferencia de otros tipos de servicios como ClusterIP (solo interno) o NodePort (limitado a puertos específicos), LoadBalancer integra su aplicación con un balanceador de carga externo, proporcionando una dirección IP dedicada y accesible desde el exterior.
Cuando trabajamos con proveedores de nube como AWS, GCP o Azure, un servicio LoadBalancer aprovisiona automáticamente un balanceador de carga en la infraestructura del proveedor. Sin embargo, en entornos locales como Minikube, necesitamos simular este servicio con el comando minikube tunnel.
¿Cómo funciona LoadBalancer?
Antes de implementar LoadBalancer, es importante entender el funcionamiento interno:
Creación del servicio: Define un servicio de tipo LoadBalancer que apunta a sus pods
Asignación de IP externa: Kubernetes asigna una IP externa (en la nube) o virtual (en Minikube)
Distribución de tráfico: El balanceador dirige el tráfico entrante a los pods disponibles
Verificación de salud: Monitorea continuamente los pods y redirige el tráfico solo a los pods saludables
Un LoadBalancer no solo distribuye el tráfico sino que también absorbe picos de carga, proporciona alta disponibilidad y simplifica la gestión de direcciones IP para sus servicios.
Prerrequisitos
Para seguir este tutorial, necesitarás:
Minikube instalado y funcionando
kubectl configurado correctamente
Privilegios de administrador (necesarios para el comando
minikube tunnel)
Implementación Paso a Paso
1. Creando un Deployment de Ejemplo
Primero, vamos a crear un deployment simple que utilizaremos para demostrar el funcionamiento del LoadBalancer:
minikube kubectl -- create deployment balanced --image=kicbase/echo-server:1.0
Este comando crea un deployment llamado "balanced" utilizando la imagen kicbase/echo-server:1.0, que es un servidor HTTP simple que responde con información sobre la solicitud recibida.
Para verificar que el deployment se ha creado correctamente:
minikube kubectl -- get deployments
Debería ver algo como:
NAME READY UP-TO-DATE AVAILABLE AGE
balanced 1/1 1 1 10s
2. Exponiendo el Deployment como LoadBalancer
Ahora, vamos a exponer el deployment como un servicio de tipo LoadBalancer:
minikube kubectl -- expose deployment balanced --type=LoadBalancer --port=8080
Este comando crea un servicio que:
Se llama "balanced" (mismo nombre que el deployment)
Es de tipo LoadBalancer
Expone el puerto 8080 del deployment
Para verificar que el servicio se ha creado:
minikube kubectl -- get services balanced
Inicialmente, observará que la columna EXTERNAL-IP muestra <pending>:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
balanced LoadBalancer 10.103.234.51 <pending> 8080:32456/TCP 15s
Esto es normal y significa que Kubernetes está esperando que se asigne una IP externa. En un proveedor de nube, esta IP se asignaría automáticamente. En Minikube, necesitamos el siguiente paso.
3. Activando el Túnel de Minikube
Minikube no puede aprovisionar balanceadores de carga real en su máquina local, pero puede simular su comportamiento mediante el comando tunnel. Este comando crea un proceso que establece un túnel de red entre tu máquina local y el clúster de Minikube.
Abra una nueva terminal (este proceso debe ejecutarse en primer plano) y ejecuta:
minikube tunnel
Obtendrá una salida similar a:
Status:
machine: minikube
pid: 12345
route: 10.96.0.0/12 -> 192.168.49.2
minikube: Running
services: [balanced]
errors:
minikube: no errors
router: no errors
loadbalancer emulator: no errors
Este comando requiere privilegios de administrador porque necesita crear rutas de red en su sistema operativo. Sí, se solicita una contraseña, suminístrela.
4. Verificando la IP Externa
Ahora, regresa a tu terminal original y vuelve a verificar el servicio:
minikube kubectl -- get services balanced
En esta ocasión, debería ver una IP externa asignada:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
balanced LoadBalancer 10.103.234.51 10.103.234.51 8080:32456/TCP 2m
La EXTERNAL-IP ya no muestra <pending> sino una dirección IP real. En Minikube, esta suele ser la misma que la CLUSTER-IP, pero ahora es directamente accesible desde tu máquina local.
Puede realizar pruebas sencillas con curl, idealmente si se encuentra en un escenario como una máquina virtual con Minikube.
usuario@usuario:~$ curl 10.103.234.51:8080
Request served by balanced-57c6cb5949-684mq
HTTP/1.1 GET /
Host: 10.103.234.51:8080
Accept: */*
User-Agent: curl/8.12.1
5. Accediendo a la Aplicación
Con la IP externa asignada, puede acceder a su aplicación usando:
http://<EXTERNAL-IP>:8080
Por ejemplo, si la IP externa es 10.103.234.51:
http://10.103.234.51:8080
Debería ver la respuesta del servidor echo, mostrando detalles de tu solicitud HTTP.
¿Qué hace minikube tunnel?
Tareas que realiza minikube tunnel:
Creación de rutas: Minikube crea rutas de red en su sistema para que las IPs del clúster sean accesibles directamente
Proxy transparente: El túnel actúa como un proxy, redirigiendo el tráfico destinado a la IP externa hacia los nodos de Minikube
Simulación del balanceador: Aunque no hay un balanceador de carga real, el comportamiento es similar desde el punto de vista de la aplicación
Es importante entender que minikube tunnel es específico de Minikube. En un entorno de producción con un proveedor de nube, el proceso de asignación de IP externa ocurre automáticamente a través de la infraestructura del proveedor.
Ventajas de Usar LoadBalancer
Simplicidad: Proporciona una única IP estable y dedicada para tu servicio
Escalabilidad: Distribuye automáticamente el tráfico entre todos los pods del servicio
Alta disponibilidad: Redirige el tráfico lejos de pods no saludables
Integración con la nube: En entornos de nube, se integra con los balanceadores nativos del proveedor
Limitaciones y Consideraciones
Costos en la nube: En proveedores de nube, cada servicio LoadBalancer generalmente incurre en costos adicionales
Recursos en Minikube: El túnel consume recursos de CPU y memoria en su máquina local
Privilegios elevados:
minikube tunnelrequiere privilegios de administradorPersistencia: El túnel debe mantenerse en ejecución para que la IP externa sea accesible
Mejores Prácticas
Reutilización de LoadBalancers: En entornos de producción, considere usar un Ingress Controller en lugar de múltiples LoadBalancers para reducir costos
Monitoreo: Configure monitoreo para sus servicios LoadBalancer para detectar problemas de disponibilidad
Sondeos de salud: Personaliza los sondeos de salud para asegurar que el tráfico se dirija solo a pods completamente funcionales
Seguridad: Considera implementar restricciones de seguridad adicionales, como firewalls o políticas de red
Ejemplo de Configuración Avanzada
Para ilustrar un caso más completo, veamos cómo configurar un servicio LoadBalancer con más opciones:
apiVersion: v1
kind: Service
metadata:
name: balanced-advanced
annotations:
# Estas anotaciones funcionan en proveedores de nube, no en Minikube
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true"
spec:
type: LoadBalancer
selector:
app: balanced
ports:
- port: 80
targetPort: 8080
name: http
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800
Puede aplicar esta configuración con:
kubectl apply -f balanced-service.yaml
Comparación con Otras Opciones para Exponer Aplicaciones
Para comprender mejor cuándo usar LoadBalancer, comparémolo con otras opciones:
| Tipo de Servicio | Accesibilidad | Caso de Uso Ideal | Costo en la Nube | Notas Adicionales |
| ClusterIP | Solo accesible dentro del clúster. | Comunicación entre servicios internos. | Sin costo adicional. | Es el tipo de servicio predeterminado en Kubernetes. Ideal para microservicios que solo necesitan comunicarse entre sí. Asigna una IP virtual estable que existe solo dentro del clúster. |
| NodePort | Expone el servicio en un puerto del nodo. | Desarrollo, pruebas o demostraciones donde se necesita acceso externo simple. | Sin costo adicional directo, solo los costos normales de los nodos. | Requiere la IP del nodo y el puerto asignado (30000-32767). Menos conveniente para usuarios finales. Cada servicio se expone en el mismo puerto en todos los nodos del clúster. |
| LoadBalancer | Proporciona una IP dedicada y accesible externamente. | Aplicaciones de producción que requieren acceso externo directo y balanceo de carga. | Más costoso. Cada servicio LoadBalancer generalmente incurre en un costo específico del proveedor de nube. | Integra automáticamente con balanceadores de carga nativos de proveedores de nube. Proporciona alta disponibilidad y distribución del tráfico. En entornos locales como Minikube, requiere soluciones adicionales como minikube tunnel. |
| Ingress | Proporciona enrutamiento basado en HTTP/HTTPS. | Hosting de múltiples servicios web bajo un mismo punto de entrada con enrutamiento basado en nombre de host o ruta URL. | Costo del controlador Ingress (generalmente uno por clúster) más al menos un LoadBalancer para exponerlo. | Puede usar un solo LoadBalancer para múltiples servicios, reduciendo costos. Ofrece características avanzadas como terminación TLS, autenticación y enrutamiento basado en path. Requiere un controlador de Ingress instalado en el clúster. |
El servicio LoadBalancer en Kubernetes proporciona una manera conveniente de exponer aplicaciones al exterior. Aunque su implementación en Minikube requiere pasos adicionales con el comando tunnel, el concepto fundamental es el mismo que en entornos de nube.
Recuerde que mientras que en Minikube el LoadBalancer es simulado mediante el túnel, en entornos de nube proporciona integración real con los balanceadores de carga nativos, ofreciendo características adicionales como escalado automático, distribución geográfica y más.