Conceptos Clave de Kubernetes: Pods, Services y Deployments

Lectura
20 min~6 min lectura

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-model en el Service coincida con las etiquetas en el Pod template del Deployment.
  • Puertos mal configurados: Confundir port (puerto del Service), targetPort (puerto del contenedor) y containerPort (puerto expuesto en el Pod). Revisa que targetPort en el Service sea igual a containerPort en 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 pod para 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, y kubectl describe para 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 curl o 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).

  1. Prepara el entorno: Asegúrate de tener kubectl instalado y configurado para acceder a tu clúster. Verifica con kubectl cluster-info.
  2. Crea los archivos YAML: Usa los ejemplos de código de la lección. Crea dos archivos: deployment.yaml y service.yaml. En deployment.yaml, cambia la imagen a python:3.9-slim (como sustituto si no tienes ml-model:1.0) y ajusta el containerPort a 8080. En service.yaml, configura el targetPort como 8080 y el tipo como ClusterIP.
  3. Aplica los recursos: Ejecuta kubectl apply -f deployment.yaml y kubectl apply -f service.yaml. Verifica que los Pods estén en estado Running con kubectl get pods.
  4. Prueba el Service: Obtén la IP del Service con kubectl get service ml-model-service. Usa kubectl port-forward service/ml-model-service 8080:80 para redirigir tráfico local. Abre un navegador en http://localhost:8080 o usa curl para verificar la conectividad.
  5. Escala el Deployment: Cambia el número de réplicas a 5 en deployment.yaml y vuelve a aplicar con kubectl apply -f deployment.yaml. Verifica con kubectl get pods que se hayan creado nuevas réplicas.
  6. Limpia: Elimina los recursos con kubectl delete -f deployment.yaml -f service.yaml.
Pistas
  • Si los Pods no se crean, usa kubectl describe deployment ml-model-deployment para 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.