The CKS exam, and how it differs from CKA and CKAD
What you are walking into
| fact | value |
|---|---|
| domains | Cluster Setup 15 %, Cluster Hardening 15 %, System Hardening 10 %, Minimize Microservice Vulnerabilities 20 %, Supply Chain Security 20 %, Monitoring/Logging/Runtime Security 20 % |
| Kubernetes | v1.35 (CKS trails CKA/CKAD by two minors) |
| format | 15–20 performance tasks, 2 hours, proctored |
| pass mark | 67 % |
| prerequisite | CKA, passed first |
| retake | one included |
Two numbers matter for planning: 2 hours for 15–20 tasks is **6–8 minutes per
task**, and every task is scored by a script that reads the API or a file — not
by whether your solution "looks right".
Weights changed in 2025. Most blog posts and older repos still print Cluster Setup 10 % / System Hardening 15 %. That is the pre-v1.31 split. The Linux Foundation page and the current curriculum PDF both say 15 / 10. You can verify this yourself in
cncf/curriculumby diffing the v1.29 and v1.31 PDFs.
What is allowed during the exam
Only what is inside the exam VM. In practice:
kubernetes.io/docs(in-page search works, external search results do not),kubernetes.io/blogfalco.org/docs— allow-listed on purposedocs.cilium.io,istio.io/latest/docs— also allow-listed, which tells you Pod-to-Pod encryption is a real task, not theorykubernetes-sigs.github.io/bom/cli-reference— SBOMetcd.io/docs, the ingress-nginx docs, the per-task "Quick Reference" boxmanpages,/usr/share/doc, whatever is installed locally
Each task names a host. You ssh <node> from base; **nested ssh does not
work**, so pick the right host the first time. base has none of the tools —kubectl and k exist on the SSH hosts. Never reboot base.
The six things that actually cost marks
- Time. People finish with two minutes left. Practise against a clock, and practise marking a question and moving on — a task you sank 12 minutes into is worth the same as the easy one you never reached.
- The wrong node. A task asks you to harden a kubelet. That is a worker node, as root, editing
/var/lib/kubelet/config.yaml. Doing it oncontrolplanescores zero. Read the "you are on host X" line every time. - Memorised YAML. A slightly different selector, a different audit level, a different port and your muscle memory is wrong. Learn the shape, then read the task.
- Not verifying. Every task in this site has a check. Make it a habit: after each task, run the one command that proves it worked.
- Not restarting what you broke. Audit logging, admission plugins and kubelet flags need the component restarted — and if you break the API server static pod manifest, you must fix it from the node, not through
kubectl. - AppArmor and seccomp are node-level. You cannot load a profile through the API. You need a shell on the node,
apparmor_parser, and a file that containerd can actually see.
The shape of a good answer
# 1. look first — never write a file you have not read
kubectl get netpol -n prod -o yaml | head -40
# 2. make the smallest change that satisfies the wording
kubectl apply -f /tmp/answer.yaml
# 3. prove it
kubectl get netpol -n prod -o custom-columns=NAME:.metadata.name,PODS:.spec.podSelector
Study plan that fits around a job
Two weeks at 90 minutes a day is enough if you already hold CKA:
- days 1–3: NetworkPolicy, Ingress+TLS, RBAC/service accounts (mostly revision)
- days 4–6: kube-bench remediation, AppArmor, seccomp, securityContext
- days 7–9: audit policy + static pod surgery, Falco rules, immutability
- days 10–12: image scanning, SBOM, signing, admission control, Gatekeeper
- days 13–14: two mock papers, timed, then redo every task you got wrong
Then sit killer.sh if you have it: 70–80 % there under time is the usual
readiness bar.