Every Exam PrepFREE EXAM PREP
Ask AI
CHEAT SHEET · CKA

CKA Cheat Sheet.

Review the key concepts, then download the PDF for offline study.

Download the PDF
Weighted to the current exam outline·15-minute scanVerified against the official content outline
Written by Every Exam Prep Editorial TeamSource and review policyPublished July 18, 2026Updated August 16, 2026
Drill weak spots →
01

Quick facts

the numbers to know before exam day
2h m
Time limit
66%
Passing score
$445
Exam fee
Cloud Native Computing Foundation
Governing body
02

Full write-up

the complete guide, in prose

The CKA is two hours in a live cluster with no multiple choice — you either produce the object or you don't. Everything below is the working set: the aliases that buy you time, the imperative one-liners that write YAML for you, and the diagnostic sequences for the 30% of the exam that is troubleshooting.

Exam at a glance

ItemDetail
Administered byCNCF / The Linux Foundation
FormatOnline, proctored, performance-based tasks in a live cluster
Time limit2 hours
Passing score66%
Cost$445, includes a second attempt (one free retake)
Scheduling window12 months from purchase
Certification validity2 years
Cluster version testedKubernetes v1.35
Included simulatorKiller.sh — 2 attempts, 36 hours each

Domain weights

DomainWeightWhat it actually means
Troubleshooting30%Broken nodes, pods, DNS, control plane
Cluster Architecture, Installation & Configuration25%kubeadm, etcd, RBAC, upgrades
Services & Networking20%Services, Ingress, Gateway API, NetworkPolicy
Workloads & Scheduling15%Deployments, rollouts, affinity, taints
Storage10%PV, PVC, StorageClass

Terminal setup: spend the first 60 seconds here

Type this before you touch a task. It pays for itself by question three.

source <(kubectl completion bash)
alias k=kubectl
complete -o default -F __start_kubectl k
export do="--dry-run=client -o yaml"
export now="--force --grace-period=0"
ShortcutExpands toUse
kkubectlSaves ~6 keystrokes per command
$do--dry-run=client -o yamlk run nginx --image=nginx $do > pod.yaml
$now--force --grace-period=0k delete pod nginx $now — no 30s wait
Namespace pink config set-context --current --namespace=<ns>Stops -n mistakes
Context switchk config use-context <ctx>Run the line given in every question
Vim:set et ts=2 sw=2YAML indentation survives

Imperative commands that write your YAML

The core technique: never hand-write a manifest. Generate a skeleton with $do, redirect to a file, edit the two fields the question actually asks for, then k apply -f.

ObjectCommand
Podk run nginx --image=nginx --port=80 --labels=app=web $do > pod.yaml
Pod with a commandk run busybox --image=busybox --command $do -- sleep 3600
Throwaway shellk run tmp -it --rm --restart=Never --image=busybox -- sh
Deploymentk create deployment web --image=nginx --replicas=3 --port=80 $do
Jobk create job pi --image=busybox -- echo done · --from=cronjob/report
CronJobk create cronjob hello --image=busybox --schedule="*/1 * * * *" -- echo hi
Servicek expose deployment web --port=80 --target-port=8080 --type=NodePort --name=web-svc
Ingressk create ingress web --class=nginx --rule="foo.com/bar*=web-svc:80,tls=my-cert"
ConfigMapk create cm app-cfg --from-literal=KEY=val --from-file=./app.conf
Secretk create secret generic db --from-literal=pass=s3cr3t · tls · docker-registry
Namespace / SAk create ns dev · k create sa builder
Scale / imagek scale deployment web --replicas=5 · k set image deployment/web nginx=nginx:1.27
Rolloutk rollout status|history|undo deployment/web · --to-revision=2
Edit livek edit deploy web · k patch svc web -p '{"spec":{"type":"NodePort"}}'

Reading the cluster fast

NeedCommand
Field names you forgotk explain pod.spec.tolerations --recursive
Sort by restartsk get pods --sort-by='.status.containerStatuses[0].restartCount'
Events in time orderk get events -A --sort-by=.metadata.creationTimestamp
Resource usagek top nodes · k top pods --sort-by=cpu

Troubleshooting — 30% of the exam

Work the same ladder every time: get for state, describe for events, logs for the application, journalctl for the node.

Node NotReady

