CKAD Exam Guide

I recently completed the Certified Kubernetes Application Developer exam
and received certification.
Here is my personal guide to the exam—it’s an overview of what I studied,
what surprised me, and what needs the most practice.

Please note that I can’t give out specific details because you have to sign
confidentiality agreements with the CNCF before taking the exam. I’ll do my
best to share my experience in a suitable way.

Also, feel free to email me at [email protected] with any questions you have.
And especially email me if you take the exam and this guide does or does not help!
I want to collect some data on whether this guide is useful, and how I can improve it.

The upgraded package features a 30 question practice test in the style of the real exam (with complete solutions!)

Background

The CKAD exam is a two hour practical exam that tests your knowledge, skill, and
ability as a developer using Kubernetes. The exam is oriented towards testing this ability. Questions focus on using, debugging, monitoring,
and accessing Kubernetes.

Exam style

The test involves interacting with a live Kubernetes cluster via the command line.
This occurs in a web-based command-line environment where you
need to execute kubectl commands, operate a Unix shell, and edit YAML files.

As you’d expect, the exam follows the syllabus and curriculum closely. There are
roughly twenty topics in the curriculum, and roughly that many questions in the exam.
The exam covers almost every topic in the syllabus—make sure you’re familiar with everything when preparing.

The questions are all practical—you will need to create Kubernetes objects, consume
existing objects, debug existing (but failing) objects, and query the cluster.

Assumed skills

First of all, you will need to be comfortable navigating a Unix command line environment.
The entire test takes place in a web application that simulates a Unix command line.
You will need to be able to navigate a Unix shell, know a command-line text editor, and
use Unix programs to complete questions.

One large annoyance for me was that I don’t usually edit my YAML files in Vim.
This was a problem when I wanted to bulk-indent fifteen lines but couldn’t
remember how to do it. I had to type space-space fifteen times—a huge time-sink
for very little value. Make sure you’re fast at navigating Unix and editing YAML
in a terminal text editor.

You will need to be able to create Kubernetes objects through both YAML and via kubectl commands!

Content

There were no content-related surprises to my exam—what’s in the curriculum is what
gets tested. If something seems like something that an administrator would set up on a cluster
(for example, a resource quota), it’s more likely that you’ll need to consume or use
that resource, rather than needing to know how to create it yourself. Remember that this is
an exam for application developers.

I think there are three priority tiers of content to learn for the exam.
The first tier requires deep understanding and experience, and will be tested multiple times. The second tier you need to understand and use, but it is likely to appear
fewer times. The third tier are simpler concepts that you are likely to simply use or consume,
and they only appear once in the exam.

Sample questions

I can’t give out any specific questions, but to give you a sense of what the questions
are like, here are a couple of sample questions. I have more sample questions
(with complete solutions!) in the upgraded package of my Golden Guide to Kubernetes
Application Development book.

Note that these sample questions are easier than what’s in the exam, but they
give you a hint of the style of the questions.

Sample question 1

Create a deployment of version 1.7.1 of the nginx image. This deployment should have five pods
running the nginx image. Create the deployment in the question-four namespace. Save the YAML
configuration to create this deployment in a file called deploy.yaml.

Sample question 2

A pod called question-five-pod is failing to run in our Kubernetes cluster in the question-five namespace. Query the Kubernetes cluster to determine why the pod isn’t starting, and
save any relevant events to a file called query-results.txt. Then, fix the pod’s configuration
so that it starts correctly.

Other advice

Know how to quickly navigate the web and CLI documentation available to you

You have full access to kubernetes.io and kubectl in the exam environment. Make the most of it!

Make sure you can navigate, search, and find examples on kubernetes.io. Most questions require
knowledge or configuration that’s contained on kubernetes.io—knowing the layout and location of
documentation might need is a huge advantage.

While navigating the docs is important, the faster (and my preferred) way is to use kubectl’s
inbuilt documentation to quickly find information you need.

For figuring out which YAML field to use, kubectl explain <object>.<subobject> and kubectl explain <object>.<subobject> --recursive are my most-used commands. They’ll print out types and attributes you need to set on a resource.

Know how to do both YAML and kubectl commands

The exam will require you to interchangeably use YAML or direct kubectl commands—make sure
you are comfortable with both. I have two tips to help with this.

kubectl get $resource --export=true -o yaml will get you the configuration for an existing
object in YAML format. This is great for debugging why something might not be working. It’s
also really useful if it’s faster (or you are more comfortable) creating a resource via
a kubectl command.

For example, I used something like kubectl run mydeployment --image=nginx --port=8080 --replicas=5
to create a deployment quickly, and then did kubectl get deployment mydeployment --export=true -o yaml
to get the YAML for that deployment. This helps me avoid remembering all the details of writing a
deployment YAML.

Most things need to happen in a specific namespace

Each question will probably specify which namespace the resource lives in or is to be created in.
Namespaces were something I wasn’t particularly familiar with when I took the exam,
so I kind of had to wing it. Make sure you’re comfortable using and understanding namespaces,
and can specify them through the command line (the --namespace argument)
and through YAML (the metadata.namespace` field).

Be able to move quickly

I found the exam fairly tight time-wise. You’ll need to work quickly in a Kubernetes cluster from
a terminal environment. Also, be prepared to skip questions if they have a low weighting—sometimes
it’s not worth spending ten minute on a two mark question.

The exam environment is not friendly

First of all, the person running your exam will be strict. Even though it’s all done remotely,
you’ll have to remove labels from drink bottles, remove everything from your desk (including, in my
case, desk lamps and plants), and show the proctor the entire room through your webcam. Taking
the exam in a public setting (like a library, which I almost did) is not really viable unfortunately.

The terminal environment you have to use is pretty terrible. It can be quite laggy and doesn’t
have the autocompletion functionality you might be used to. Try to find the best internet connection
you can to take the exam—a laggy environment is so disruptive.

A tip from Steve Mayne

My thanks to Steve Mayne for this tip (who passed his exam after taking my course... just sayin’)

Set the KUBE_EDITOR environment variable if you can't hack using vi / vim. The first thing I did in the exam was export KUBE_EDITOR="nano" because I'm not proud and I don't mind hardcore Linux people pouring scorn upon me :-)

You have a free retake

Don’t worry if you fail the exam—you get a free retake! The next time you’ll better understand what’s
coming in the exam, and you’ll be able to manage your time better. If you do fail your first attempt,
please email me and let me know which things tripped you up or what would have helped to know.
I really want to improve this guide for everyone.