4.1 KiB
Assignment
The Nautilus DevOps team is crafting jobs in the Kubernetes cluster. While they're developing actual scripts/commands, they're currently setting up templates and testing jobs with dummy commands. Please create a job template as per details given below:
Create a job named countdown-datacenter.
The spec template should be named countdown-datacenter (under metadata), and the container should be named container-countdown-datacenter
Utilize image ubuntu with latest tag (ensure to specify as ubuntu:latest), and set the restart policy to Never.
Execute the command sleep 5
Note: The kubectl utility on the jump-host has been configured to work with the Kubernetes cluster.
Solution
Kubernetes Job — countdown-datacenter
A one-shot Job that runs sleep 5 in an ubuntu:latest container. Applied inline via a
heredoc — no manifest file on disk.
Apply (heredoc → kubectl)
kubectl apply -f - <<'EOF'
apiVersion: batch/v1
kind: Job
metadata:
name: countdown-datacenter
spec:
template:
metadata:
name: countdown-datacenter
spec:
containers:
- name: container-countdown-datacenter
image: ubuntu:latest
command:
- sleep
- "5"
restartPolicy: Never
EOF
How it works
The heredoc apply pattern
kubectl apply -f -reads from stdin; the heredoc feeds the YAML in, nothing on disk.<<'EOF'(delimiter quoted) disables shell expansion, keeping the manifest literal — the right default for Kubernetes YAML.
Job vs. CronJob
A Job runs a pod to completion once (or a set number of times), unlike a CronJob
which spawns Jobs on a schedule. So there's no schedule or jobTemplate here — the pod
template sits directly under spec.template, one level shallower than a CronJob.
Field by field
apiVersion: batch/v1/kind: Job— Job is abatch/v1object.metadata.name: countdown-datacenter— the Job's name, exactly as required.spec.template.metadata.name: countdown-datacenter— the pod template name, as the task explicitly requests. (Note: a template name is optional and normally ignored for Jobs — the actual pod gets an auto-generated name likecountdown-datacenter-abcde— but the task asks for it, so it's set.)spec.template.spec.containers— one container:name: container-countdown-datacenter— the container name, exactly as required.image: ubuntu:latest— tag stated explicitly, as required.command: ["sleep", "5"]— the dummy command. The"5"is quoted so YAML passes it as a string argument; command args must be strings, and an unquoted5would be parsed as an integer and rejected.
restartPolicy: Never— required. It sits at the pod level (insidetemplate.spec), not on the container. Jobs accept onlyNeverorOnFailure(Alwaysis invalid for batch workloads).Nevermeans if the pod fails, the Job creates a new pod rather than restarting the existing one.
restartPolicy: Never vs. OnFailure for Jobs
Both are valid for Jobs, and they differ in failure handling:
Never— a failed pod is left as-is; the Job spins up a fresh pod for the next attempt. You end up with visible failed pods (useful for debugging).OnFailure— the same pod's container is restarted in place.
The task specifies Never, so failed attempts (if any) appear as separate pods.
Verify
# Job created and completing
kubectl get job countdown-datacenter
# Pod runs then completes
kubectl get pods -l job-name=countdown-datacenter
# Confirm image and command
kubectl get job countdown-datacenter \
-o jsonpath='{.spec.template.spec.containers[0].image}{" "}{.spec.template.spec.containers[0].command}{"\n"}'
Expected — countdown-datacenter showing COMPLETIONS 1/1 after ~5 seconds, its pod
transitioning Running → Completed, and the jsonpath printing ubuntu:latest [sleep 5].
The pod runs
sleep 5then exits 0, so the Job completes cleanly. If it showsError, checkkubectl logs job/countdown-datacenter.