Skip to main content

Command Palette

Search for a command to run...

Minikube: LoadBalancer

Published
7 min read
J

¡El café, la fotografía, el manga, los cómics y la tecnología son mis grandes pasiones!

Perfil de Instagram

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:

  1. Creación del servicio: Define un servicio de tipo LoadBalancer que apunta a sus pods

  2. Asignación de IP externa: Kubernetes asigna una IP externa (en la nube) o virtual (en Minikube)

  3. Distribución de tráfico: El balanceador dirige el tráfico entrante a los pods disponibles

  4. 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:

  1. Creación de rutas: Minikube crea rutas de red en su sistema para que las IPs del clúster sean accesibles directamente

  2. Proxy transparente: El túnel actúa como un proxy, redirigiendo el tráfico destinado a la IP externa hacia los nodos de Minikube

  3. 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

  1. Simplicidad: Proporciona una única IP estable y dedicada para tu servicio

  2. Escalabilidad: Distribuye automáticamente el tráfico entre todos los pods del servicio

  3. Alta disponibilidad: Redirige el tráfico lejos de pods no saludables

  4. Integración con la nube: En entornos de nube, se integra con los balanceadores nativos del proveedor

Limitaciones y Consideraciones

  1. Costos en la nube: En proveedores de nube, cada servicio LoadBalancer generalmente incurre en costos adicionales

  2. Recursos en Minikube: El túnel consume recursos de CPU y memoria en su máquina local

  3. Privilegios elevados: minikube tunnel requiere privilegios de administrador

  4. Persistencia: El túnel debe mantenerse en ejecución para que la IP externa sea accesible

Mejores Prácticas

  1. Reutilización de LoadBalancers: En entornos de producción, considere usar un Ingress Controller en lugar de múltiples LoadBalancers para reducir costos

  2. Monitoreo: Configure monitoreo para sus servicios LoadBalancer para detectar problemas de disponibilidad

  3. Sondeos de salud: Personaliza los sondeos de salud para asegurar que el tráfico se dirija solo a pods completamente funcionales

  4. 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 ServicioAccesibilidadCaso de Uso IdealCosto en la NubeNotas Adicionales
ClusterIPSolo 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.
NodePortExpone 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.
LoadBalancerProporciona 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.
IngressProporciona 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.

15 views

More from this blog

The Cloud Stories

47 posts

¡El café, la fotografía, el manga, los cómics y la tecnología son mis grandes pasiones!

Manizaleño, Ingeniero Electrónico & Magíster en Ingeniería de Sistemas.

https://bento.me/jpadilla