<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: yltw</title>
    <description>The latest articles on DEV Community by yltw (@yltw27).</description>
    <link>https://dev.to/yltw27</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4032071%2Fe4b711fa-936a-4540-8b48-ff208be0ea6d.JPG</url>
      <title>DEV Community: yltw</title>
      <link>https://dev.to/yltw27</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yltw27"/>
    <language>en</language>
    <item>
      <title>How I Passed the CKA in 2026</title>
      <dc:creator>yltw</dc:creator>
      <pubDate>Thu, 16 Jul 2026 11:42:57 +0000</pubDate>
      <link>https://dev.to/yltw27/how-i-passed-the-cka-in-2026-143c</link>
      <guid>https://dev.to/yltw27/how-i-passed-the-cka-in-2026-143c</guid>
      <description>&lt;p&gt;I sat the Certified Kubernetes Administrator exam recently. As of writing this, I don't actually know if I passed. The results take up to 24 hours and I'm in that enjoyable window where I'm simultaneously convinced I aced it and convinced I fat-fingered a namespace somewhere and blew 15 points.&lt;/p&gt;

&lt;p&gt;Either way, I spent roughly 2 months preparing for this thing while working on a full-time job, and I figured I'd write down what actually worked — and what definitely didn't — while it's still fresh.&lt;/p&gt;




&lt;h2&gt;
  
  
  Some Context: Why This Exam Is Harder Than It Looks
&lt;/h2&gt;

&lt;p&gt;I work as a software engineer day-to-day, and like most engineers in 2025, I've grown comfortably dependent on AI assistants for a lot of the "what's the flag for this again" moments. The CKA does not care about this. It's a fully hands-on, terminal-based exam with a two-hour clock, no autocomplete for your brain, and the particular joy of watching a kubectl command hang while your time ticks away.&lt;/p&gt;

&lt;p&gt;If you've never taken a hands-on exam like this before (I hadn't), the learning curve isn't just Kubernetes — it's also relearning how to actually type commands quickly and correctly under pressure. That took longer than I expected.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I Actually Prepared
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phase 1: Udemy course for the foundations
&lt;/h3&gt;

&lt;p&gt;I started with a Udemy course to get solid on the core concepts. It was good. The networking section was less good — it didn't cover quite everything you'll need for the exam, so I'd recommend supplementing it. I used Gemini a lot here to fill gaps when a concept wasn't clicking. Being able to ask "explain this to me like I'm going to be tested on it, not like I'm building a dissertation" is genuinely useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2: Killer.sh — the humbling
&lt;/h3&gt;

&lt;p&gt;The first time I ran the Killer.sh mock simulator, I scored 16 out of 75 and ran out of time.&lt;/p&gt;

&lt;p&gt;I want to be clear: this is not a sign you should give up. Killer.sh is deliberately harder and denser than the real exam. It's designed to make you feel bad so that when you sit the actual thing, the questions feel manageable by comparison. That said, 16/75 is a bracing number to stare at, and it told me exactly where I was: too slow, and not confident enough with the tooling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 3: Drilling for speed
&lt;/h3&gt;

&lt;p&gt;Going back through the Udemy labs with a different goal in mind — not just getting the right answer, but getting the right answer fast — made a significant difference. The muscle memory you need isn't really about memorising commands. It's about eliminating hesitation: knowing which resource to reach for, how to quickly pull a YAML template, when to skip a question and come back.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 4: Killer.sh, round two
&lt;/h3&gt;

&lt;p&gt;Second mock: 53/93 within the two-hour window, and 58/93 with an extra 12 minutes after time. A completely different experience from the first run. Still not perfect, but I felt genuinely ready.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;My timeline was tighter than ideal, partly because I hadn't done a hands-on exam before and underestimated how long the muscle memory phase takes. If I were doing this again (or when I prepare for the CKS), I'd follow this order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Official K8s Docs → Killercoda → Udemy Labs → Book the exam → Grind Killer.sh mocks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key difference: Killercoda earlier in the process, so you're getting reps in a real terminal environment from the start rather than catching up later.&lt;/p&gt;




&lt;h2&gt;
  
  
  Things That Actually Matter on Exam Day
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Clipboard and browser basics
&lt;/h3&gt;

&lt;p&gt;Use Ctrl + Shift + C / Ctrl + Shift + V inside the exam terminal — regular copy-paste doesn't work. Use Ctrl + F in the Firefox docs tab to jump directly to the YAML you need rather than scrolling. These sound obvious but when you're stressed and rushing, muscle memory for even this stuff helps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't babysit hanging commands
&lt;/h3&gt;

&lt;p&gt;If a control plane command is hanging, don't sit there watching it. Open a second terminal tab, move to the next question, come back later. This saved me probably 10–15 minutes across the exam.&lt;/p&gt;

&lt;h3&gt;
  
  
  The 5-minute rule
&lt;/h3&gt;

&lt;p&gt;If a question has eaten five minutes and you're still unsure, flag it and move on. Get the points you're confident about first. Come back to the hard ones with whatever time remains. This is obvious advice but it's easy to ignore when you're in the middle of something that feels solvable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fixing broken clusters: steal good configs
&lt;/h3&gt;

&lt;p&gt;If you're asked to fix a broken cluster component, check how a healthy node in the same (or a different) cluster has it configured. Copying a working config as your baseline is faster and safer than trying to construct one from memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  Never write YAML from scratch
&lt;/h3&gt;

&lt;p&gt;Use kubectl get  -o yaml to pull an existing resource and adapt it. Writing manifests from scratch under time pressure is how you introduce typos that cost you points.&lt;/p&gt;

