Introduction
Les tâches de l'examen CKAD exigent souvent que vous choisissiez la ressource de charge de travail Kubernetes appropriée avant de rédiger un manifeste. Un Pod est la plus petite unité exécutable, un Deployment maintient la disponibilité des réplicas d'une application longue durée, un Job exécute une tâche jusqu'à son achèvement, et un CronJob stocke un modèle de Job planifié.
Dans ce laboratoire, vous comparerez ces ressources par le biais de comportements observables plutôt que par la mémorisation de définitions. Vous constaterez qu'un Pod autonome ne revient pas après suppression, qu'un Deployment recrée son Pod, qu'un Job se termine après avoir enregistré son succès, et qu'un CronJob conserve les informations de planification pour des tâches récurrentes.
Préparer un espace de noms pour la comparaison des charges de travail
Dans cette étape, vous allez préparer un espace de noms (namespace) propre pour comparer les ressources de charge de travail.
Commencez dans /home/labex/project. Vous créerez de petits manifestes dans ce répertoire au fur et à mesure que vous comparerez les comportements des charges de travail.
mkdir -p /home/labex/project
cd /home/labex/project
Vérifiez que le serveur API Kubernetes est accessible. Si la machine virtuelle vient de démarrer et que le nœud n'est pas encore prêt, attendez quelques secondes et relancez la commande.
kubectl get nodes --request-timeout=5s
La sortie attendue inclut :
NAME STATUS ROLES AGE VERSION
labex-v135 Ready control-plane ... v1.35...
Les charges de travail créent des Pods, attendez donc que le Pod réseau du cluster soit prêt (Ready).
kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s
Sortie attendue :
pod/calico-node-... condition met
Créez un espace de noms nommé ckad-prep-workloads :
kubectl create namespace ckad-prep-workloads
Définissez cet espace de noms comme contexte actuel :
kubectl config set-context --current --namespace=ckad-prep-workloads
Confirmez l'espace de noms actuel :
kubectl config view --minify --output 'jsonpath={..namespace}'; echo
Sortie attendue :
ckad-prep-workloads
Comparer un Pod avec un Deployment
Dans cette étape, vous allez comparer un Pod autonome avec un Deployment en supprimant les deux Pods et en observant la réaction de Kubernetes.
Un Pod autonome est utile lorsque vous avez besoin d'une unité d'exécution gérée directement pour une tâche très simple ou une inspection. Un Deployment est préférable pour une application longue durée, car il possède un ReplicaSet, et ce dernier maintient le nombre de Pods requis en cours d'exécution.
Créez un manifeste de Pod autonome. Le conteneur est en veille (sleep) afin que le Pod reste actif assez longtemps pour être observé. Le champ terminationGracePeriodSeconds: 0 permet de garder ce laboratoire rapide lorsque vous supprimerez le Pod plus tard.
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
Créez un manifeste de Deployment. Ce Deployment demande à Kubernetes de maintenir un Pod managed-worker en cours d'exécution, et son modèle de Pod utilise le même paramètre de terminaison rapide.
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
Appliquez les deux manifestes :
kubectl apply -f standalone-pod.yaml
kubectl apply -f managed-deployment.yaml
Sortie attendue :
pod/standalone-task created
deployment.apps/managed-worker created
Attendez que les deux charges de travail soient prêtes :
kubectl wait --for=condition=Ready pod/standalone-task --timeout=120s
kubectl wait --for=condition=Available deployment/managed-worker --timeout=120s
Sortie attendue :
pod/standalone-task condition met
deployment.apps/managed-worker condition met
Capturez le nom du Pod du Deployment actuel, puis supprimez le Pod autonome et le Pod appartenant au Deployment :
managed_pod="$(kubectl get pods -l app=managed-worker -o 'jsonpath={.items[0].metadata.name}')"
kubectl delete pod standalone-task "$managed_pod"
La sortie attendue inclut :
pod "standalone-task" deleted
pod "managed-worker-..." deleted
Attendez que le Deployment redevienne disponible :
kubectl wait --for=condition=Available deployment/managed-worker --timeout=120s
Sortie attendue :
deployment.apps/managed-worker condition met
Listez les Pods. Le Pod autonome doit avoir disparu, tandis qu'un nouveau Pod managed-worker doit exister.
kubectl get pods
La sortie attendue inclut un Pod managed-worker, mais pas standalone-task :
NAME READY STATUS RESTARTS AGE
managed-worker-... 1/1 Running 0 ...
Choisir un Job pour une tâche à accomplir
Dans cette étape, vous choisirez un Job pour une tâche qui doit se terminer avec succès au lieu de s'exécuter indéfiniment.
Un Deployment est approprié lorsque l'état souhaité est « maintenir cette application en cours d'exécution ». Un Job est préférable lorsque l'état souhaité est « exécuter cette tâche jusqu'à son achèvement ». C'est pourquoi les migrations, le traitement par lots et les commandes de maintenance ponctuelles correspondent généralement à des Jobs.
Créez un Job nommé schema-migration :
kubectl create job schema-migration --image=busybox:1.36 -- /bin/sh -c 'echo migration-start; echo migration-complete'
Sortie attendue :
job.batch/schema-migration created
Attendez que le Job atteigne la condition Complete :
kubectl wait --for=condition=Complete job/schema-migration --timeout=120s
Sortie attendue :
job.batch/schema-migration condition met
Inspectez le résumé du Job. COMPLETIONS doit afficher 1/1, ce qui signifie que la tâche s'est exécutée avec succès une fois.
kubectl get job schema-migration
La sortie attendue inclut :
NAME STATUS COMPLETIONS DURATION AGE
schema-migration Complete 1/1 ... ...
Lisez les journaux (logs) du Job :
kubectl logs job/schema-migration
Sortie attendue :
migration-start
migration-complete
Choisir un CronJob pour une tâche récurrente
Dans cette étape, vous choisirez un CronJob pour une tâche qui doit s'exécuter selon un calendrier.
Un CronJob est un modèle de Job planifié. C'est le bon choix lorsque la tâche doit se répéter ultérieurement, et non pas simplement s'exécuter une fois. Pour que ce laboratoire guidé reste déterministe, vous créerez le CronJob dans un état suspendu. Cela vous permet d'inspecter le calendrier et le modèle sans attendre une limite temporelle.
Créez 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
Appliquez le manifeste :
kubectl apply -f cleanup-cronjob.yaml
Sortie attendue :
cronjob.batch/cleanup-schedule created
Inspectez le résumé du CronJob. SUSPEND est True car ce laboratoire utilise la définition du CronJob pour apprendre le choix de la ressource sans attendre les Jobs planifiés.
kubectl get cronjob cleanup-schedule
La sortie attendue inclut :
NAME SCHEDULE TIMEZONE SUSPEND ACTIVE LAST SCHEDULE AGE
cleanup-schedule */5 * * * * <none> True 0 <none> ...
Lisez le calendrier et l'image du modèle directement depuis l'objet :
kubectl get cronjob cleanup-schedule -o 'jsonpath={.spec.schedule}{" "}{.spec.suspend}{" "}{.spec.jobTemplate.spec.template.spec.containers[0].image}{"\n"}'
Sortie attendue :
*/5 * * * * true busybox:1.36
Listez les ressources de charge de travail que vous avez créées dans ce laboratoire. Cette vue relie le type de ressource au comportement attendu : un Deployment pour un réplica longue durée, un Job pour un achèvement, et un CronJob pour une récurrence.
kubectl get deployment,job,cronjob
La sortie attendue inclut :
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> ...
Résumé
Vous avez comparé les ressources de charge de travail Kubernetes en fonction de leur comportement. Un Pod autonome n'est pas revenu après suppression, un Deployment a recréé son Pod pour maintenir un réplica disponible, un Job a exécuté une tâche jusqu'à son succès, et un CronJob a stocké un modèle de Job récurrent. Ces observations vous aident à choisir la ressource appropriée avant de rédiger un manifeste de type CKAD.


