Crear un Deployment

KubernetesBeginner
Practicar Ahora

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.