Concepto clave
Kubernetes es un sistema de orquestación de contenedores que automatiza el despliegue, escalado y gestión de aplicaciones en contenedores. Imagina que tienes una flota de camiones (nodos) que transportan cajas (pods) con productos (contenedores). Kubernetes es el centro de control que decide qué camión lleva qué caja, cuándo agregar más camiones si hay mucho tráfico, y cómo reemplazar camiones que se descomponen, todo sin interrumpir la entrega.
En el contexto de modelos de ML, Kubernetes permite desplegar múltiples réplicas de tu modelo para manejar picos de tráfico, actualizar versiones sin tiempo de inactividad mediante rolling updates, y gestionar recursos como CPU y memoria para optimizar costos. Es como tener un equipo de científicos de datos que automáticamente ajusta la infraestructura según la demanda de predicciones.
Cómo funciona en la práctica
Para desplegar un modelo de ML en Kubernetes, sigues estos pasos: primero, creas un Deployment que define cuántas réplicas del contenedor Docker quieres ejecutar. Luego, expones el Deployment con un Service para que las aplicaciones externas puedan acceder a las predicciones. Finalmente, configuras un Horizontal Pod Autoscaler para escalar automáticamente basado en métricas como uso de CPU.
Ejemplo: Supón que tienes un modelo de clasificación de imágenes en un contenedor Docker. Creas un Deployment con 3 réplicas para alta disponibilidad, un Service de tipo LoadBalancer para distribuir tráfico, y un autoscaler que añade más réplicas si el uso de CPU supera el 70%. Así, durante horas pico, Kubernetes puede escalar a 5 réplicas sin intervención manual.
Código en acción
Aquí tienes un archivo YAML para un Deployment de un modelo de ML simple. Antes de refactorizar, podrías tener un Deployment básico:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ml-model-basic
spec:
replicas: 1
selector:
matchLabels:
app: ml-model
template:
metadata:
labels:
app: ml-model
spec:
containers:
- name: model-container
image: mi-registro/ml-model:v1
ports:
- containerPort: 5000Después de refactorizar para mejores prácticas, añades recursos y health checks:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ml-model-optimizado
spec:
replicas: 3
selector:
matchLabels:
app: ml-model
template:
metadata:
labels:
app: ml-model
spec:
containers:
- name: model-container
image: mi-registro/ml-model:v2
ports:
- containerPort: 5000
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 5000
initialDelaySeconds: 30
periodSeconds: 10Errores comunes
- No definir límites de recursos: Sin límites de CPU/memoria, un pod puede consumir todos los recursos del nodo, causando inestabilidad. Siempre especifica requests y limits en el Deployment.
- Olvidar health checks: Sin livenessProbe, Kubernetes no sabe si tu modelo está funcionando, lo que puede llevar a tráfico enviado a pods caídos. Incluye endpoints /health en tu aplicación.
- Usar latest en image tags: Usar "latest" puede causar despliegues inconsistentes. Usa tags específicos como v1.2.3 para control de versiones.
- No configurar rolling updates: Actualizar sin strategy puede causar tiempo de inactividad. Define strategy.type: RollingUpdate en el Deployment.
- Ignorar namespaces Desplegar todo en default namespace lleva a desorden. Usa namespaces como ml-production para organizar recursos.
Checklist de dominio
- Puedo crear un Deployment YAML para un modelo de ML con réplicas y recursos definidos.
- Sé exponer un Deployment con un Service (ClusterIP o LoadBalancer).
- Entiendo cómo configurar un Horizontal Pod Autoscaler basado en métricas de CPU.
- Puedo aplicar rolling updates para actualizar la versión de un modelo sin downtime.
- Sé usar kubectl para verificar el estado de pods, deployments y services.
- Puedo solucionar problemas comunes como pods en estado CrashLoopBackOff.
- Entiendo la diferencia entre requests y limits de recursos en Kubernetes.
Despliega un Modelo de ML en Minikube
En este ejercicio, desplegarás un modelo de ML simple en un cluster local de Kubernetes usando Minikube. Sigue estos pasos:
- Instala Minikube y kubectl si no los tienes. Ejecuta
minikube startpara iniciar el cluster. - Crea un archivo llamado
deployment.yamlcon el código YAML optimizado de la sección "Código en acción" (usa una imagen Docker pública comopython:3.9-slimpara simular). - Aplica el Deployment con
kubectl apply -f deployment.yaml. - Verifica que los pods estén corriendo con
kubectl get pods. - Crea un archivo
service.yamlpara exponer el Deployment con un Service de tipo NodePort. - Aplica el Service y accede al modelo usando
minikube service <nombre-del-service>. - Escala el Deployment a 5 réplicas con
kubectl scale deployment ml-model-optimizado --replicas=5y verifica los cambios.
- Si minikube start falla, verifica que tengas un hypervisor como VirtualBox instalado.
- Para el Service, usa apiVersion: v1, kind: Service, y spec.type: NodePort con puerto 5000.
- Puedes simular un modelo con un contenedor que ejecute un servidor web simple en Python.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.