Saltar al contenido

Lección 6 de 20 · Lectura y práctica

Conceptos Clave de Kubernetes: Pods, Services y Deployments

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.

Del concepto a la práctica

Taller de esta lección

Deployment, Pod y Service resuelven problemas distintos. El Deployment mantiene réplicas y actualizaciones; el Pod ejecuta contenedores; el Service selecciona Pods mediante etiquetas y ofrece un destino estable. La conexión funciona únicamente si etiquetas, selector y puertos coinciden.

Ejemplo resuelto

Un Deployment etiqueta sus Pods con app=recomendador y el contenedor escucha en 5000. Un Service selecciona app=recomendador, usa port:80 y targetPort:5000. Tres réplicas siguen siendo accesibles por el mismo Service aunque una cambie de IP.

Pruébalo

  1. Escribe el Deployment con dos réplicas y la etiqueta indicada.

  2. Añade el Service con port y targetPort diferenciados.

  3. Aplica ambos manifiestos en un clúster local.

  4. Revisa endpoints y prueba una petición.

Error frecuente: usar app=modelo en el selector y app=recomendador en el Pod. Corrección: compara literalmente ambos valores.

Comprueba tu resultado

Deben aparecer dos Pods listos y dos direcciones listas en los EndpointSlices asociados al Service. Una petición al puerto local redirigido explícitamente debe alcanzar el proceso interno en 5000, no un puerto inventado.

Manifiestos completos de conectividad

Para probar solo la red, sin fingir que la imagen Python base ya es una API de ML, usa un servidor HTTP simple:

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cursalo-red
spec:
  replicas: 2
  selector:
    matchLabels:
      app: cursalo-red
  template:
    metadata:
      labels:
        app: cursalo-red
    spec:
      automountServiceAccountToken: false
      securityContext:
        runAsNonRoot: true
        runAsUser: 1000
        seccompProfile:
          type: RuntimeDefault
      containers:
        - name: servidor
          image: python:3.12-slim
          command: ["python", "-m", "http.server", "5000", "--bind", "0.0.0.0", "--directory", "/tmp"]
          ports:
            - containerPort: 5000
          securityContext:
            allowPrivilegeEscalation: false
            readOnlyRootFilesystem: true
            capabilities:
              drop: [ALL]
          readinessProbe:
            httpGet:
              path: /
              port: 5000
          resources:
            requests:
              cpu: 50m
              memory: 64Mi
            limits:
              cpu: 200m
              memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
  name: cursalo-red
spec:
  type: ClusterIP
  selector:
    app: cursalo-red
  ports:
    - port: 80
      targetPort: 5000

Consulta kubectl get endpointslices -l kubernetes.io/service-name=cursalo-red y cuenta dos direcciones listas, no necesariamente dos objetos Slice. kubectl port-forward service/cursalo-red 8080:80 permite probar localhost:8080. El Service no publica por sí solo ese puerto local. containerPort tampoco arranca ni abre el proceso: la orden es lo que hace escuchar el servidor. Reemplaza esta prueba de conectividad por tu imagen preparada para inferencia. EndpointSlices.

Secuencia de código, imagen de contenedor, pruebas, registro y despliegue de instancias idénticas.
CursaloMapa de práctica
Del código al despliegue

El código se empaqueta en una imagen y se prueba antes de publicarlo. Esa misma imagen se guarda en un registro y se usa en el despliegue. Comprobar la salud de las instancias permite detectar un fallo sin reconstruir el artefacto.

Ver la infografía en tamaño completo ↗

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.

Sigue con Containerización y Despliegue de Modelos de ML con Docker y Kubernetes

Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.

Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.