52 exam sessions, 17 questions each, for a real Kubernetes cluster.
Every exam builds its own environment, grades itself and cleans up after
itself. Two of them (mock-killer-a, mock-killer-b) reproduce the scenarios
of the killer.sh simulator sessions.
./doctor.sh # everything it can check
./doctor.sh mock-killer-a # plus that exam's instancesIt changes nothing, always exits 0, and prints one line per fact: platform and
bash version, which tools are on PATH, whether the docker daemon answers and
what kind it is, the kubectl context and whether the API server replies, which
exam components are installed, which ports are published, and the state of an
exam's instances. The BAD lines are the ones to fix. Paste the whole output
into a bug report - it answers every question worth asking about a broken
setup.
Runs on Linux, macOS and Windows. On Windows use Git Bash or WSL2 -
not cmd or PowerShell; the scripts are bash. macOS is supported with the
/bin/bash Apple ships (3.2) and the BSD userland, so there is nothing to
install from Homebrew. What you do need is Docker (Docker Desktop on macOS and
Windows, the engine on Linux), kubectl, and ssh.
The exams talk to a real cluster and log you into real machines, so three things get installed once:
cd _bootstrap && ./install.sh && ./status.sh && cd .. # cluster components
cd _instances && ./build.sh && cd .. # the ssh instance image
cd _examui && npm install && cd .. # the exam console_bootstrap/install.sh adds an ingress-nginx controller (NodePort 30080),
metrics-server and a local image registry (NodePort 30500) to your
cluster. Without them the Ingress, HPA and image questions are graded on their
YAML alone; with them they are graded by behaviour — a real curl through the
controller, real HPA metrics, a real image pull. ./status.sh shows what your
cluster has.
_instances/build.sh builds ckad-instance:1, the container you land in when
you type ssh ckadXXXX. It carries kubectl, helm, vim, curl, jq and the rest,
mounts only that instance's course/<n> directories, and can not reach the
exam directory — so the solutions stay out of reach, like in the real exam.
NetworkPolicies are the one thing a stock Docker Desktop or kind cluster cannot enforce. Those questions are graded on the manifest and say so in the question text.
_bootstrap/kind-calico.shcreates a separate cluster that does enforce them. See_bootstrap/README.md.
Platform: everything here targets Linux. On a Windows machine run it inside WSL2 (Ubuntu) - install Docker Desktop with the WSL2 integration switched on, and
dockerandkubectlare available inside WSL against the same cluster. The real CKAD exam terminal is Linux too, so practising in a Linux shell is exactly the muscle memory you want.
curl localhost:30080gets nothing? Docker Desktop's Kubernetes is a kind cluster under the hood, and a kind node only publishes the NodePorts it was created with.install.shnotices and starts a small forwarder per port (_bootstrap/portmap.sh), solocalhostworks anyway. If the port it wanted was taken by one of your own Services it takes the next free one and says so — the exams read the port from the cluster, so nothing needs adjusting.
There are two ways to work through an exam. The browser console is the one you want — it looks and behaves like the real Linux Foundation exam UI.
cd _examui
npm run devThen open http://localhost:3000 and pick an exam.
If your cluster needs a specific context, set it before starting:
export KUBECTL="kubectl --context=docker-desktop"
npm run devYou get the question panel on the left, a real terminal on the right, a
120 minute clock, question flagging and a notepad. Each question names an
instance: you type ssh ckadXXXX, solve the task, and type exit — logging
out is what submits it for grading.
The console walks you through everything else: Prepare environment runs the exam's setup, Start exam begins the clock, and the results page shows your score with the full walkthrough.
Full details, keyboard shortcuts and configuration: _examui/README.md.
Every exam also works standalone:
cd exam-01-voyager
./setup.sh # builds the exam environment (1-2 min)
cat questions.md # solve the 17 questions with kubectl
./verify.sh # automatic grading, 66% = pass
./cleanup.sh # remove every namespace and object of this examsolutions.md has a full walkthrough per question; solve.sh applies the
complete reference solution if you want to see a finished environment.
- a Kubernetes cluster and
kubectl(kind, minikube, k3s, Docker Desktop …) - Node 20+ for the browser console
- a bash — Linux and macOS have one; on Windows the console finds Git Bash
(
C:\Program Files\Git\bin\bash.exe) or falls back to WSL - Docker, for the instance containers you ssh into — without it the console
falls back to a local shell per instance and warns you, and on Windows/macOS
the exam directory is then only a
cd ..away - an ssh client — Windows 10+, macOS and Linux all ship one
helmon the PATH for the Helm questions- strongly recommended:
_bootstrap/install.sh— it installs a real ingress-nginx (NodePort 30080), metrics-server and an image registry (NodePort 30500) into your cluster, which is what makes the Ingress, HPA and image questions gradable by behaviour instead of only by their YAML._bootstrap/status.shshows what your cluster supports;_bootstrap/README.mdexplains what each component changes, including the one thing that cannot be retrofitted (NetworkPolicy enforcement — see_bootstrap/kind-calico.sh). Without it every question is still graded, structurally, andverify.shmarks the behavioural checks asskipped.
- Run one exam at a time. Different exams reuse the same namespace names.
- File paths in the questions are relative to the exam directory, e.g.
./course/3/job.yaml.setup.shcreates that tree. - Namespaces are named after bodies of the solar system.
- 120 minutes, pass mark 66% — like the real exam.
- Secrets & Environment Variables — 69 questions across all exams
- Ingress — 60 questions across all exams
- NetworkPolicy — 54 questions across all exams
- Resource Requests & Limits — 60 questions across all exams
- Docker Image Tasks — 61 questions across all exams
- Canary Deployments — 56 questions across all exams
- Service Selectors — 64 questions across all exams
- CronJobs — 58 questions across all exams
- SecurityContext — 64 questions across all exams
- RBAC — 58 questions across all exams
- Deployment Rollbacks — 52 questions across all exams
- Deprecated API Fixes — 52 questions across all exams
- Probes — 22 questions across all exams
- Storage, PV & PVC — 17 questions across all exams
- Sidecar & Init Containers — 13 questions across all exams
- Jobs — 14 questions across all exams
- Labels & Annotations — 18 questions across all exams
- Pods & kubectl Basics — 16 questions across all exams
- Helm — 20 questions across all exams
- Kustomize — 19 questions across all exams
- HorizontalPodAutoscaler — 13 questions across all exams
| # | Directory | Question topics |
|---|---|---|
| 01 | exam-01-voyager |
Resource Requests & Limits, Docker Image Tasks, RBAC, CronJobs, Ingress, SecurityContext ... |
| 02 | exam-02-apollo |
Resource Requests & Limits, SecurityContext, Secrets & Environment Variables, Service Selectors, Ingress, Deprecated API Fixes ... |
| 03 | exam-03-cassini |
Service Selectors, SecurityContext, Deprecated API Fixes, NetworkPolicy, Secrets & Environment Variables, Canary Deployments ... |
| 04 | exam-04-galileo |
SecurityContext, Secrets & Environment Variables, Service Selectors, CronJobs, Deprecated API Fixes, Docker Image Tasks ... |
| 05 | exam-05-juno |
Deprecated API Fixes, CronJobs, Ingress, NetworkPolicy, Deployment Rollbacks, RBAC ... |
| 06 | exam-06-viking |
NetworkPolicy, RBAC, CronJobs, Deployment Rollbacks, Service Selectors, Resource Requests & Limits ... |
| 07 | exam-07-pioneer |
Service Selectors, Deprecated API Fixes, Secrets & Environment Variables, Resource Requests & Limits, RBAC, CronJobs ... |
| 08 | exam-08-magellan |
Secrets & Environment Variables, CronJobs, Canary Deployments, SecurityContext, Ingress, Service Selectors ... |
| 09 | exam-09-curiosity |
RBAC, NetworkPolicy, Docker Image Tasks, Resource Requests & Limits, Deployment Rollbacks, SecurityContext ... |
| 10 | exam-10-perseverance |
Ingress, Deployment Rollbacks, Secrets & Environment Variables, RBAC, CronJobs, Resource Requests & Limits ... |
| 11 | exam-11-opportunity |
Secrets & Environment Variables, Ingress, CronJobs, Resource Requests & Limits, Docker Image Tasks, Service Selectors ... |
| 12 | exam-12-spirit |
Secrets & Environment Variables, Docker Image Tasks, RBAC, Resource Requests & Limits, Deployment Rollbacks, Ingress ... |
| 13 | exam-13-hubble |
Docker Image Tasks, Canary Deployments, CronJobs, Deployment Rollbacks, Secrets & Environment Variables, Service Selectors ... |
| 14 | exam-14-kepler |
SecurityContext, Service Selectors, Ingress, Canary Deployments, Secrets & Environment Variables, NetworkPolicy ... |
| 15 | exam-15-artemis |
Canary Deployments, Resource Requests & Limits, Service Selectors, RBAC, Deprecated API Fixes, Secrets & Environment Variables ... |
| 16 | exam-16-orion |
Docker Image Tasks, Service Selectors, Secrets & Environment Variables, Deprecated API Fixes, RBAC, Canary Deployments ... |
| 17 | exam-17-soyuz |
Canary Deployments, Ingress, CronJobs, NetworkPolicy, Deployment Rollbacks, Docker Image Tasks ... |
| 18 | exam-18-dragon |
NetworkPolicy, Secrets & Environment Variables, SecurityContext, Deployment Rollbacks, Canary Deployments, Deprecated API Fixes ... |
| 19 | exam-19-ariane |
Deployment Rollbacks, Canary Deployments, SecurityContext, Deprecated API Fixes, Resource Requests & Limits, Secrets & Environment Variables ... |
| 20 | exam-20-rosetta |
RBAC, SecurityContext, CronJobs, Deployment Rollbacks, Ingress, Service Selectors ... |
| 21 | exam-21-philae |
RBAC, SecurityContext, Secrets & Environment Variables, Ingress, NetworkPolicy, Canary Deployments ... |
| 22 | exam-22-horizons |
NetworkPolicy, Resource Requests & Limits, Service Selectors, Secrets & Environment Variables, SecurityContext, Canary Deployments ... |
| 23 | exam-23-dawn |
Resource Requests & Limits, Secrets & Environment Variables, Deployment Rollbacks, NetworkPolicy, Deprecated API Fixes, Ingress ... |
| 24 | exam-24-messenger |
Service Selectors, SecurityContext, Docker Image Tasks, RBAC, Deprecated API Fixes, NetworkPolicy ... |
| 25 | exam-25-ulysses |
Ingress, Docker Image Tasks, Service Selectors, RBAC, Resource Requests & Limits, Canary Deployments ... |
| 26 | exam-26-huygens |
NetworkPolicy, Docker Image Tasks, Deployment Rollbacks, Ingress, SecurityContext, Secrets & Environment Variables ... |
| 27 | exam-27-sputnik |
CronJobs, Docker Image Tasks, Service Selectors, Resource Requests & Limits, NetworkPolicy, Secrets & Environment Variables ... |
| 28 | exam-28-clementine |
Canary Deployments, Docker Image Tasks, Resource Requests & Limits, NetworkPolicy, Deployment Rollbacks, SecurityContext ... |
| 29 | exam-29-chandrayaan |
CronJobs, Service Selectors, Docker Image Tasks, Secrets & Environment Variables, SecurityContext, Ingress ... |
| 30 | exam-30-akatsuki |
Resource Requests & Limits, Service Selectors, Docker Image Tasks, Ingress, Deprecated API Fixes, NetworkPolicy ... |
| 31 | exam-31-gaia |
Pods & kubectl Basics, Deployment Rollbacks, Service Selectors, Labels & Annotations, HorizontalPodAutoscaler, Probes ... |
| 32 | exam-32-juice |
Labels & Annotations, HorizontalPodAutoscaler, CronJobs, Helm, SecurityContext, Service Selectors ... |
| 33 | exam-33-lucy |
SecurityContext, HorizontalPodAutoscaler, Canary Deployments, Sidecar & Init Containers, Resource Requests & Limits, Pods & kubectl Basics ... |
| 34 | exam-34-psyche |
Probes, Labels & Annotations, Storage, PV & PVC, HorizontalPodAutoscaler, Canary Deployments, NetworkPolicy ... |
| 35 | exam-35-europa-clipper |
Deprecated API Fixes, SecurityContext, Probes, Kustomize, RBAC, HorizontalPodAutoscaler ... |
| 36 | exam-36-dart |
Service Selectors, CronJobs, RBAC, Resource Requests & Limits, Sidecar & Init Containers, Canary Deployments ... |
| 37 | exam-37-osiris |
SecurityContext, Secrets & Environment Variables, Storage, PV & PVC, Probes, RBAC, Service Selectors ... |
| 38 | exam-38-hayabusa |
Deployment Rollbacks, Secrets & Environment Variables, Resource Requests & Limits, SecurityContext, Canary Deployments, NetworkPolicy ... |
| 39 | exam-39-chang-e |
Pods & kubectl Basics, HorizontalPodAutoscaler, RBAC, CronJobs, Docker Image Tasks, Jobs ... |
| 40 | exam-40-tianwen |
Helm, Resource Requests & Limits, Labels & Annotations, Secrets & Environment Variables, Deployment Rollbacks, Storage, PV & PVC ... |
| 41 | exam-41-solar-orbiter |
Jobs, CronJobs, Pods & kubectl Basics, Deprecated API Fixes, Ingress, Canary Deployments ... |
| 42 | exam-42-parker |
RBAC, Storage, PV & PVC, Secrets & Environment Variables, Deployment Rollbacks, Resource Requests & Limits, SecurityContext ... |
| 43 | exam-43-webb |
Jobs, Sidecar & Init Containers, Canary Deployments, Docker Image Tasks, Probes, Kustomize ... |
| 44 | exam-44-euclid |
Helm, Canary Deployments, Service Selectors, Storage, PV & PVC, Labels & Annotations, Secrets & Environment Variables ... |
| 45 | exam-45-cheops |
Sidecar & Init Containers, HorizontalPodAutoscaler, Pods & kubectl Basics, Jobs, NetworkPolicy, Deprecated API Fixes ... |
| 46 | exam-46-plato |
Service Selectors, SecurityContext, Deployment Rollbacks, Storage, PV & PVC, Ingress, HorizontalPodAutoscaler ... |
| 47 | exam-47-ariel-esa |
Ingress, Labels & Annotations, Resource Requests & Limits, CronJobs, Deprecated API Fixes, SecurityContext ... |
| 48 | exam-48-dragonfly |
Secrets & Environment Variables, Labels & Annotations, Deployment Rollbacks, Canary Deployments, Helm, Kustomize ... |
| 49 | exam-49-vera |
Kustomize, Jobs, Resource Requests & Limits, Pods & kubectl Basics, Docker Image Tasks, RBAC ... |
| 50 | exam-50-nancy |
Resource Requests & Limits, RBAC, Probes, SecurityContext, Secrets & Environment Variables, Jobs ... |
| -- | mock-killer-a |
fixed simulator reproduction |
| -- | mock-killer-b |
fixed simulator reproduction |
_generator/ holds the generator that produced all of this. A different seed
reshuffles every exam out of the same question bank:
cd _generator && python3 -m ckadgen.build ../out