StepCommandLooking for
1k get nodes -o wide · k describe node <node>Conditions: MemoryPressure, DiskPressure, PIDPressure; taints
2ssh <node>; systemctl status kubeletService dead or crash-looping
3journalctl -u kubelet -f · journalctl -xeu kubeletBad config path, bad cert, runtime down
4systemctl status containerd · crictl psRuntime socket unavailable
5systemctl daemon-reload && systemctl restart kubeletAfter fixing /var/lib/kubelet/config.yaml

Pod stuck in Pending

  • k describe pod <pod> — read the Events block first; the scheduler writes the reason there.
  • insufficient cpu → lower resources.requests or free capacity.
  • had untolerated taint → add a toleration, or k taint nodes <node> key=value:NoSchedule-.
  • didn't match Pod's node affinity/selector → fix nodeSelector, or k label node <node> disk=ssd.
  • unbound immediate PersistentVolumeClaims → no matching PV; check k get pvc,pv,sc.
  • No events at all → scheduler is down: k get pods -n kube-system.

CrashLoopBackOff

CommandPurpose
k logs <pod> --previousLogs from the container that just died — the most useful flag on the exam
k logs <pod> -c <container>Multi-container pods and initContainers
k describe pod <pod>Last State: Terminated, Exit Code, OOMKilled
k get pod <pod> -o yamlBad command/args, missing env, failing probes
k debug <pod> -it --image=busybox --target=<c>Ephemeral container in a pod with no shell

ImagePullBackOff / ErrImagePull

  • k describe pod <pod> → Events name the exact failure: typo, tag not found, or 401 Unauthorized.
  • Auth failure → create a docker-registry secret, then add spec.imagePullSecrets.
  • Air-gapped node → verify with crictl pull <image> and crictl images.

Service not resolving or not routing

StepCommandFailure it isolates
1k get svc <svc> -o yamlWrong port/targetPort, wrong type
2k get endpointslices -l kubernetes.io/service-name=<svc>Empty = selector matches no ready pod
3k get pods -l <selector> --show-labelsLabel mismatch between Service and Pods
4k run tmp -it --rm --restart=Never --image=busybox -- nslookup <svc>.<ns>.svc.cluster.localDNS resolution
5k get pods -n kube-system -l k8s-app=kube-dns · k logs -n kube-system <coredns-pod>CoreDNS down or misconfigured
6k get daemonset -n kube-system kube-proxykube-proxy not running on the node
7wget -qO- <clusterIP>:<port> from a podIP works, name doesn't → DNS; neither → NetworkPolicy or CNI

Control plane down

Control-plane components are static pods. If kubectl itself fails, go to the node.

  • crictl ps -a then crictl logs <container-id> — the only way to read a kube-apiserver that won't start.
  • Manifests: /etc/kubernetes/manifests/kube-apiserver.yaml, kube-controller-manager.yaml, kube-scheduler.yaml, etcd.yaml.
  • Edit the file and the kubelet restarts the pod — no apply. Never keep backups in that directory.
  • Mirror pod name is <pod>-<node>; path set by staticPodPath in /var/lib/kubelet/config.yaml.
  • Certs: kubeadm certs check-expiration · kubeadm certs renew all (/etc/kubernetes/pki).

kubeadm cluster lifecycle

TaskCommand
Init control planekubeadm init --pod-network-cidr=<cidr> --apiserver-advertise-address=<ip>
Set up kubeconfigmkdir -p ~/.kube && cp -i /etc/kubernetes/admin.conf ~/.kube/config
Recover a join commandkubeadm token create --print-join-command · kubeadm token list (--ttl 24h0m0s)
Join a workerkubeadm join <endpoint> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
Recompute the CA hashopenssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
Join a control planeadd --control-plane --certificate-key <key>
Reset a nodekubeadm reset

Upgrade order — control plane first, one node at a time

#Control plane nodeWorker node
1apt-mark unhold kubeadm && apt-get install -y kubeadm='1.35.x-*' && apt-mark hold kubeadmsame
2kubeadm upgrade plan
3kubeadm upgrade apply v1.35.x (first CP only; others use kubeadm upgrade node)kubeadm upgrade node
4kubectl drain <node> --ignore-daemonsetssame (add --delete-emptydir-data if needed)
5apt-mark unhold kubelet kubectl && apt-get install -y kubelet='1.35.x-*' kubectl='1.35.x-*' && apt-mark hold kubelet kubectlsame
6systemctl daemon-reload && systemctl restart kubeletsame
7kubectl uncordon <node>same

