Configuración de Minikube para desarrollo local

Lectura
15 min~13 min lectura

Introducción: Por qué Minikube es la puerta de entrada a Kubernetes para ML

En el viaje del despliegue de modelos de Machine Learning, pasar de un entorno de desarrollo local a uno de producción gestionado por Kubernetes puede parecer un abismo. Configurar un clúster completo de Kubernetes requiere recursos significativos y complejidad operativa, lo que frena la experimentación y el aprendizaje. Aquí es donde Minikube se convierte en una herramienta indispensable. Minikube es una implementación de Kubernetes que despliega un clúster de un solo nodo dentro de una máquina virtual (VM) en tu computadora local. Su propósito es proporcionar una plataforma perfecta para el desarrollo, pruebas y aprendizaje de Kubernetes sin necesidad de infraestructura en la nube o hardware dedicado.

Para el científico o ingeniero de datos enfocado en ML, Minikube ofrece el ecosistema completo de Kubernetes en un entorno controlado. Esto permite emular el ciclo de vida completo de un modelo: desde empaquetar la aplicación de inferencia en un contenedor Docker, definir sus recursos y dependencias en un Pod, exponerla mediante un Servicio, hasta gestionar actualizaciones con Deployments. Dominar Minikube significa internalizar los conceptos de orquestación de contenedores, lo que allana el camino para desplegar tus modelos en clústeres de producción en AWS EKS, Google GKE o Azure AKS con confianza y comprensión profunda.

Concepto Clave: El clúster de un solo nodo y su analogía con un banco de pruebas

Imagina que eres un ingeniero aeronáutico que necesita probar un nuevo diseño de ala. Construir un avión completo para cada prueba sería prohibitivamente costoso y lento. En su lugar, usas un túnel de viento a escala: un entorno controlado, más pequeño y manejable, que simula fielmente las condiciones de vuelo reales para validar tus hipótesis. Minikube es el túnel de viento para Kubernetes. Un clúster de producción es como el avión completo: múltiples nodos (servidores) trabajando en conjunto, con alta disponibilidad y escalabilidad. Minikube condensa esa arquitectura en un único nodo que contiene todos los componentes de control (el plano de control) y la capacidad de ejecución (el nodo trabajador) en una sola máquina.

Este nodo único ejecuta dentro de una máquina virtual, lo que lo aísla completamente de tu sistema operativo anfitrión. Dentro de él, corren los mismos demonios que en un clúster real: el kube-apiserver (el punto de entrada para todas las operaciones), el kube-scheduler (que asigna Pods a nodos), el kube-controller-manager (que regula el estado del clúster) y, crucialmente, el kubelet (el agente que ejecuta los contenedores en el nodo). Al interactuar con Minikube a través de kubectl, estás comunicándote con un sistema auténtico, solo que a escala de laboratorio. Esta fidelidad es lo que hace que las habilidades desarrolladas localmente sean directamente transferibles.

Preparación del entorno: Instalación de prerrequisitos

Antes de iniciar Minikube, debemos asegurar que las herramientas fundamentales estén instaladas y configuradas en tu sistema. El trío esencial es: un hipervisor (para crear la VM), Docker (para construir y almacenar las imágenes de tus modelos) y kubectl (el cliente de línea de comandos para Kubernetes). La elección del hipervisor depende de tu sistema operativo. Para Linux, se recomienda KVM o VirtualBox. Para macOS, HyperKit (por defecto) o VirtualBox. Para Windows, Hyper-V o VirtualBox. Minikube incluye controladores (drivers) para integrarse con estos.

Es crítico verificar que tu máquina cumpla con los requisitos mínimos: al menos 2 CPUs, 2GB de RAM libre y 20GB de espacio en disco. Para cargas de trabajo de ML, estos requisitos pueden aumentar rápidamente, especialmente si tu modelo es grande o usas herramientas como JupyterLab dentro del clúster. Te recomendamos asignar más recursos desde el inicio. A continuación, se muestra un script de verificación básico para sistemas tipo Unix (Linux/macOS) que puedes ejecutar para diagnosticar tu entorno.

Script de verificación del entorno

#!/bin/bash
echo "=== Verificación de Prerrequisitos para Minikube ==="
echo ""
# 1. Verificar Docker
if command -v docker &> /dev/null; then
    echo "✅ Docker está instalado. Versión:"
    docker --version
else
    echo "❌ Docker NO está instalado."