&lt;h3&gt;
  
  
  When a node goes NotReady
&lt;/h3&gt;

&lt;p&gt;This order has never failed me:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;systemctl status kubelet&lt;/code&gt; and &lt;code&gt;journalctl -u kubelet -f&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;crictl ps&lt;/code&gt; and &lt;code&gt;crictl logs&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;/var/log/pods&lt;/code&gt; directly if the container runtime is behaving strangely&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  File Paths and DNS Worth Memorising
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Control plane static pods: &lt;code&gt;/etc/kubernetes/manifests&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kubelet config + certs: &lt;code&gt;/var/lib/kubelet&lt;/code&gt; (PKI in &lt;code&gt;/var/lib/kubelet/pki&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CNI config: &lt;code&gt;/etc/cni/net.d/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Service DNS: &lt;code&gt;&amp;lt;service&amp;gt;.&amp;lt;namespace&amp;gt;.svc.cluster.local&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pod DNS: &lt;code&gt;&amp;lt;pod-ip-with-hyphens&amp;gt;.&amp;lt;namespace&amp;gt;.pod.cluster.local&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Command Directory
&lt;/h2&gt;

&lt;p&gt;Commands I actually used, not an exhaustive list of everything kubectl can do.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cluster context and discovery
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get all
kubectl get pod &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;prod
kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; &amp;lt;namespace&amp;gt; get deploy,ds,sts,pv,pvc
kubectl &lt;span class="nt"&gt;--kubeconfig&lt;/span&gt; &amp;lt;file&amp;gt; config current-context
kubectl cluster-info &lt;span class="nt"&gt;--kubeconfig&lt;/span&gt; &amp;lt;file&amp;gt;
kubectl api-resources &lt;span class="nt"&gt;--namespaced&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Kustomize
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl kustomize &amp;lt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
kubectl kustomize &amp;lt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; | kubectl diff &lt;span class="nt"&gt;-f&lt;/span&gt; -
kubectl kustomize &amp;lt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; | kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cluster maintenance
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl x509 &lt;span class="nt"&gt;-text&lt;/span&gt; &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-in&lt;/span&gt; &amp;lt;cert_file&amp;gt;
kubeadm certs check-expiration
kubeadm certs renew &amp;lt;name&amp;gt;
kubeadm token create &lt;span class="nt"&gt;--print-join-command&lt;/span&gt;
systemctl daemon-reload &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; systemctl restart kubelet
crictl ps &lt;span class="nt"&gt;-a&lt;/span&gt;
crictl logs &amp;lt;container_id&amp;gt;
crictl inspect &amp;lt;container_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  RBAC
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl auth can-i &amp;lt;verb&amp;gt; &amp;lt;resource&amp;gt; &lt;span class="nt"&gt;--as&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;system:serviceaccount:&amp;lt;namespace&amp;gt;:&amp;lt;serviceaccount-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Workloads and networking
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Base64 without line-wrapping (important)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"secret-data"&lt;/span&gt; | &lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; 0

&lt;span class="c"&gt;# Expose a pod as a ClusterIP service&lt;/span&gt;
kubectl expose pod nginx-resolver &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nginx-resolver-service &lt;span class="nt"&gt;--port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;80 &lt;span class="nt"&gt;--target-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;80 &lt;span class="nt"&gt;--type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ClusterIP

&lt;span class="c"&gt;# Temporary debug pod, auto-removed on exit&lt;/span&gt;
kubectl run test-nslookup &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;busybox:1.28 &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Never &lt;span class="nt"&gt;--&lt;/span&gt; nslookup nginx-resolver-service

&lt;span class="c"&gt;# Create a pod with multiple labels&lt;/span&gt;
kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; &amp;lt;ns&amp;gt; run &amp;lt;pod-name&amp;gt; &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;image&amp;gt; &lt;span class="nt"&gt;--labels&lt;/span&gt; &lt;span class="s2"&gt;"key1=val1,key2=val2"&lt;/span&gt;

&lt;span class="c"&gt;# Curl a service FQDN from inside a pod&lt;/span&gt;
kubectl &lt;span class="nt"&gt;-n&lt;/span&gt; &amp;lt;ns&amp;gt; &lt;span class="nb"&gt;exec&lt;/span&gt; &amp;lt;pod-name&amp;gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; curl &amp;lt;service&amp;gt;.&amp;lt;namespace&amp;gt;.svc.cluster.local

&lt;span class="c"&gt;# Rolling restart after a ConfigMap change&lt;/span&gt;
kubectl rollout restart deploy &amp;lt;deployment-name&amp;gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &amp;lt;ns&amp;gt;

&lt;span class="c"&gt;# Check host routing&lt;/span&gt;
ip route show
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  One Honest Thought on the Exam Format
&lt;/h2&gt;

&lt;p&gt;Hands-on exams made obvious sense before AI could generate a working YAML manifest in seconds. The implicit assumption was that typing commands correctly under pressure proved you understood them. I'm not sure that logic holds the same way anymore. That said, I don't think the CKA is without value — being dropped into broken environments and having to reason your way out is genuinely different from syntax recall. That's a real skill, and probably harder to fake. But I do wonder if the two-hour clock is testing the right thing, or just the most measurable one. Maybe the format needs to evolve rather than disappear — less "can you type this fast" and more "can you diagnose this without a lifeline." The latter feels like what actually matters now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Note
&lt;/h2&gt;

&lt;p&gt;Read every question fully before you start typing. Nervous speed-reading is how you misconfigure a namespace and lose points you should have had. Breathe.&lt;/p&gt;

&lt;p&gt;Good luck!&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>cka</category>
      <category>certification</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