Do not forget step 7. A node left cordoned is the most common silent point loss on upgrade tasks.

etcd backup and restore

The cert flags are mandatory, and always the same three files under /etc/kubernetes/pki/etcd/.

ETCDCTL_API=3 etcdctl --endpoints=127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  snapshot save /opt/snapshot.db
TaskCommand
Verify a snapshotsame flags + snapshot status /opt/snapshot.db
RestoreETCDCTL_API=3 etcdctl snapshot restore /opt/snapshot.db --data-dir /var/lib/etcd-restore (or etcdutl snapshot restore)
Point etcd at restored dataEdit the etcd-data volume hostPath in /etc/kubernetes/manifests/etcd.yaml; kubelet restarts the pod
Find the real endpoint/certsk describe pod etcd-<node> -n kube-system

Scheduling controls

MechanismSyntaxBehaviour
Add taintk taint nodes node1 key1=value1:NoScheduleRepels pods without a matching toleration
Remove taintk taint nodes node1 key1=value1:NoSchedule-Trailing - removes
NoScheduleeffectBlocks new pods; running pods stay
PreferNoScheduleeffectSoft preference only
NoExecuteeffectEvicts non-tolerating pods immediately; tolerationSeconds delays eviction
Tolerationkey, operator: Equal|Exists, value, effect, tolerationSecondsExists with no key tolerates everything
Built-in taintsnode.kubernetes.io/ + not-ready, unreachable, memory-pressure, disk-pressure, pid-pressure, unschedulable, network-unavailableAdded by the node controller
nodeSelectorspec.nodeSelector: {disk: ssd}Hard, exact-match only
Node affinity (hard)requiredDuringSchedulingIgnoredDuringExecutionPod stays Pending if unmatched
Node affinity (soft)preferredDuringSchedulingIgnoredDuringExecution + weightTries, then places anywhere
Affinity operatorsIn, NotIn, Exists, DoesNotExist, Gt, LtSuperset of nodeSelector

RBAC

TaskCommand
Namespaced Rolek create role pod-reader --verb=get,list,watch --resource=pods -n dev
ClusterRolek create clusterrole node-reader --verb=get,list,watch --resource=nodes
Restrict to one objectadd --resource-name=my-pod
Bind to a userk create rolebinding rb --role=pod-reader --user=jane -n dev
Bind to a ServiceAccountk create rolebinding rb --role=pod-reader --serviceaccount=dev:builder -n dev
Cluster-wide bindingk create clusterrolebinding crb --clusterrole=node-reader --group=managers
ClusterRole in one namespacek create rolebinding rb --clusterrole=view --serviceaccount=dev:builder -n dev
Test itk auth can-i list secrets --as=jane -n dev · --as=system:serviceaccount:dev:builder

Built-in ClusterRoles: view (read-only, no Secrets, no RBAC objects), edit (read/write workloads and Secrets, no RBAC objects), admin (namespace admin including Roles/RoleBindings), cluster-admin (everything).

Storage

FieldValues
accessModesReadWriteOnce (RWO), ReadOnlyMany (ROX), ReadWriteMany (RWX), ReadWriteOncePod (RWOP)
persistentVolumeReclaimPolicyRetain, Delete (default for dynamic), Recycle (deprecated)
PV phasesAvailableBoundReleased / Failed
volumeBindingMode (SC)Immediate, WaitForFirstConsumer
allowVolumeExpansion (SC)true — required before you can grow a PVC
BindingA PVC binds only if capacity, accessModes and storageClassName all match; diagnose with k describe pvc

Services and networking quick reference

TypeReachNote
ClusterIPIn-cluster onlyDefault
NodePort<nodeIP>:<30000-32767>Also gets a ClusterIP
LoadBalancerExternalSuperset of NodePort
ExternalNameCNAMENo proxying, no selector
HeadlessclusterIP: NoneDNS returns pod IPs — StatefulSets
DNS name<svc>.<ns>.svc.cluster.local
NetworkPolicyAdditive allow-list; podSelector: {} + policyTypes: [Ingress] denies all ingress

Find it in the docs fast

