Introducción
Las tareas del examen CKAD a menudo requieren que elija el recurso de carga de trabajo de Kubernetes adecuado antes de escribir un manifiesto. Un Pod es la unidad ejecutable más pequeña, un Deployment mantiene disponibles las réplicas de aplicaciones de larga duración, un Job ejecuta una tarea hasta su finalización y un CronJob almacena una plantilla de Job programada.
En este laboratorio, comparará estos recursos a través de su comportamiento observable en lugar de memorizar definiciones. Verá que un Pod independiente no vuelve a aparecer tras ser eliminado, un Deployment recrea su Pod, un Job finaliza y registra el éxito, y un CronJob almacena información de programación para tareas recurrentes.
Preparar un espacio de nombres para la comparación de cargas de trabajo
En este paso, preparará un espacio de nombres (namespace) limpio para comparar los recursos de carga de trabajo.
Comience en /home/labex/project. Creará pequeños manifiestos en este directorio a medida que compare el comportamiento de las cargas de trabajo.
mkdir -p /home/labex/project
cd /home/labex/project
Compruebe que el servidor de la API de Kubernetes sea accesible. Si la máquina virtual acaba de iniciarse y el nodo aún no está listo, espere unos segundos y vuelva a ejecutar el comando.
kubectl get nodes --request-timeout=5s
La salida esperada incluye:
NAME STATUS ROLES AGE VERSION
labex-v135 Ready control-plane ... v1.35...
Las cargas de trabajo crean Pods, así que espere hasta que el Pod de red del clúster esté listo (Ready).
kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s
Salida esperada:
pod/calico-node-... condition met
Cree un espacio de nombres llamado ckad-prep-workloads:
kubectl create namespace ckad-prep-workloads
Establezca este espacio de nombres como el espacio de nombres del contexto actual:
kubectl config set-context --current --namespace=ckad-prep-workloads
Confirme el espacio de nombres actual:
kubectl config view --minify --output 'jsonpath={..namespace}'; echo
Salida esperada:
ckad-prep-workloads
Comparar un Pod con un Deployment
En este paso, comparará un Pod independiente con un Deployment eliminando ambos Pods y observando qué hace Kubernetes a continuación.
Un Pod independiente es útil cuando necesita una unidad de ejecución gestionada directamente para una tarea muy pequeña o una inspección. Un Deployment es mejor para una aplicación de larga duración porque un Deployment posee un ReplicaSet, y el ReplicaSet mantiene el número solicitado de Pods en ejecución.
Cree un manifiesto de Pod independiente. El contenedor entra en modo de espera (sleep) para que el Pod permanezca activo el tiempo suficiente para observarlo. El campo terminationGracePeriodSeconds: 0 hace que este laboratorio sea más rápido cuando elimine el Pod más adelante.
cat > standalone-pod.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata:
name: standalone-task
labels:
app: standalone-task
workload.labex.io/intent: direct-pod
spec:
terminationGracePeriodSeconds: 0
containers:
- name: sleeper
image: busybox:1.36
command: ["/bin/sh", "-c", "sleep 3600"]
EOF
Cree un manifiesto de Deployment. Este Deployment le pide a Kubernetes que mantenga un Pod managed-worker en ejecución, y su plantilla de Pod utiliza la misma configuración de terminación rápida.
cat > managed-deployment.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: managed-worker
labels:
workload.labex.io/intent: long-running
spec:
replicas: 1
selector:
matchLabels:
app: managed-worker
template:
metadata:
labels:
app: managed-worker
spec:
terminationGracePeriodSeconds: 0
containers:
- name: sleeper
image: busybox:1.36
command: ["/bin/sh", "-c", "sleep 3600"]
EOF
Aplique ambos manifiestos:
kubectl apply -f standalone-pod.yaml
kubectl apply -f managed-deployment.yaml
Salida esperada:
pod/standalone-task created
deployment.apps/managed-worker created
Espere hasta que ambas cargas de trabajo estén listas:
kubectl wait --for=condition=Ready pod/standalone-task --timeout=120s
kubectl wait --for=condition=Available deployment/managed-worker --timeout=120s
Salida esperada:
pod/standalone-task condition met
deployment.apps/managed-worker condition met
Capture el nombre del Pod del Deployment actual, luego elimine el Pod independiente y el Pod propiedad del Deployment:
managed_pod="$(kubectl get pods -l app=managed-worker -o 'jsonpath={.items[0].metadata.name}')"
kubectl delete pod standalone-task "$managed_pod"
La salida esperada incluye:
pod "standalone-task" deleted
pod "managed-worker-..." deleted
Espere a que el Deployment vuelva a estar disponible:
kubectl wait --for=condition=Available deployment/managed-worker --timeout=120s
Salida esperada:
deployment.apps/managed-worker condition met
Enumere los Pods. El Pod independiente debería haber desaparecido, mientras que debería existir un nuevo Pod managed-worker.
kubectl get pods
La salida esperada incluye un Pod managed-worker, pero no standalone-task:
NAME READY STATUS RESTARTS AGE
managed-worker-... 1/1 Running 0 ...
Elegir un Job para tareas de finalización
En este paso, elegirá un Job para el trabajo que debe finalizar con éxito en lugar de ejecutarse indefinidamente.
Un Deployment es adecuado cuando el estado deseado es "mantener esta aplicación en ejecución". Un Job es más adecuado cuando el estado deseado es "ejecutar esta tarea hasta que se complete". Es por esto que las migraciones, el procesamiento por lotes y los comandos de mantenimiento únicos generalmente se asignan a Jobs.
Cree un Job llamado schema-migration:
kubectl create job schema-migration --image=busybox:1.36 -- /bin/sh -c 'echo migration-start; echo migration-complete'
Salida esperada:
job.batch/schema-migration created
Espere hasta que el Job alcance la condición Complete:
kubectl wait --for=condition=Complete job/schema-migration --timeout=120s
Salida esperada:
job.batch/schema-migration condition met
Inspeccione el resumen del Job. COMPLETIONS debería mostrar 1/1, lo que significa que la tarea se ejecutó correctamente una vez.
kubectl get job schema-migration
La salida esperada incluye:
NAME STATUS COMPLETIONS DURATION AGE
schema-migration Complete 1/1 ... ...
Lea los registros (logs) del Job:
kubectl logs job/schema-migration
Salida esperada:
migration-start
migration-complete
Elegir un CronJob para trabajo recurrente
En este paso, elegirá un CronJob para el trabajo que debe ejecutarse según una programación.
Un CronJob es una plantilla de Job programada. Es la elección correcta cuando la tarea debe repetirse más tarde, no solo completarse una vez. Para mantener este laboratorio guiado de forma determinista, creará el CronJob en un estado suspendido. Esto le permite inspeccionar la programación y la plantilla sin esperar a que se cumpla el tiempo programado.
Cree cleanup-cronjob.yaml:
cat > cleanup-cronjob.yaml <<'EOF'
apiVersion: batch/v1
kind: CronJob
metadata:
name: cleanup-schedule
labels:
workload.labex.io/intent: recurring-task
spec:
schedule: "*/5 * * * *"
suspend: true
successfulJobsHistoryLimit: 1
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: cleanup
image: busybox:1.36
command:
- /bin/sh
- -c
- 'echo cleanup-ready'
EOF
Aplique el manifiesto:
kubectl apply -f cleanup-cronjob.yaml
Salida esperada:
cronjob.batch/cleanup-schedule created
Inspeccione el resumen del CronJob. SUSPEND es True porque este laboratorio utiliza la definición del CronJob para aprender la elección del recurso sin esperar a que se ejecuten los Jobs programados.
kubectl get cronjob cleanup-schedule
La salida esperada incluye:
NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
cleanup-schedule */5 * * * * <none> True 0 <none> ...
Lea la programación y la imagen de la plantilla directamente desde el objeto:
kubectl get cronjob cleanup-schedule -o 'jsonpath={.spec.schedule}{" "}{.spec.suspend}{" "}{.spec.jobTemplate.spec.template.spec.containers[0].image}{"\n"}'
Salida esperada:
*/5 * * * * true busybox:1.36
Enumere los recursos de carga de trabajo que creó en este laboratorio. Esta vista conecta el tipo de recurso con el comportamiento previsto: un Deployment para una réplica de larga duración, un Job para la finalización y un CronJob para la recurrencia.
kubectl get deployment,job,cronjob
La salida esperada incluye:
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/managed-worker 1/1 1 1 ...
NAME STATUS COMPLETIONS DURATION AGE
job.batch/schema-migration Complete 1/1 ... ...
NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob.batch/cleanup-schedule */5 * * * * <none> True 0 <none> ...
Resumen
Comparó los recursos de carga de trabajo de Kubernetes según su comportamiento. Un Pod independiente no volvió a aparecer tras ser eliminado, un Deployment recreó su Pod para mantener una réplica disponible, un Job ejecutó una tarea hasta su finalización exitosa y un CronJob almacenó una plantilla de Job recurrente. Estas observaciones le ayudarán a elegir el recurso adecuado antes de escribir un manifiesto al estilo CKAD.


