Introducción
Un Pod ejecuta contenedores, pero un Pod por sí solo no es la forma habitual de ejecutar una aplicación en Kubernetes. Un Deployment describe el estado deseado de una aplicación y crea un ReplicaSet, el cual a su vez crea y mantiene los Pods.
En este laboratorio, crearás tu primer Deployment, esperarás a que esté disponible, inspeccionarás el Deployment, el ReplicaSet y los Pods que genera, y observarás cómo el Deployment restaura los Pods tras ser eliminados. Estos conceptos son la base para temas posteriores del CKAD, como el escalado, las actualizaciones progresivas (rolling updates), los rollbacks y la exposición de aplicaciones.
Preparar un Namespace para el Deployment
En este paso, prepararás un namespace limpio para practicar con Deployments y lo establecerás como el namespace predeterminado para tus comandos.
Comienza en /home/labex/project. No necesitarás escribir un manifiesto en este laboratorio, pero utilizar el mismo espacio de trabajo mantiene la coherencia del curso.
mkdir -p /home/labex/project
cd /home/labex/project
Verifica que el servidor de la API de Kubernetes sea accesible. Si la máquina virtual acaba de iniciarse y este comando falla, espera unos segundos y vuelve a ejecutarlo hasta que el nodo esté en estado Ready.
kubectl get nodes --request-timeout=5s
La salida esperada incluye:
NAME STATUS ROLES AGE VERSION
labex-v135 Ready control-plane ... v1.35...
Los Pods necesitan el plugin de red del clúster antes de poder estar listos (Ready). Espera a que el Pod de Calico esté listo antes de crear cargas de trabajo de aplicación.
kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s
Salida esperada:
pod/calico-node-... condition met
Crea un namespace llamado ckad-prep-deployments:
kubectl create namespace ckad-prep-deployments
El comando debería confirmar la creación:
namespace/ckad-prep-deployments created
Establece este namespace como el namespace del contexto actual:
kubectl config set-context --current --namespace=ckad-prep-deployments
Confirma el namespace actual:
kubectl config view --minify --output 'jsonpath={..namespace}'; echo
Salida esperada:
ckad-prep-deployments
Crear el Deployment
En este paso, crearás un Deployment llamado web-demo con dos réplicas.
El comando kubectl create deployment solicita a Kubernetes la creación de un objeto Deployment. La opción --image define la imagen del contenedor en la plantilla del Pod, y --replicas=2 le indica al Deployment que mantenga dos Pods coincidentes en ejecución.
kubectl create deployment web-demo --image=registry.k8s.io/pause:3.10.1 --replicas=2
Salida esperada:
deployment.apps/web-demo created
Espera a que finalice el despliegue (rollout) del Deployment. Para un nuevo Deployment, el estado de despliegue significa que Kubernetes creó el ReplicaSet y los Pods solicitados ya están disponibles.
kubectl rollout status deployment/web-demo --timeout=90s
La salida puede incluir mensajes breves de espera mientras los Pods se vuelven disponibles. Debería terminar con:
deployment "web-demo" successfully rolled out
Ahora inspecciona el resumen del Deployment:
kubectl get deployment web-demo
La salida esperada incluye:
NAME READY UP-TO-DATE AVAILABLE AGE
web-demo 2/2 2 2 ...
Inspeccionar el ReplicaSet y los Pods
En este paso, inspeccionarás los objetos creados bajo el Deployment.
Un Deployment no ejecuta contenedores directamente. Crea un ReplicaSet, y el ReplicaSet crea los Pods. El selector del Deployment y las etiquetas (labels) de la plantilla del Pod conectan estos objetos entre sí.
Primero, inspecciona la etiqueta del selector y la etiqueta de la plantilla en el Deployment. JSONPath imprime solo los campos seleccionados, lo que mantiene la salida enfocada.
kubectl get deployment web-demo -o 'jsonpath={.spec.selector.matchLabels.app}{" "}{.spec.template.metadata.labels.app}{"\n"}'
Salida esperada:
web-demo web-demo
El primer valor es la etiqueta del selector del Deployment. El segundo valor es la etiqueta colocada en los Pods desde la plantilla. Como coinciden, el Deployment puede gestionar esos Pods.
Lista el ReplicaSet creado por el Deployment:
kubectl get replicasets -l app=web-demo
La salida esperada incluye:
NAME DESIRED CURRENT READY AGE
web-demo-... 2 2 2 ...
Ahora lista los Pods seleccionados por la misma etiqueta:
kubectl get pods -l app=web-demo --show-labels
La salida esperada incluye dos Pods en ejecución:
NAME READY STATUS RESTARTS AGE LABELS
web-demo-... 1/1 Running 0 ... app=web-demo,pod-template-hash=...
web-demo-... 1/1 Running 0 ... app=web-demo,pod-template-hash=...
Finalmente, muestra el tipo de propietario (owner kind) de cada Pod. Cada Pod es propiedad de un ReplicaSet, no directamente del Deployment.
kubectl get pods -l app=web-demo -o 'custom-columns=NAME:.metadata.name,OWNER:.metadata.ownerReferences[0].kind,PHASE:.status.phase'
Salida esperada:
NAME OWNER PHASE
web-demo-... ReplicaSet Running
web-demo-... ReplicaSet Running
Observar la recuperación del estado deseado
En este paso, eliminarás los Pods actuales y observarás cómo el Deployment restaura el estado deseado.
Esta es la diferencia clave entre un Pod individual y un Deployment. Si eliminas Pods independientes, desaparecen. Si eliminas Pods gestionados por un Deployment, este detecta que el estado actual ya no coincide con el estado deseado y crea reemplazos.
Elimina los Pods seleccionados por app=web-demo. La opción --wait=false devuelve el control inmediatamente después de enviar la solicitud de eliminación, por lo que puedes observar la recuperación sin esperar a que cada Pod antiguo desaparezca primero.
kubectl delete pods -l app=web-demo --wait=false
La salida esperada incluye:
pod "web-demo-..." deleted from ckad-prep-deployments namespace
pod "web-demo-..." deleted from ckad-prep-deployments namespace
Espera a que el Deployment vuelva a estar disponible:
kubectl wait --for=condition=Available deployment/web-demo --timeout=90s
Salida esperada:
deployment.apps/web-demo condition met
Lista los Pods de nuevo:
kubectl get pods -l app=web-demo
La salida esperada incluye dos Pods en ejecución. Los nombres pueden ser diferentes porque el ReplicaSet creó reemplazos.
NAME READY STATUS RESTARTS AGE
web-demo-... 1/1 Running 0 ...
web-demo-... 1/1 Running 0 ...
Verifica el resumen del Deployment una vez más:
kubectl get deployment web-demo
La salida esperada incluye:
NAME READY UP-TO-DATE AVAILABLE AGE
web-demo 2/2 2 2 ...
Resumen
Has creado un Deployment, esperado a que finalice su despliegue, inspeccionado su selector y las etiquetas de la plantilla de Pods, localizado el ReplicaSet y los Pods creados, y observado la recuperación del estado deseado tras eliminar los Pods. Estos conceptos te preparan para los siguientes laboratorios de Deployments, donde cambiarás el número de réplicas, actualizarás aplicaciones y gestionarás el comportamiento de los despliegues.