Documentation is allowed: kubernetes.io/docs and its search box, kubernetes.io/blog, helm.sh/docs, and gateway-api.sigs.k8s.io — but you must not open external search results.

If the task is…Search this on kubernetes.io/docs
Any manifest skeletonUse k explain instead — faster than the docs
etcd snapshot"Operating etcd clusters for Kubernetes"
Cluster upgrade"Upgrading kubeadm clusters"
PV / PVC"Configure a Pod to Use a PersistentVolume for Storage"
NetworkPolicy"Network Policies" — has a copy-paste default-deny
Ingress / Gateway API"Ingress"; gateway-api.sigs.k8s.io for HTTPRoute
Affinity and taints"Assigning Pods to Nodes", "Taints and Tolerations"
RBAC"Using RBAC Authorization"

Exam-day checklist

  • Run the kubectl config use-context line printed with every question — wrong cluster scores zero.
  • Pin the namespace from the question text with set-context --current --namespace.
  • Flag and skip anything over ~7 minutes; tasks are scored independently.
  • Verify after every task: k get <resource> -o wide; for pods wait for Running / 1/1.
  • Write snapshot and manifest files to the exact path the question specifies.
  • After any drain, k uncordon. After any node fix, confirm k get nodes shows Ready.

Frequently asked questions

How long is the CKA exam and how many tasks will I face?

You get 2 hours (120 minutes) to complete the CKA. In that time you'll work through 15–20 performance-based tasks — there are no multiple-choice questions. Every task is solved from a command line running Linux, and the exam is remotely proctored via streaming audio, video, and screen sharing. Because roughly 120 minutes are split across up to 20 hands-on tasks, budgeting your time is critical: plan for about 5–7 minutes per task on average, flag and skip anything that stalls you, and circle back at the end. Practicing with a fast alias setup (like `alias k=kubectl`) and knowing imperative commands cold will save precious minutes.

What score do I need to pass the CKA, and when will I get my results?

You need to earn a score of 66% or above to pass the CKA. Since the exam is scored on partial credit across 15–20 tasks, you don't have to complete every task perfectly — nailing the domains with the heaviest weighting matters more than finishing everything. Your score report is emailed within 24 hours of completing the exam. And if you don't pass the first time, your registration includes one free retake, so there's a built-in safety net.

Which CKA domains should I study hardest?

The CKA curriculum is organized into 5 domains, and they're not weighted equally. Troubleshooting is the most heavily weighted domain at 30%, followed by Cluster Architecture, Installation & Configuration at 25%, Services & Networking at 20%, Workloads & Scheduling at 15%, and Storage at 10%. Because Troubleshooting and Cluster Architecture together account for 55% of your score, they deserve the deepest practice — drill on diagnosing failing pods, broken kubelets, and node issues, plus cluster setup and upgrades. Storage, at just 10%, still matters but yields the fewest points per hour of study, so weight your prep toward the top three domains.

What does the CKA cost, which Kubernetes version does it use, and how long is it valid?

The CKA exam costs $445 USD, and that price includes one free retake — so a single registration effectively gives you two attempts. The exam environment currently runs Kubernetes v1.35, and the published curriculum aligns with that same version, so you should practice against Kubernetes 1.35 and read the docs for that release to avoid version-specific gotchas. Once you pass, the certification is valid for 2 years, after which you'll need to recertify to keep your credential current. It's an online, proctored, performance-based test administered through PSI's Bridge platform using the PSI Secure Browser, so make sure your machine meets the proctoring requirements before exam day.

Sources

  1. 1.Certified Kubernetes Administrator (CKA) CertificationCloud Native Computing Foundation (CNCF) (accessed Jul 18, 2026)
  2. 2.Certified Kubernetes Administrator (CKA) — Training & CertificationThe Linux Foundation (accessed Jul 18, 2026)
  3. 3.Frequently Asked Questions: CKA, CKAD & CKS (Candidate-Facing Docs)The Linux Foundation (accessed Jul 18, 2026)
  4. 4.CNCF Curriculum Repository — CKA_Curriculum_v1.35Cloud Native Computing Foundation (CNCF) (accessed Jul 18, 2026)
  5. 5.Important Instructions: CKA and CKAD (Candidate-Facing Docs)The Linux Foundation (accessed Jul 18, 2026)

Official sources

Primary documents used to verify the exam details shown on this page.

Last verified against the official exam content outline: