Quiz: Fundamentos de Kubernetes

Quiz
10 min~4 min lectura

Quiz Interactivo

Pon a prueba tus conocimientos

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: 5000

Despué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: 10

Errores 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

  1. Puedo crear un Deployment YAML para un modelo de ML con réplicas y recursos definidos.
  2. Sé exponer un Deployment con un Service (ClusterIP o LoadBalancer).
  3. Entiendo cómo configurar un Horizontal Pod Autoscaler basado en métricas de CPU.
  4. Puedo aplicar rolling updates para actualizar la versión de un modelo sin downtime.
  5. Sé usar kubectl para verificar el estado de pods, deployments y services.
  6. Puedo solucionar problemas comunes como pods en estado CrashLoopBackOff.
  7. 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:

  1. Instala Minikube y kubectl si no los tienes. Ejecuta minikube start para iniciar el cluster.
  2. Crea un archivo llamado deployment.yaml con el código YAML optimizado de la sección "Código en acción" (usa una imagen Docker pública como python:3.9-slim para simular).
  3. Aplica el Deployment con kubectl apply -f deployment.yaml.
  4. Verifica que los pods estén corriendo con kubectl get pods.
  5. Crea un archivo service.yaml para exponer el Deployment con un Service de tipo NodePort.
  6. Aplica el Service y accede al modelo usando minikube service <nombre-del-service>.
  7. Escala el Deployment a 5 réplicas con kubectl scale deployment ml-model-optimizado --replicas=5 y verifica los cambios.
Pistas
  • 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.