Conceptos clave: Pods, Services y Deployments
En Kubernetes, tres conceptos fundamentales trabajan juntos para orquestar aplicaciones: Pods, Services y Deployments. Imagina que estás desplegando un modelo de machine learning en producción.
Un Pod es la unidad más pequeña y básica en Kubernetes. Representa un solo proceso en ejecución en tu clúster. Piensa en un Pod como un contenedor Docker (o varios contenedores que comparten recursos) que ejecuta tu aplicación. Por ejemplo, un Pod podría contener tu modelo de ML empaquetado en un contenedor Docker. Los Pods son efímeros: Kubernetes puede crearlos, destruirlos y recrearlos según sea necesario.
Un Service es un punto de acceso estable a un conjunto de Pods. Define una política para acceder a los Pods, como un balanceador de carga. Si tu Pod se reinicia y obtiene una nueva dirección IP, el Service asegura que el tráfico aún pueda llegar a él. Es como tener un número de teléfono fijo para un equipo que puede cambiar de miembros: siempre sabes a quién llamar.
Un Deployment es un objeto de Kubernetes que describe el estado deseado de tu aplicación. Especifica cuántas réplicas de un Pod deben ejecutarse y cómo actualizarlas. Por ejemplo, puedes definir un Deployment para ejecutar tres réplicas de tu modelo de ML y actualizarlo sin tiempo de inactividad. Los Deployments gestionan la creación y actualización de Pods, asegurando que tu aplicación esté siempre disponible.
Cómo funciona en la práctica
Vamos a desplegar un modelo de ML simple usando estos conceptos. Supongamos que tienes un modelo de clasificación de imágenes empaquetado en un contenedor Docker llamado ml-model:1.0. Tu objetivo es ejecutar tres réplicas de este modelo y exponerlo a través de un servicio.
Paso 1: Define un Deployment en un archivo YAML. Este Deployment especificará que quieres tres réplicas del Pod, cada una ejecutando el contenedor ml-model:1.0. Kubernetes creará y gestionará estos Pods.
Paso 2: Define un Service en otro archivo YAML. Este Service se vinculará a los Pods creados por el Deployment, proporcionando una IP y puerto estables para acceder al modelo. Puedes configurarlo como un Service de tipo ClusterIP para acceso interno o LoadBalancer para acceso externo.
Paso 3: Aplica los archivos YAML usando kubectl apply -f. Kubernetes creará el Deployment, que a su vez creará los Pods, y luego creará el Service para exponerlos. Puedes verificar el estado con comandos como kubectl get pods, kubectl get services.
Código en acción
Aquí tienes ejemplos funcionales de archivos YAML para desplegar un modelo de ML. Asegúrate de tener Kubernetes configurado (por ejemplo, con Minikube o un clúster en la nube).
Archivo deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ml-model-deployment
spec:
replicas: 3
selector:
matchLabels:
app: ml-model
template:
metadata:
labels:
app: ml-model
spec:
containers:
- name: ml-model-container
image: ml-model:1.0
ports:
- containerPort: 5000
Archivo service.yaml:
apiVersion: v1
kind: Service
metadata:
name: ml-model-service
spec:
selector:
app: ml-model
ports:
- protocol: TCP
port: 80
targetPort: 5000
type: LoadBalancer
Para aplicarlos, ejecuta:
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
Verifica la creación:
kubectl get pods
kubectl get services
Errores comunes
- Selector incorrecto en el Service: Si el selector en el Service no coincide con las etiquetas de los Pods, el Service no enrutará tráfico. Asegúrate de que
app: ml-modelen el Service coincida con las etiquetas en el Pod template del Deployment. - Puertos mal configurados: Confundir
port(puerto del Service),targetPort(puerto del contenedor) ycontainerPort(puerto expuesto en el Pod). Revisa quetargetPorten el Service sea igual acontainerPorten el Deployment. - Falta de recursos en el clúster: Si solicitas más réplicas de las que el clúster puede manejar, los Pods quedarán en estado Pending. Usa
kubectl describe podpara ver errores de recursos. - Olvidar actualizar la imagen del contenedor: Al cambiar a una nueva versión del modelo (por ejemplo,
ml-model:2.0), debes actualizar la imagen en el Deployment y aplicar los cambios. No se actualiza automáticamente. - No probar localmente primero: Desplegar directamente en producción sin probar en un entorno de desarrollo puede llevar a errores. Usa herramientas como Minikube para pruebas locales.
Checklist de dominio
- Puedo explicar la diferencia entre un Pod, un Service y un Deployment en mis propias palabras.
- Sé crear un archivo YAML para un Deployment que ejecute múltiples réplicas de un contenedor Docker.
- Puedo configurar un Service para exponer los Pods de un Deployment, eligiendo el tipo adecuado (por ejemplo, ClusterIP o LoadBalancer).
- Entiendo cómo usar
kubectl apply,kubectl get, ykubectl describepara gestionar y depurar recursos. - Reconozco y soluciono errores comunes como selectores no coincidentes o puertos mal configurados.
- Sé actualizar un Deployment para cambiar la imagen del contenedor o el número de réplicas.
- Puedo verificar que mi modelo de ML esté accesible a través del Service usando comandos como
curlo herramientas de prueba.
Despliega un modelo de ML simple en Kubernetes
En este ejercicio, desplegarás un modelo de ML básico usando Kubernetes. Asume que tienes un clúster de Kubernetes configurado (por ejemplo, Minikube en local o un clúster en la nube).
- Prepara el entorno: Asegúrate de tener
kubectlinstalado y configurado para acceder a tu clúster. Verifica conkubectl cluster-info. - Crea los archivos YAML: Usa los ejemplos de código de la lección. Crea dos archivos:
deployment.yamlyservice.yaml. Endeployment.yaml, cambia la imagen apython:3.9-slim(como sustituto si no tienesml-model:1.0) y ajusta elcontainerPorta 8080. Enservice.yaml, configura eltargetPortcomo 8080 y el tipo comoClusterIP. - Aplica los recursos: Ejecuta
kubectl apply -f deployment.yamlykubectl apply -f service.yaml. Verifica que los Pods estén en estado Running conkubectl get pods. - Prueba el Service: Obtén la IP del Service con
kubectl get service ml-model-service. Usakubectl port-forward service/ml-model-service 8080:80para redirigir tráfico local. Abre un navegador enhttp://localhost:8080o usacurlpara verificar la conectividad. - Escala el Deployment: Cambia el número de réplicas a 5 en
deployment.yamly vuelve a aplicar conkubectl apply -f deployment.yaml. Verifica conkubectl get podsque se hayan creado nuevas réplicas. - Limpia: Elimina los recursos con
kubectl delete -f deployment.yaml -f service.yaml.
- Si los Pods no se crean, usa
kubectl describe deployment ml-model-deploymentpara ver errores. - Para el port-forward, asegúrate de que el puerto local (8080) no esté en uso por otra aplicación.
- Si el Service no muestra una IP, verifica que el tipo ClusterIP esté configurado correctamente en el archivo YAML.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.