fi
echo ""
# 2. Verificar kubectl
if command -v kubectl &> /dev/null; then
    echo "✅ kubectl está instalado. Versión:"
    kubectl version --client --short
else
    echo "❌ kubectl NO está instalado."
fi
echo ""
# 3. Verificar recursos del sistema
echo "📊 Recursos del sistema:"
echo " - CPUs: $(nproc || sysctl -n hw.ncpu) núcleos"
echo " - RAM Libre: $(free -h | awk '/^Mem:/ {print $4}')"
echo " - Disco Libre: $(df -h / | awk 'NR==2 {print $4}')"
echo ""
echo "Nota: Para Windows, verifica Hyper-V o VirtualBox manualmente."
Tip Pro: En macOS y Linux, considera instalar Docker Desktop. No solo proporciona Docker, sino que también incluye una distribución de Kubernetes que puede usarse como alternativa. Sin embargo, para un aprendizaje enfocado en las herramientas estándar de la industria, Minikube sigue siendo la opción recomendada por su simplicidad y enfoque en la emulación de un clúster real.

Cómo funciona en la práctica: Inicio, configuración e interacción básica

Una vez instalados los prerrequisitos, el proceso se divide en tres fases: inicio, configuración e interacción. Iniciar Minikube por primera vez es tan simple como ejecutar minikube start. Este comando descargará la imagen ISO base, creará la VM, instalará todos los componentes de Kubernetes y los pondrá en marcha. Sin embargo, para cargas de ML, es altamente recomendable personalizar la creación del clúster asignando más CPU, memoria y almacenamiento.

Después del inicio, es crucial configurar el contexto de kubectl. Minikube modifica automáticamente el archivo de configuración de Kubernetes (~/.kube/config) para apuntar al clúster que acaba de crear. Puedes verificar esto con kubectl config current-context, que debería devolver "minikube". A partir de este momento, todos los comandos kubectl que ejecutes (como kubectl get nodes, kubectl create deployment) se dirigirán a tu clúster local. La belleza de esto es la transparencia: los mismos comandos que usarías en AWS EKS funcionan aquí.

Inicio y configuración de un clúster optimizado para ML

# Iniciar Minikube con recursos aumentados para modelos de ML.
# --cpus: Asigna 4 núcleos de CPU.
# --memory: Asigna 8 Gigabytes de RAM.
# --disk-size: Asigna 50GB de espacio en disco.
# --driver: Especifica el hipervisor (virtualbox, hyperkit, kvm2).
minikube start --cpus=4 --memory=8192 --disk-size=50g --driver=virtualbox

# Verificar que el clúster está corriendo y saludable.
minikube status

# Verificar que kubectl está comunicándose con Minikube.
kubectl cluster-info

# Listar el único nodo del clúster. Debería mostrar estado 'Ready'.
kubectl get nodes

# Habilitar complementos (addons) útiles para desarrollo.
# Dashboard: Interfaz web de administración.
# Ingress: Controlador para manejar tráfico HTTP entrante.
minikube addons enable dashboard
minikube addons enable ingress

La interacción continúa con el uso del Dashboard de Kubernetes, una interfaz gráfica que Minikube puede desplegar. Es una herramienta excelente para visualizar la estructura de tus despliegues, Pods y Servicios, especialmente cuando estás comenzando. Puedes acceder a él con minikube dashboard. Además, un comando extremadamente útil es minikube ip, que te da la dirección IP de la VM de Minikube. Esta IP será crucial más adelante para acceder a los servicios (como una API de inferencia de tu modelo) que expongas fuera del clúster.

Código en acción: Desplegando un servicio de inferencia de modelo simple

Vamos a consolidar los conceptos desplegando un ejemplo práctico: un servicio de inferencia para un modelo de ML simple. Usaremos una imagen de contenedor preconstruida que expone un modelo de clasificación de texto a través de una API REST. El objetivo es ver el flujo completo: crear un Deployment para gestionar las réplicas del Pod, exponerlo mediante un Service de tipo NodePort para acceso externo, y finalmente interactuar con el modelo.

El siguiente manifiesto YAML define un Deployment que ejecuta un contenedor con una API de modelo. Nota la sección de resources, donde solicitamos límites y solicitudes de CPU y memoria. Esto es una buena práctica esencial en Kubernetes, incluso en desarrollo, para simular las restricciones de un entorno productivo y evitar que un Pod consuma todos los recursos de tu máquina local.

