<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Purnima Jain on Medium]]></title>
        <description><![CDATA[Stories by Purnima Jain on Medium]]></description>
        <link>https://medium.com/@purnima.jain?source=rss-41573a62f3e0------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*mFxuFvIatTFlub2K4szc_A.jpeg</url>
            <title>Stories by Purnima Jain on Medium</title>
            <link>https://medium.com/@purnima.jain?source=rss-41573a62f3e0------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 24 May 2026 02:24:40 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@purnima.jain/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Open Policy Agent (OPA) — Understanding Policies, Data, and Decisions]]></title>
            <link>https://medium.com/@purnima.jain/open-policy-agent-opa-understanding-policies-data-and-decisions-e1ce7c89435f?source=rss-41573a62f3e0------2</link>
            <guid isPermaLink="false">https://medium.com/p/e1ce7c89435f</guid>
            <category><![CDATA[open-policy-agent]]></category>
            <category><![CDATA[rbac]]></category>
            <category><![CDATA[access-control]]></category>
            <category><![CDATA[rbac-access-control]]></category>
            <category><![CDATA[opas]]></category>
            <dc:creator><![CDATA[Purnima Jain]]></dc:creator>
            <pubDate>Sun, 15 Mar 2026 15:38:46 GMT</pubDate>
            <atom:updated>2026-03-15T15:38:46.446Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*zQLyz-MP8lxHSrS1" /><figcaption>Photo by <a href="https://unsplash.com/@phosphorvs?utm_source=medium&amp;utm_medium=referral">Dave Meckler</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>For those who have never heard of Open Policy Agent — which, to be fair, still includes a fairly large chunk of the engineering world — the simplest way to think about it is this: <strong>OPA is a policy engine</strong>.</p><p>Now, “policy engine” may sound like one of those terms that appears in architecture diagrams and disappears before anyone explains it properly, so let’s simplify it.</p><p>At its core, a policy engine is something to which you provide:</p><ul><li>a set of rules that define what is allowed and what is not allowed</li><li>some contextual information about the current situation</li><li>and then a question asking whether a certain action should be permitted</li></ul><p>The engine evaluates all of that and returns an answer.</p><p>In plain language, you are essentially saying:</p><blockquote>Here are my rules.<br>Here is the context.<br>Now tell me whether this action should be allowed.</blockquote><p>A very simple real-world example would be this:</p><p>Suppose we define a rule that says:</p><blockquote>Anyone with the role <strong>Admin</strong> is allowed to <strong>CREATE</strong> something.</blockquote><p>Now we provide some context:</p><blockquote>Alice has the role <strong>Admin</strong>.</blockquote><p>And finally we ask:</p><blockquote>Is Alice allowed to <strong>CREATE</strong>?</blockquote><p>A policy engine takes these three pieces, evaluates them together, and gives you the answer.</p><p>If we map that into OPA terminology, it looks like this:</p><ul><li><strong>Policy</strong> → Anyone with role <strong>Admin</strong> is allowed to <strong>CREATE</strong></li><li><strong>Data</strong> → Alice has role <strong>Admin</strong></li><li><strong>Input</strong> → Is Alice allowed to <strong>CREATE</strong>?</li></ul><p>And that is really the first mental model to build before going deeper into OPA: <strong>OPA itself does not hardcode your business decisions — it simply evaluates the rules you give it against the context you provide.</strong></p><p>That separation is what makes it powerful.</p><h3>Enough theory — let’s see OPA in action</h3><p>Theory is useful, but policy engines become much easier to understand once you actually see one running.</p><p>For this demo, we will run Open Policy Agent inside a Docker container using a docker-compose.yaml setup, just to keep things simple and reproducible.</p><p>If you want to follow along, the full demo code is available here: <a href="https://github.com/purnima-jain/opa-access-control-rest-api">https://github.com/purnima-jain/opa-access-control-rest-api</a></p><p>The setup is intentionally lightweight — bring everything up with:</p><pre>docker-compose up</pre><p>Once the container is up, it is always a good idea to verify that OPA is actually alive and healthy before doing anything else.</p><p>You can jump into the container and check the installed version using:</p><pre>docker exec -it opa_container opa version</pre><p>If everything is wired correctly, you should see version details printed back, which confirms that OPA is running properly inside the container.</p><p>And now that our policy engine is sitting there quietly waiting for instructions, we can finally make it do something useful.</p><p>For this demo, instead of inventing policies from scratch, we will borrow one of the well-known examples from the <a href="https://play.openpolicyagent.org/">Rego Playground</a> — specifically the <strong>Role-Based Access Control (RBAC)</strong> example available in the official playground.</p><h3>Injecting our first policy into OPA</h3><p>Now that Open Policy Agent is up and running, the first real thing we need to do is give it a policy to evaluate.</p><p>OPA does not magically know your rules — you have to explicitly load them into the engine.</p><p>For this demo, we will take the policy available in the Rego Playground (RBAC example) policy panel and push it into OPA using its REST API.</p><p>And yes, for quick experimentation, Postman makes this extremely convenient.</p><p>We will send a PUT request to:</p><pre>http://localhost:8181/v1/policies/example1</pre><p>Using:</p><ul><li><strong>HTTP Method</strong> → PUT</li><li><strong>Body Type</strong> → raw</li><li><strong>Format</strong> → Text</li></ul><p>Then simply copy the policy content from the left-hand <strong>Policy</strong> panel of the Rego Playground and paste it into the request body.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mipV1ApBiIwYrdCZhZASXg.jpeg" /></figure><p>A small but important detail here: the name at the end of the URL — in this case example1 — becomes the policy identifier inside OPA.</p><p>So effectively, with this request, we are telling OPA:</p><blockquote>Here is a policy. Store it under the name example1.</blockquote><p>Once the request succeeds, OPA compiles and stores that policy immediately, and it becomes available for evaluation.</p><p>This is one of the nice things about OPA during development: you can inject, replace, and iterate on policies very quickly without restarting anything.</p><h3>Reading back the policy (because trust, but verify)</h3><p>Once we push a policy into Open Policy Agent, it is always worth checking whether OPA actually accepted it the way we expected.</p><p>A successful PUT response is reassuring, but I still prefer verifying what is sitting inside the engine before moving further.</p><p>OPA gives us another REST endpoint for exactly that.</p><p>Send a GET request to:</p><pre>http://localhost:8181/v1/policies</pre><p>Using:</p><ul><li><strong>HTTP Method</strong> → GET</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qgX334Qv4jGP5OdJ5jgRzg.jpeg" /></figure><p>This returns the list of policies currently loaded into OPA.</p><p>If everything worked correctly, you should see the policy we inserted earlier — example1 — along with its stored source content.</p><p>And now that the policy is safely inside OPA, the next obvious question is:</p><blockquote>A policy alone is just a rule. Where does OPA get the actual contextual information from?</blockquote><p>That is where <strong>data injection</strong> comes in.</p><h3>Injecting data: giving OPA some context</h3><p>At this point, our policy is loaded, but on its own it still cannot answer anything meaningful.</p><p>Why? Because a policy defines only the rule — not the real-world context in which that rule has to be evaluated.</p><p>And that contextual information is what Open Policy Agent calls <strong>data</strong>.</p><p>Think of it this way:</p><ul><li>the <strong>policy</strong> says what should be allowed</li><li>the <strong>data</strong> tells OPA what currently exists in the system</li></ul><p>So next, we need to push some data into OPA as well.</p><p>For that, send a PUT request to:</p><pre>http://localhost:8181/v1/data</pre><p>Using:</p><ul><li><strong>HTTP Method</strong> → PUT</li><li><strong>Body Type</strong> → raw</li><li><strong>Format</strong> → JSON</li></ul><p>Then copy the contents from the <strong>Data</strong> panel in the Rego Playground and paste it into the request body.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qEHfxa1VphXLGw8p6AKpOQ.jpeg" /></figure><p>Without data, OPA has rules but nothing to apply them to.</p><p>With data loaded, the engine now has both:</p><ul><li>the rulebook</li><li>the supporting facts</li></ul><h3>Reading back the data</h3><p>Just like with policies, it is a good habit to verify that the data actually landed inside Open Policy Agent exactly the way we intended.</p><p>To read the currently stored data, send a GET request to:</p><pre>http://localhost:8181/v1/data</pre><p>Using:</p><ul><li><strong>HTTP Method</strong> → GET</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fyu8lT9XquDKepPJWV-ALA.jpeg" /></figure><p>OPA will return the full data document currently available inside the engine.</p><p>At this point, OPA now has both major ingredients loaded:</p><ul><li><strong>Policy</strong> → the rules</li><li><strong>Data</strong> → the contextual facts</li></ul><p>And that means we are finally very close to asking the most interesting part:</p><blockquote>Given this policy and this data, is a particular action allowed?</blockquote><p>That final piece is where <strong>input</strong> comes in.</p><h3>Asking OPA the actual question</h3><p>Now comes the part where everything finally connects.</p><p>We already loaded:</p><ul><li>the <strong>policy</strong> (the rules)</li><li>the <strong>data</strong> (the supporting context)</li></ul><p>The only missing piece is the actual request we want OPA to evaluate.</p><p>In OPA terminology, this is called <strong>input</strong>.</p><p>This is the dynamic part — the thing that changes from one authorization request to another.</p><p>For example: Is Alice allowed to create?</p><p>For our demo, send a POST request to:</p><pre>http://localhost:8181/v1/data/app/rbac</pre><p>Using:</p><ul><li><strong>HTTP Method</strong> → POST</li><li><strong>Body Type</strong> → raw</li><li><strong>Format</strong> → JSON</li></ul><p>Now copy the contents of the <strong>Input</strong> panel from the Rego Playground, but there is one important adjustment:</p><p>Wrap that JSON inside an attribute called input.</p><p>So instead of sending plain JSON directly, the body should look like:</p><pre>{<br>  &quot;input&quot;: {<br>    ...<br>  }<br>}</pre><p>That wrapper matters because OPA expects runtime input under the input key during evaluation.</p><p>One detail that is easy to miss here — and worth paying close attention to — is the URL path:</p><pre>/v1/data/app/rbac</pre><p>This path is derived directly from the <strong>package name inside your policy</strong>.</p><p>If your policy contains:</p><pre>package app.rbac</pre><p>Then OPA converts that package path into:</p><pre>/app/rbac</pre><p>In other words:</p><ul><li>dots (.) become slashes (/)</li><li>the package path becomes part of the API endpoint</li></ul><p>This is one of those small OPA conventions that makes complete sense once you notice it, but can be confusing the first time you hit it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iDu32vz38RhZgAB8tUWOMg.jpeg" /></figure><p>And once you send the request, the response returned by OPA should match exactly what you see in the <strong>Output</strong> panel of the Rego Playground.</p><p>That is your final evaluated decision.</p><h3>Updating data: changing the decision without touching the policy</h3><p>This is where Open Policy Agent starts showing why separating policy from data is actually powerful.</p><p>So far, our policy says who is allowed to do what, and our data tells OPA who currently has which role.</p><p>Now let’s change just the data and watch the decision change immediately — without touching the policy at all.</p><p>Suppose we want to revoke Alice’s admin access and assign her a different role, say non-admin.</p><p>For that, send a PUT request to:</p><pre>http://localhost:8181/v1/data/user_roles/alice</pre><p>Using:</p><ul><li><strong>HTTP Method</strong> → PUT</li></ul><p>And the request body:</p><pre>[<br>  &quot;non-admin&quot;<br>]</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Tnc417cKRm7Aqr1K4uVd_g.jpeg" /></figure><p>What we are doing here is updating only Alice’s role assignment inside the data store.</p><p>The policy itself remains exactly the same.</p><p>That means the rule still says:</p><blockquote>Admins are allowed.</blockquote><p>But the supporting fact has changed:</p><blockquote>Alice is no longer an admin.</blockquote><p>A nice follow-up step is to read the data again using the same GET /v1/data endpoint we used earlier, just to confirm that Alice’s role has actually been updated.</p><p>And once that looks correct, run the exact same query again — the same input, the same policy path, everything unchanged.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WoOV10gEK4CJAGtmzSv_EA.jpeg" /></figure><p>This time, the output changes.</p><p>And no surprises there: Alice is no longer allowed.</p><p>That moment is actually one of the clearest demonstrations of OPA’s design philosophy:</p><ul><li><strong>policy stays stable</strong></li><li><strong>data changes frequently</strong></li><li><strong>decisions adapt automatically</strong></li></ul><p>In real systems, this becomes incredibly useful because role changes, permissions, entitlements, and user context change all the time, while the authorization logic often remains structurally consistent.</p><p>Instead of rewriting application code every time something changes, you simply update the underlying data and let OPA re-compute the decision.</p><p>That separation is where a lot of operational elegance comes from.</p><h3>Wrapping up</h3><p>Before closing, one important clarification: this is obviously not how Open Policy Agent would typically be integrated in a real production system.</p><p>In the real world, policies are not pushed ad hoc through REST APIs every time. They usually live as .rego files in version control, go through the normal engineering lifecycle of review and approval, and are deployed into OPA in a controlled way — very often through a CI/CD pipeline. Likewise, application data would continue to live in your database or source systems; you would not simply dump everything into the OPA engine.</p><p>The intent of this write-up was much simpler: to understand OPA in isolation, at a conceptual level, without immediately getting pulled into programming languages, microservice frameworks, application servers, databases, caches, or remote calls to other systems. Sometimes it helps to look at a tool without the surrounding ecosystem first.</p><p>And for that purpose, this small hands-on flow gives a pretty good first feel for how OPA works. Once you see policy, data, and input flowing separately, the overall model becomes much easier to appreciate. What makes it interesting is how changing just the data can immediately change the decision without touching the policy itself — and that is exactly where its real strength starts to show in larger systems. For anyone curious about externalizing authorization logic and keeping access control cleaner, OPA is definitely worth exploring further.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e1ce7c89435f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[My CKAD Journey — From “Not a Linux Person” to Certified Kubernetes Application Developer]]></title>
            <link>https://medium.com/@purnima.jain/my-ckad-journey-from-not-a-linux-person-to-certified-kubernetes-application-developer-c844db856d08?source=rss-41573a62f3e0------2</link>
            <guid isPermaLink="false">https://medium.com/p/c844db856d08</guid>
            <category><![CDATA[certified-kubernetes]]></category>
            <category><![CDATA[ckad-exam]]></category>
            <category><![CDATA[kubernetes]]></category>
            <dc:creator><![CDATA[Purnima Jain]]></dc:creator>
            <pubDate>Thu, 19 Feb 2026 15:16:47 GMT</pubDate>
            <atom:updated>2026-02-19T15:16:47.537Z</atom:updated>
            <content:encoded><![CDATA[<p>A couple of months ago, I finally decided to go for the <strong>CKAD (Certified Kubernetes Application Developer)</strong> certification. It had been sitting on my “someday soon” list for a while — you know, the one that never quite makes it past <em>next week</em>. But this time, I made up my mind to see it through.</p><p>Now, if I’m being completely honest, <strong>one of the biggest reasons for the delay was good old-fashioned laziness</strong> (no surprises there 😄). But right behind that was something a little more intimidating — my <strong>lack of familiarity with the Linux ecosystem</strong>.</p><p>I’ve never been particularly comfortable around Linux, Bash, Shell scripting, Vim, or any of those mystical tools that seem to be second nature to hardcore Linux folks. So, naturally, the CKAD exam felt like a distant dream — a mountain too steep to climb.</p><p>But here’s the twist: I did climb it.</p><p>And that’s exactly why I’m writing this blog — to share my experience and to tell anyone who’s hesitant because they’re “not a Linux person” that <strong>you absolutely can do it too</strong>. If I managed to get through it, trust me, so can you.</p><p>So, without further ado (and before I talk myself out of writing this post altogether 😅), let’s get into what I learned, how I prepared, and what you should know if you’re even <em>thinking</em> about attempting CKAD — now or in the future.</p><h3>Things to Know Before Attempting CKAD</h3><p><strong>#1. Certification Path</strong></p><p>Kubernetes certifications generally follow two paths — the <strong>administrator track (CKA)</strong>, which focuses on cluster management, and the <strong>developer track (CKAD)</strong>, which centers on application deployment. If you’re just starting out, the <strong>KCNA (Kubernetes and Cloud Native Associate)</strong> is a good entry point, covering the basics before moving on to CKA, CKAD, or the advanced <strong>CKS (Certified Kubernetes Security Specialist)</strong>. And for the truly ambitious — earning all five Kubernetes certifications grants you the title of <strong>Kubestronaut</strong>. Pretty cool, right?</p><p><strong>#2. It’s a hands-on exam, not multiple choice.</strong></p><p>Unlike most certifications out there, CKAD isn’t about selecting the right answer from a list. It’s entirely practical — you’re given access to a live Kubernetes cluster and expected to work directly on it. You’ll troubleshoot and debug existing YAML files and often create new ones from scratch. The good news? It’s an open-book exam. You’re free to access the official Kubernetes documentation, blogs, and even Helm docs during the test.</p><p><strong>#3. kubectl is your best friend.</strong></p><p>During the exam, you won’t have access to any Kubernetes dashboards or fancy UIs — it’s just you and the command line. The test heavily rewards the <strong>imperative approach</strong>, which is quite the opposite of the declarative style we usually prefer in real-world projects. It might not feel fair, but then again, when has life ever promised fairness? The key is to make kubectl commands second nature, especially the ones that can generate YAMLs instantly. They save precious minutes — and in this exam, time is your most valuable resource.</p><p><strong>#4. Know your tools.</strong></p><p>You don’t need to be a command-line wizard, but a decent level of comfort with basic <strong>Linux commands</strong> (wget, curl, ps, cd, ls, etc.), <strong>shell scripting</strong>, <strong>Docker</strong>, and <strong>YAML</strong> goes a long way. And then there’s <strong>Vim</strong> — yes, the legendary text editor that refuses to let you leave. The old joke still stands: <em>“I’ve been using Vim for two years now… mostly because I can’t figure out how to exit it.”</em></p><p><strong>#5. Get comfortable with the Kubernetes documentation.</strong></p><p>Spend some time exploring the official docs before the exam — know where things are, what examples exist, and which snippets are worth reusing. Have a rough plan for how you’ll adapt them to your specific tasks. For example, <strong>PersistentVolumes and PersistentVolumeClaims</strong> almost always show up, and there’s little value in typing those YAMLs from scratch. Instead, know exactly which snippet you’ll copy and use as a starting template.</p><p>One small practical tip — when you copy from the documentation, the indentation often ends up messy. Don’t spend precious minutes trying to make the YAML look pretty. Nobody is grading formatting, and there are no brownie points for perfectly aligned spaces. The solutions are machine-validated; readability is for humans, correctness is for the cluster.</p><p>That said, treat the docs as a <strong>backup</strong>, not your primary tool. Copying and tweaking YAML snippets can quietly eat up valuable minutes, so whenever possible, rely on commands instead. Efficiency matters when the clock is running.</p><p><strong>#6. Understand the exam format and plan your time.</strong></p><p>The CKAD exam runs for <strong>two hours</strong> and typically includes <strong>16–19 tasks</strong>. You’ll need <strong>66% score</strong> to pass, and yes — <strong>partial credit</strong> is awarded for answers that are partially correct. The weight of each question isn’t disclosed, and the difficulty level varies quite a bit — some are quick wins, others can be real time sinks. The best approach? <strong>Do an initial sweep</strong> — tackle the easier questions first, and tag the tougher ones to revisit later. It’s a simple strategy, but it can make a big difference when the clock starts to feel uncomfortably fast.</p><p><strong>A small word of caution:</strong> the individual tasks themselves aren’t as intimidating as they may seem. The real challenge isn’t complexity — it’s volume. There are quite a few questions packed into a short window, and time disappears faster than you expect.</p><p><strong>#7. The exam setup — and a few words about PSI Secure Browser.</strong></p><p>You can take the CKAD exam from home, proctored online through your webcam. You’ll need a reliable internet connection, a valid photo ID, and your laptop’s built-in microphone (headphones aren’t allowed). Before starting, you’ll sign a Non-Disclosure Agreement stating you won’t share exam questions afterward.</p><p>Now, about the exam platform — it runs on <strong>PSI Secure Browser</strong>, and let’s just say it’s not exactly the highlight of the experience. It can be slow, laggy, and occasionally uncooperative (in my case, copy-paste stopped working mid-exam). If you encounter major issues and can’t continue meaningfully, don’t panic — you can discontinue the test and <strong>request a reschedule</strong>. It’s a fairly common occurrence, and the support team is usually accommodating once you report the issue.</p><p><strong>#8. After the exam — what to expect.</strong></p><p>Results usually arrive within <strong>48 hours</strong> of completing the exam, straight to your inbox. The certificate simply shows a <strong>Pass or Fail</strong> — no scores or breakdowns. If you pass, you’ll also receive an email from <strong>Credly</strong> to claim and display your shiny new badge. And if things don’t go your way the first time, don’t worry — your registration includes <strong>one free retake</strong>, which you can use within the next <strong>12 months</strong>.</p><h3>Resources</h3><p>Here are the resources that helped me survive (and eventually pass) the CKAD — consider this my shortlist of trusted companions:</p><ul><li><strong>Kubernetes Certified Application Developer (CKAD) with Tests by Mumshad Mannambeth of KodeKloud Training</strong></li></ul><p><a href="https://www.udemy.com/course/certified-kubernetes-application-developer/">https://www.udemy.com/course/certified-kubernetes-application-developer/</a></p><ul><li><strong>Certified Kubernetes Application Developer (CKAD), 4th Edition by Sander Van Vugt</strong></li></ul><p><a href="https://www.oreilly.com/videos/certified-kubernetes-application/9780135349700/">https://www.oreilly.com/videos/certified-kubernetes-application/9780135349700/</a></p><ul><li><strong>Certified Kubernetes Application Developer (CKAD) Prep Course by Benjamin Muschko</strong></li></ul><p><a href="https://www.oreilly.com/videos/certified-kubernetes-application/0642572045296/">https://www.oreilly.com/videos/certified-kubernetes-application/0642572045296/</a></p><ul><li><strong>Certified Kubernetes Application Developer (CKAD) Study Guide, 2nd Edition by Benjamin Muschko</strong></li></ul><p><a href="https://learning.oreilly.com/library/view/certified-kubernetes-application/9781098152857/">https://learning.oreilly.com/library/view/certified-kubernetes-application/9781098152857/</a></p><h3>Price</h3><p>The certification currently costs <strong>$445</strong> on the Linux Foundation website — but there’s almost never a reason to pay full price. You can usually find discounts floating around. For instance, <strong>Benjamin Muschko’s CKAD course on O’Reilly</strong> often includes a <strong>20% discount code</strong>, while <strong>Mumshad Mannambeth’s KodeKloud course on Udemy</strong> typically offers around <strong>30% off</strong>. And if you’re patient, the <strong>CNCF or Linux Foundation</strong> themselves occasionally run promotions where <strong>40% discounts</strong> aren’t uncommon. A little timing can save you a fair bit of money.</p><h3>Final Thoughts</h3><p><strong>Practice like your life depends on it.</strong></p><p>If there’s one thing that truly determines whether you pass or fail the CKAD, it’s not just your Kubernetes knowledge — it’s your <strong>time management</strong>. This exam is as much about <strong>how you perform under pressure</strong> as it is about what you know. You’re juggling multiple clusters, YAML files, commands, and a ticking clock — and it’s easy to lose precious minutes on small mistakes.</p><p>So, practice until you’re comfortable enough that working in the terminal feels second nature. Simulate the exam environment, build speed, and learn to move past the tricky questions without panicking. Passing the CKAD isn’t only about Kubernetes mastery — it’s about <strong>staying composed</strong>, <strong>managing your time</strong>, and sometimes just <strong>hoping the tech gods are on your side</strong> when the PSI browser decides to misbehave.</p><p>If you can balance all that — the concepts, the commands, and the chaos — you’ll walk away with not just a certification, but a real sense of accomplishment.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c844db856d08" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>