Manifiesto YAML para el despliegue del modelo (modelo-deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: modelo-sentimiento-api
  labels:
    app: modelo-sentimiento
spec:
  replicas: 1 # Una sola réplica para desarrollo
  selector:
    matchLabels:
      app: modelo-sentimiento
  template:
    metadata:
      labels:
        app: modelo-sentimiento
    spec:
      containers:
      - name: modelo-container
        # Imagen pública de ejemplo que expone un modelo de análisis de sentimiento
        image: jordanwilson230/sentiment-analysis-api:latest
        ports:
        - containerPort: 5000 # Puerto donde la API escucha dentro del contenedor
        resources:
          requests: # Recursos mínimos garantizados
            memory: "512Mi"
            cpu: "250m" # 250 milicores (0.25 CPU)
          limits:   # Límite máximo que el contenedor puede usar
            memory: "1Gi"
            cpu: "500m" # 500 milicores (0.5 CPU)
        env:
        - name: MODEL_NAME
          value: "distilbert-base-uncased-finetuned-sst-2-english"
---
apiVersion: v1
kind: Service
metadata:
  name: modelo-sentimiento-service
spec:
  type: NodePort # Expone el servicio en un puerto de cada nodo (la VM de Minikube)
  selector:
    app: modelo-sentimiento # Debe coincidir con las labels del Deployment
  ports:
    - protocol: TCP
      port: 80          # Puerto interno del servicio
      targetPort: 5000  # Puerto del contenedor al que redirige
      nodePort: 30007   # Puerto externo en el rango 30000-32767 (opcional, Kubernetes lo asigna si se omite)

Ahora, aplicamos este manifiesto a nuestro clúster de Minikube y seguimos el estado del despliegue. Luego, obtenemos la URL para acceder a nuestro servicio.

Comandos para desplegar y probar el servicio

# 1. Aplicar el manifiesto YAML para crear el Deployment y el Service.
kubectl apply -f modelo-deployment.yaml

# 2. Verificar el estado del Deployment (los Pods deben estar 'Available').
kubectl get deployment modelo-sentimiento-api
kubectl get pods -l app=modelo-sentimiento

# 3. Verificar el Service creado y obtener el puerto NodePort asignado.
kubectl get service modelo-sentimiento-service

# 4. Construir la URL para acceder a la API del modelo.
#    Obtener la IP de Minikube y combinar con el NodePort.
MINIKUBE_IP=$(minikube ip)
NODE_PORT=$(kubectl get svc modelo-sentimiento-service -o jsonpath='{.spec.ports[0].nodePort}')
echo "La API del modelo está disponible en: http://$MINIKUBE_IP:$NODE_PORT"

# 5. Hacer una prueba de inferencia con curl.
#    Enviar un texto JSON para análisis de sentimiento.
curl -X POST http://$MINIKUBE_IP:$NODE_PORT/predict \
  -H "Content-Type: application/json" \
  -d '{"text": "Kubernetes and Minikube make ML deployment a joy to learn!"}'
# Respuesta esperada: {"sentiment":"POSITIVE","confidence":0.99...}
Tip de Flujo de Trabajo: Para desarrollo activo de tu propio modelo, puedes construir tu imagen de Docker localmente, etiquetarla (e.g., mi-modelo:v1) y luego cargarla directamente en el entorno de Docker de Minikube usando eval $(minikube docker-env) y docker build. Esto evita la necesidad de subir la imagen a un registro remoto durante las iteraciones de desarrollo.

Errores comunes y cómo evitarlos

Al trabajar con Minikube, es normal encontrarse con obstáculos, especialmente en la configuración inicial. Conocer estos errores comunes te ahorrará horas de frustración.

1. Error del controlador (driver) del hipervisor: "Exiting due to DRV_NOT_DETECTED". Esto significa que Minikube no pudo encontrar un hipervisor válido (VirtualBox, Hyper-V, etc.) instalado y habilitado.
Solución: Verifica la instalación del hipervisor. En Windows, asegúrate de que Hyper-V esté habilitado en "Características de Windows". En macOS, si usas HyperKit, reinstala Docker Desktop o las herramientas de línea de comandos. Especifica el driver manualmente: minikube start --driver=virtualbox.

2. Imposibilidad de descargar imágenes o iniciar Pods por falta de memoria: Los Pods se quedan en estado "Pending" y kubectl describe pod muestra eventos de "Insufficient memory".
Solución: No subestimes los requisitos de memoria para modelos de ML. Detén Minikube (minikube stop) e inícialo con más RAM: minikube start --memory=8192. Si es necesario, libera memoria cerrando otras aplicaciones.

3. El comando `kubectl` no encuentra el clúster o el contexto: Devuelve errores como "The connection to the server localhost:8080 was refused".
Solución: Minikube no configuró automáticamente el contexto. Ejecuta minikube update-context. Verifica que el contexto sea "minikube" con kubectl config get-contexts y selecciónalo con kubectl config use-context minikube.

4. No se puede acceder a un servicio NodePort desde el navegador: La conexión se rechaza o se agota el tiempo de espera, a pesar de que el Pod está "Running".
Solución: Primero, verifica el firewall de tu sistema anfitrión que podría estar bloqueando el rango de puertos NodePort (30000-32767). Segundo, y más común en Minikube, asegúrate de usar la IP correcta. No uses localhost o 127.0.0.1. Siempre usa la IP devuelta por minikube ip. También verifica que el puerto NodePort esté correctamente mapeado con kubectl get svc.

5. Conflictos con Docker Desktop Kubernetes: Si tienes Docker Desktop con su propio clúster Kubernetes habilitado, puede haber conflictos de contexto y puertos.
Solución: Deshabilita Kubernetes en Docker Desktop (Preferencias -> Kubernetes -> Desmarcar "Enable Kubernetes"). Luego, elimina el contexto no deseado: kubectl config delete-context docker-desktop. Reinicia Minikube.

Checklist de dominio: ¿Controlas la configuración local con Minikube?

Para asegurar que has asimilado completamente esta lección y estás listo para avanzar a conceptos más complejos de Kubernetes para ML, verifica que puedes realizar o comprender cada uno de los siguientes puntos:

  • Puedo instalar y verificar los tres prerrequisitos clave: un hipervisor (VirtualBox/Hyper-V), Docker y kubectl, en mi sistema operativo.
  • Sé cómo iniciar un clúster de Minikube con recursos personalizados (CPU, memoria, disco) adecuados para cargar modelos de Machine Learning de tamaño medio.
  • Puedo verificar el estado del clúster usando minikube status, kubectl cluster-info y kubectl get nodes.
  • Comprendo la diferencia entre un comando minikube (gestión del clúster local) y un comando kubectl (gestión de cargas de trabajo dentro del clúster).
  • Soy capaz de desplegar una aplicación desde un manifiesto YAML, exponerla mediante un Service de tipo NodePort y construir la URL correcta (usando minikube ip) para acceder a ella desde mi máquina anfitrión.
  • Puedo diagnosticar y resolver al menos tres de los errores comunes listados anteriormente, como problemas de driver o falta de recursos.
  • Sé cómo habilitar addons como el Dashboard y el Ingress Controller, y para qué se utiliza cada uno en el desarrollo de aplicaciones.
  • Entiendo el propósito de la sección resources en un manifiesto de Pod/Deployment y puedo definir solicitudes y límites razonables para un contenedor que ejecuta un modelo.

Dominar esta checklist no solo significa que has configurado una herramienta, sino que has sentado las bases operativas y conceptuales para orquestar contenedores. Minikube es tu campo de entrenamiento. Los principios de Deployments, Services, Pods y configuración de recursos que practicas aquí son idénticos a los que usarás para desplegar tu modelo en un clúster de producción, escalando de un nodo a cientos. El siguiente paso natural es aprender a gestionar configuraciones (ConfigMaps, Secrets), almacenamiento persistente (PersistentVolumes) para tus datos de modelo, y orquestar despliegues más complejos con múltiples microservicios que interactúen (por ejemplo, un servicio de preprocesamiento, otro de inferencia y otro de postprocesamiento). Has encendido el motor de tu clúster local. Ahora es momento de cargarle combustible con tus modelos y ponerlo a rodar.

De lección a portfolio

Convertí esta lección en una habilidad visible para entrevistas.

Guardá el curso, completá los ejercicios y conectá esta habilidad con una ruta de empleo, data, IA, programación o marketing.

Newsletter Cursalo

Recibí rutas y cursos nuevos

Sumate para recibir recursos orientados a empleo y portfolio.

  • Rutas de empleo
  • Cursos prácticos
  • Portfolio y entrevistas

Sin spam. También podés entrar con tu cuenta para guardar progreso. Iniciá sesión