Exam Prep · The Docs Map

The Docs Map — what you may open, and what you must know cold

Start with the fact that changes everything: the CNPE is not a broadly open-book exam. You do not get the project documentation sites for the tools you are being tested on. During the exam the permitted resources are narrow — essentially kubernetes.io/docs, kubernetes.io/blog, whatever task-specific pages the exam itself links from its Quick Reference box, and the documentation installed locally on the machine. Argo CD, Flux, Tekton, Crossplane, Backstage, Prometheus, OpenTelemetry, Kyverno, Istio and Helm are squarely in the exam domains, and their docs are not on the list. So this page does two jobs. First it maps kubernetes.io/docs properly, because that is your one real in-exam reference and it carries the Kubernetes-native half of the exam. Second it points you at the manifests you must be able to write from memory, because nothing will hand them to you — those now live on their own drillable page, Know It Cold — the manifests you must write from memory. The per-tool doc maps further down are still here, and still valuable — as study material, for the weeks before exam day.

⚠ What you may actually open during the CNPE — read this first

Per the Linux Foundation’s official Resources Allowed page and the Important Instructions: CNPE page, the only resources permitted while the CNPE clock runs are:

https://kubernetes.io/docs, including its translations. https://kubernetes.io/blog/. Task-specific documentation linked from the exam’s own “Quick Reference” box. Documentation installed locally on the exam machine — /usr/share, distribution packages, and man pages.

You may use the search function on those sites, but you must not open external search results and must not follow outbound links off them. Following a link from kubernetes.io out to, say, helm.sh is not permitted.

Argo CD, Flux, Tekton, Crossplane, Backstage, Prometheus, OpenTelemetry, Kyverno, Gatekeeper, Istio and Helm docs are NOT available to you during the CNPE, even though all of them are in scope. The CNPE allowlist is narrower than its siblings: CKA and CKAD additionally permit helm.sh/docs, and CKS permits the Falco, etcd, Cilium and Istio doc sites. Do not carry a CKA-era assumption into the CNPE.

Allowlists get revised. Confirm the current list on the official Resources Allowed page and the CNPE Important Instructions page in the days before your exam, and let those override anything written here.

☺ Explain it like I’m 10

Imagine a cooking test where you may bring one book — the big general one about ingredients and ovens — but not the little recipe cards for the fancy dishes. So two things matter. First: know that one book so well your thumb lands on the right page instantly. Second: the fancy recipes? You have to have them in your head, because nobody is handing them to you. This page is both halves — thumb-training for the book you get, and a list of the recipes you must memorise.

🐿️🦊Your hosts for this topic: Nutty the Squirrel & Foxy — Nutty is the Guild’s cataloguer, who has already filed every doc page by the job it does; Foxy is the detective who went and asked people who actually sat the exam what slowed them down. Nutty builds the map; Foxy marks the traps on it.

Why the narrow allowlist should reshape your study plan

☺ Like you’re 10: You only get one book in the test. Learn that book by heart and memorise the recipes it doesn’t contain.

Let’s be precise about what the allowlist changes. Your preparation now has two distinct halves, and confusing them is how people fail. For anything Kubernetes-native — Deployments, Services, Ingress, NetworkPolicy, RBAC, storage, quotas, Pod Security Standards, HPA, scheduling, CRDs, admission webhooks — your bottleneck is retrieval and adaptation: can you find the example on kubernetes.io, change the three fields that matter, apply it and verify it inside the minutes the task deserves? For everything else — every CRD shipped by Argo CD, Flux, Tekton, Crossplane, Prometheus, OpenTelemetry, Kyverno, Gatekeeper or Istio — there is no page to retrieve. It is recall, or it is the Quick Reference box, or it is kubectl explain against the cluster in front of you.

Community reports of the CNPE consistently describe roughly seventeen hands-on tasks in 120 minutes, which averages out to something like seven minutes per task — and that average is a lie, because some tasks take ninety seconds and others will eat twenty minutes if you let them. That maths cuts both ways. Seven minutes is plenty of time to open a kubernetes.io page you already know and adapt the example. Seven minutes is not enough to reconstruct a Crossplane Composition from first principles with no reference — which is exactly why Know It Cold, the companion page holding every manifest you must recall unaided, is the highest-value thing this map points at, and why the per-tool maps below are study tools rather than exam tools.

Two in-exam fallbacks partly soften this, and you should rehearse both. The Quick Reference box: when a task involves a tool whose docs are not on the allowlist, the exam may link the specific page you need directly from the task. Read that box on every task before you reach for anything else — it is a permitted resource and it is targeted. kubectl explain: once a CRD is installed in the cluster, its full schema is in the cluster, and kubectl explain rollout.spec.strategy.canary --recursive gives you an authoritative, version-correct field list with no browser at all. For non-Kubernetes-core resources this is often the only reference you will have. Candidates who never learned it are the ones who guess.

The three failure modes to design your prep around

Foxy has collected the same three stories over and over from people who came out of the exam disappointed.

One: expecting a doc site that isn’t there. The single most expensive surprise is discovering at minute twenty that argo-cd.readthedocs.io is not reachable and you never learned the Application spec properly because you assumed you could look it up. Prepare as though the only reference is kubernetes.io, kubectl explain, and your own memory — because that is very nearly the case. Rule: if you cannot write a resource from memory today, that resource is on your study list, not your lookup list.

Two: the rabbit hole. A task looks nearly done, so you keep pushing. Twelve minutes later you’re debugging a webhook certificate and three easy tasks sit untouched. The universally repeated advice from people who passed: anything over five to seven minutes gets flagged and abandoned, and you come back only if there’s time at the end. Partial credit exists — people have passed without finishing every task — so a half-done task you leave behind still scores, and an unattempted easy task scores zero.

Three: not reading all the tasks first. Spend the first three or four minutes skimming every task and grading it: trivial / known / unknown. Bank all the trivial ones, then the known ones, then spend what’s left on the unknowns. This also lets your subconscious chew on the hard ones while your hands do the easy ones.

◆ Key idea

Split your study goal in two, because the allowlist does. For anything on kubernetes.io: “I must be able to reach a working example in under thirty seconds, from a cold browser.” For everything else: “I must be able to type a working Rollout from an empty file, and recover the field names with kubectl explain when I stall.” Time yourself on both. The first is a browser drill; the second is a blank-editor drill, and it is the one most candidates skip.

What you are allowed to open — and how to check

☺ Like you’re 10: You get to bring some books, not every book on the internet. Check the official rules yourself before exam day — don’t take my word for it.

Here is the most important sentence on this page: the only authority on what you may open during the exam is the official Linux Foundation / CNCF documentation for the CNPE. Not a blog. Not a YouTube video. Not this site. Exam rules are revised, permitted-resource lists get tightened and loosened, and a rule that was true when a blog post was written may be false on your exam day.

The pages to read before you book

Read these end-to-end at least once, and re-skim them in the final week:

Two details on those pages routinely catch people out. The first is the search rule: you may use the search box on a permitted site, but you may not open external search results, and you may not follow outbound links off a permitted site onto a non-permitted one. A kubernetes.io page that links to helm.sh does not make helm.sh permitted. The second is the Quick Reference box in the exam interface: task-specific documentation linked from there is permitted, and for non-Kubernetes tooling it is frequently the only reference you will be given. Build the habit of reading it on every task.

⚠ Exam specifics change — verify them yourself

Everything in this course about the CNPE’s logistics — the reported task count (~17), the permitted resources, the exact tool list — is second-hand and may already be out of date by the time you read it. Two figures are not second-hand: the official CNPE FAQ states 2 hours and “a score of 64% or above must be earned to pass”. The official CNCF and Linux Foundation pages are the only authority. Re-read the Resources Allowed page, the Important Instructions page and the current exam curriculum a few days before your exam, and let those override anything written here. Nothing on this page is a substitute for the official rules.

The offline half of the map — which is most of it

Under a narrow allowlist, the division of labour is stark. Memorise names, shapes and the fields that carry meaning for every non-Kubernetes tool; look up syntax and exhaustive field lists for Kubernetes core on kubernetes.io, and for installed CRDs via kubectl explain. If you don’t know that the thing you want is called a “ConstraintTemplate,” nothing in the exam environment will tell you. That division is the whole study strategy — and it’s why the glossary and the flashcards earn their place next to this map rather than being replaced by it.

How to search docs fast

☺ Like you’re 10: There are a few tricks that get you to the right page in one jump instead of ten. Most of them are for studying at home; only the kubernetes.io ones work on the day.

Two audiences for this section. During the exam, the only site these techniques apply to is kubernetes.io — you may use its search box, but you may not click through to an external search engine or follow a link off-site. While studying, the techniques below are how you tour the project doc sites efficiently in the weeks beforehand. Keep the two contexts separate in your head.

Technique 1 — the scoped search-engine query (study time only)

A site: query on a general search engine is almost always faster and more forgiving than an in-site search box, because it matches full page text and tolerates the wrong vocabulary. Use these at your desk in the weeks before the exam — a general search engine is not a permitted in-exam resource, so the payoff on the day is what these searches put into your memory, not the searches themselves:

site:kubernetes.io networkpolicy default deny all ingress
site:kubernetes.io "topologySpreadConstraints" example
site:argo-cd.readthedocs.io applicationset matrix generator
site:fluxcd.io helmrelease values from configmap
site:tekton.dev workspaces pipeline example
site:argoproj.github.io rollouts analysistemplate prometheus
site:docs.crossplane.io composition patches toFieldPath
site:kyverno.io require pod resources policy
site:istio.io authorizationpolicy deny example
site:cert-manager.io issuer selfsigned example

# When you know the name but not the shape, ask for the reference page:
site:kubernetes.io PriorityClass reference
# When you want a copy-paste block, add the magic word:
site:tekton.dev triggers eventlistener yaml example

Two words do enormous work in these queries: example and yaml. Doc pages that contain a complete, copy-pasteable manifest almost always use one of them nearby. A third useful word is reference, which pulls you toward generated API reference pages when you need an exhaustive field list rather than a narrative.

Technique 2 — jump straight to the known anchor

Most project doc sites have the same three shelves, and you should learn which shelf each project keeps its gold on:

ShelfTypical namesUse it when…
Narrative / concepts“Concepts”, “Overview”, “Architecture”You need to understand why — rarely, during an exam. Usually a trap: it costs three minutes and gives you no YAML.
Task / tutorial“Tasks”, “Tutorials”, “Guides”, “Quick start”, “Getting started”, “Walk-through”Your default destination. These pages contain complete working manifests plus the commands to apply and verify them.
API reference“Reference”, “API”, “Specification”, “CRD reference”You have a manifest that almost works and need the exact field name, type, or default. Also the fastest way to check whether a field even exists.

The habit to build, on kubernetes.io during the exam and on every project site while you study: go to the Tasks/Tutorials shelf first, not the Concepts shelf. You want a manifest, not an education. On kubernetes.io this maps cleanly — Tasks and Tutorials hold the complete manifests, Reference holds the field lists, and Concepts is where a timed candidate goes to lose four minutes (with the honourable exception that most Concepts pages end with a full example — scroll to the bottom before you leave).

Technique 3 — match the version

Nearly every doc site has a version selector, usually top-right or in the sidebar. Docs default to latest, which may be ahead of the cluster you’re given. This bites hardest around API-version churn: autoscaling/v2 vs v2beta2, Gateway API v1 vs v1beta1, Flux v1 vs v1beta2, Istio security.istio.io/v1 vs v1beta1. Check the cluster, then set the selector.

# What version is this cluster, really?
kubectl version

# Which API versions does THIS cluster actually serve?
kubectl api-resources | grep -i rollout
kubectl api-versions | grep -i gateway

# The single most under-used doc-avoidance tool: the docs are IN the cluster
kubectl explain networkpolicy.spec.ingress --recursive
kubectl explain hpa.spec.metrics
kubectl explain rollout.spec.strategy.canary   # works for CRDs too, once installed
kubectl explain is a doc site with zero latency

For anything with a schema registered in the cluster — including installed CRDs like Rollout, Canary, Kustomization, or Compositionkubectl explain gives you the authoritative field list for the exact version running in front of you, with no browser round-trip. Add --recursive for the whole tree. Pair it with kubectl api-resources to discover short names and whether a resource is namespaced. Many candidates never touch it and pay for that in browser tabs.

Technique 4 — read the Quick Reference box before you touch the terminal

Because the general doc sites are closed to you, the exam’s own Quick Reference box is the highest-value thing on the screen for any task involving non-Kubernetes tooling. It is a permitted resource, it is task-specific, and it is the only sanctioned route to a Tekton or Crossplane page during the exam. Make reading it step zero of every task, before you open an editor and before you form a plan — a linked page you didn’t notice is a task you solved the hard way for no reason.

For the kubernetes.io half, speed still matters — but be clear about the rule. The Important Instructions state that candidates “are not allowed to have other applications or browser windows running except the one on which the Exam is being shown.” So plan on navigating within the exam’s own browser surface rather than parking a row of windows beforehand. Cold-starting a site — DNS, load, find search box, type, wait, scan — costs fifteen to thirty seconds each time, and you may do it dozens of times. And memorise the kubernetes.io URL patterns for the pages you use most, so you can type a deep link into the address bar rather than navigating to it.

1 · Read the task note namespace & names 2 · Name the kind “this is a Canary” 3 · Retrieve or recall k8s.io · Quick Ref · explain …or from memory 4 · Draft the whole block 5 · Adjust name · ns · selector 6 · Apply & verify get · describe · events ⏱ over 7 min? flag & move on next task You are graded on step 6. Step 3 is memory for most tools, and kubernetes.io for the rest. Never skip step 5 — an unadjusted example is a wrong answer that looks right. Partial credit is real: a flagged half-task still scores; an unread task scores zero.

Map 1 — kubernetes.io/docs, the reference you actually get

☺ Like you’re 10: This is the one book you’re allowed to bring. Learn it better than anything else on this page.

This is the only general doc site on the CNPE allowlist, so it deserves disproportionate study. The good news is that it is genuinely deep, and Kubernetes underpins every domain — a policy task still needs a Deployment to test against, a GitOps task still needs a Service, and an observability task still needs a workload emitting metrics. Whenever a task can be solved with Kubernetes-native objects, this site has your answer.

Its structure is stable and worth internalising as four shelves: Concepts (narrative, but nearly every page ends with a complete example manifest — always scroll to the bottom before leaving), Tasks (how-to pages with manifests and the commands to apply and verify them — your default destination), Tutorials (longer walk-throughs), and Reference (the generated API reference, the kubectl documentation, and the cheat sheet). kubernetes.io/blog is separately permitted and is occasionally the fastest source for a feature-introduction post explaining a newer API — Gateway API and the sidecar-container and in-place-resize features are good examples — but treat it as a supplement, not a primary map.

Two habits that pay off specifically because this site is all you get. First, learn the URL shapekubernetes.io/docs/concepts/…, /docs/tasks/…, /docs/reference/… — so you can type a deep link instead of navigating. Second, learn the API reference, not just the narrative pages: kubernetes.io/docs/reference/kubernetes-api/ gives you the exhaustive, authoritative field list for every built-in kind, which is where you go when a narrative example doesn’t cover the field you need.

If the task asks you to…Go toWhat to copy
Create/patch a Deployment, StatefulSet, DaemonSet, Job or CronJobkubernetes.io → Concepts → Workloads → Workload Management (one page per controller)The full manifest at the top of each page; the Deployment page also carries strategy.rollingUpdate (maxSurge/maxUnavailable) and the rollout/rollback commands
Run stateful workloads — StatefulSet with stable identity and per-pod storageConcepts → Workloads → StatefulSet, plus Tutorials → StatefulSet BasicsThe volumeClaimTemplates block, the headless-Service serviceName pairing (clusterIP: None), podManagementPolicy, and the ordinal-based pod-name/DNS pattern
Run work to completion — Job, CronJobConcepts → Workloads → Job and CronJobcompletions/parallelism/backoffLimit/ttlSecondsAfterFinished; for CronJob the schedule, concurrencyPolicy and successfulJobsHistoryLimit
Expose a workload — ClusterIP / NodePort / LoadBalancer / headlessConcepts → Services, Load Balancing & Networking → ServiceThe Service YAML plus the “Publishing Services (ServiceTypes)” section; clusterIP: None for headless
Route HTTP with IngressConcepts → Services… → IngressThe minimal Ingress, then the “Ingress rules / path types” example — watch pathType: Prefix
Do the same with Gateway APIConcepts → Services… → Gateway API, then gateway-api.sigs.k8s.io → GuidesThe GatewayClass + Gateway + HTTPRoute trio; the traffic-splitting example lives in the Guides
Lock down pod-to-pod traffic (incl. default-deny)Concepts → Services… → Network PoliciesScroll to “Default policies” — the default-deny-all-ingress recipe is there verbatim, plus default-deny-egress and allow-all
Grant permissions — Role, ClusterRole, RoleBindingReference → Access Control → Using RBAC AuthorizationThe “Role examples” and “RoleBinding examples” sections — near-complete answers for most RBAC tasks
Create a ServiceAccount and use it from a PodTasks → Configure Pods and Containers → Configure Service Accounts for PodsThe SA manifest, serviceAccountName in the pod spec, and the token-projection block
Provision storage — StorageClass, PV, PVCConcepts → Storage → Storage Classes and Persistent VolumesThe StorageClass example (note reclaimPolicy, volumeBindingMode) and the PVC example
Cap a namespace’s consumptionConcepts → Policies → Resource Quotas and Limit RangesThe ResourceQuota with requests.cpu/limits.memory, and the LimitRange with default/defaultRequest
Enforce Pod Security Standards on a namespaceConcepts → Security → Pod Security Standards + Pod Security AdmissionThe three namespace labels: pod-security.kubernetes.io/enforce, -audit, -warn, each set to privileged/baseline/restricted (plus …/enforce-version)
Autoscale on CPU or a custom metricTasks → Run Applications → Horizontal Pod Autoscaling (and the HPA walkthrough)The autoscaling/v2 HPA with a metrics: list and behavior: scale-down policy
Control scheduling — priority, taints, affinity, spreadConcepts → Scheduling, Preemption and Eviction → Taints and Tolerations, Assigning Pods to Nodes, Topology Spread Constraints, Pod Priority and PreemptionThe toleration block; nodeAffinity required-vs-preferred; the topologySpreadConstraints example with maxSkew; the PriorityClass manifest
Add liveness / readiness / startup probesTasks → Configure Pods and Containers → Configure Liveness, Readiness and Startup ProbesAll three probe blocks, including initialDelaySeconds, failureThreshold, periodSeconds
Define a CRD with validation, printer columns and subresourcesTasks → Extend Kubernetes → Extend the Kubernetes API with CustomResourceDefinitionsThe full CRD with openAPIV3Schema; then the “Additional printer columns” and “Status subresource / scale subresource” sections lower down
Register an admission webhookReference → Access Control → Dynamic Admission ControlThe ValidatingWebhookConfiguration / MutatingWebhookConfiguration with rules, failurePolicy, sideEffects, admissionReviewVersions
Mount config or secrets into a podConcepts → Configuration → ConfigMaps / SecretsThe envFrom block and the volume+subPath mount pattern
Remember a kubectl incantationReference → kubectl → Quick Reference (the cheat sheet)--dry-run=client -o yaml generators, JSONPath examples, kubectl patch syntax, label/field selectors
Find the exhaustive field list for any built-in kindReference → Kubernetes API reference (grouped by Workloads / Service / Config & Storage / Authorization / Policy / Extend)The exact field name, type, default and required-ness. This is your fallback when a Concepts example doesn’t show the field the task needs — and it is the closest thing to the project API references you won’t have.

☺ Like you’re 10: The Network Policy page has a section that literally hands you the “block everything” recipe. That one bookmark is worth minutes.

🦆 Dot’s-eye view

“The trick someone showed me that saved my exam: stop hand-writing boilerplate. kubectl create deployment web --image=nginx --dry-run=client -o yaml > d.yaml gives me a valid skeleton in one second, and then I only edit the bits the task actually asked for. The docs are for the parts kubectl can’t generate.”

If any of these rows made you think “I don’t actually know what that resource does,” that’s a study signal, not a search signal — go read the Kubernetes substrate, networking, storage & state, or scaling & scheduling first. The map only helps once you know the name of the thing.

What you must know cold — now its own page

☺ Like you’re 10: The recipes nobody will hand you got their own page, because they’re the part you actually have to memorise.

Here is the honest framing: kubernetes.io/docs will carry the Kubernetes-native half of the exam; there is a whole other half it won’t. Argo CD, Flux, Tekton, Rollouts, Crossplane, Prometheus, OpenTelemetry, Kyverno, Gatekeeper and Istio all sit inside named exam domains, and not one of their doc sites is on the allowlist. Your only routes to their specs are memory, the Quick Reference box, and kubectl explain — and memory is the one you control, so those skeletons deserve drilling rather than skimming.

◆ Where the specs went

Every manifest that used to sit here — Argo CD’s Application and ApplicationSet, the Flux pair, Tekton’s three-object chain, Rollout + AnalysisTemplate, Crossplane’s XRD/Composition/claim, ServiceMonitor and PrometheusRule, the OTel Collector config, Kyverno, Gatekeeper and Istio — now lives on Know It Cold — the manifests you must write from memory, annotated, with a table of the three fields people forget on each and the blank-page drill. Study specs there; study where to look here.

Study maps — the project docs, for use before exam day

☺ Like you’re 10: Everything below is homework, not test material. These sites are shut on the day.

The four maps that follow are deliberately kept, because they are genuinely the fastest way to learn these tools — but be clear about what they are now for. Every external link below points at a site you cannot open during the CNPE. They are a study itinerary: a structured tour of where each project keeps its worked examples, so that in the weeks before your exam you can go and read the authoritative source, build the thing, and move the knowledge into memory where the exam can reach it.

Use them in that spirit. When a map says “copy the AnalysisTemplate from Features → Analysis,” read that as go and understand that page well enough to reproduce it. The one exception worth noting: if the exam’s Quick Reference box links a specific page for a task, that page is permitted — and it will usually be one of the pages mapped below, which is another reason to know their shape.

Map 2 — GitOps & continuous delivery (25%)

☺ Like you’re 10: This is the biggest exam domain, so these tabs are the ones you want open first.

The single largest domain, and the one where tool choice may be offered to you. Argo CD and Flux both appear in the official tool list; so do Tekton, Argo Workflows, Argo Rollouts and Flagger. You do not need to be expert in all six — but since none of their doc sites are open to you on the day, you need enough familiarity with each to write its core resource unaided. Work through this map at your desk, then close it and run the blank-page drill above. Pair it with GitOps Workflows and CI/CD & Progressive Delivery.

If the task asks you to…Go toWhat to copy
Create an Argo CD Application pointing at a repo pathargo-cd.readthedocs.io → Operator Manual → Declarative SetupThe Application CR — source.repoURL/targetRevision/path, destination.server/namespace, project
Turn on auto-sync, self-heal and pruneargo-cd.readthedocs.io → User Guide → Automated Sync PolicysyncPolicy.automated: {prune: true, selfHeal: true} and syncOptions: [CreateNamespace=true]
Order resources during a sync, or run a pre/post jobUser Guide → Sync Phases and Waves and Resource HooksThe argocd.argoproj.io/sync-wave annotation and the argocd.argoproj.io/hook: PreSync Job example
Generate many Applications (per folder, per cluster, per PR)Operator Manual → ApplicationSetGeneratorsThe generator block you need — List, Git (directories/files), Cluster, Matrix, Merge, Pull Request — plus the surrounding template:
Restrict what a team may deploy in Argo CDOperator Manual → Projects, and RBACThe AppProject with sourceRepos, destinations, clusterResourceWhitelist; and the policy.csv RBAC lines
Point Flux at a Git repofluxcd.io → Components → Source → GitRepositoryThe GitRepository with interval, url, ref.branch, and secretRef for private repos
Make Flux apply a path (with prune, health-wait, dependencies)fluxcd.io → Components → Kustomize → KustomizationThe Kustomization with sourceRef, path, prune: true, wait: true, dependsOn, targetNamespace, and the postBuild.substitute block
Install a Helm chart the GitOps way with Fluxfluxcd.io → Components → Helm → HelmRelease (plus HelmRepository)HelmRepository + HelmRelease with chart.spec, values, valuesFrom, install.createNamespace
Bootstrap Flux onto a clusterfluxcd.io → Installation → Bootstrap, and the flux CLI referenceThe flux bootstrap github --owner --repository --path --personal command line; also flux create, flux reconcile, flux get all -A
Write a Tekton Task or Pipelinetekton.dev → Pipelines → Tasks and → PipelinesThe Task with params, steps, results; the Pipeline with tasks[].runAfter and taskRef; then a PipelineRun to fire it
Share a git clone or cache between Tekton stepstekton.dev → Pipelines → WorkspacesThe workspaces: declaration in Task + Pipeline and the workspaces[].persistentVolumeClaim binding in the PipelineRun
Trigger a pipeline from a webhooktekton.dev → TriggersThe EventListener + TriggerBinding + TriggerTemplate trio from the getting-started example
Build a workflow with steps or a DAGargo-workflows.readthedocs.io → Walk Through (“Steps”, “DAG”, “Artifacts”)The steps: template (nested lists = parallel) vs the dag.tasks[].dependencies template; plus inputs.parameters / outputs
Do a canary or blue/green with Argo Rolloutsargoproj.github.io/argo-rollouts → Features → Canary / Blue-Green, and SpecificationThe Rollout with strategy.canary.steps (setWeight/pause) or strategy.blueGreen (activeService, previewService, autoPromotionEnabled)
Gate a rollout on a Prometheus metricargo-rollouts → Features → AnalysisThe AnalysisTemplate with metrics[].provider.prometheus.query, successCondition, interval, failureLimit — and the analysis: step that references it
Do progressive delivery with Flagger insteadfluxcd.io/flagger → Tutorials (pick the one matching the mesh/ingress in use)The Canary CR: targetRef, service.port, analysis.interval/threshold/maxWeight/stepWeight, and metrics + webhooks (load test)
⚠ The Rollouts/Flagger confusion trap

Argo Rollouts replaces your Deployment with a Rollout object (you change kind: and point Services at it). Flagger keeps your Deployment and creates shadow objects around it via a Canary CR. If you copy the wrong tool’s example the manifest will apply cleanly and do nothing useful. Read which tool the task names, twice, before you copy anything.

Map 3 — Platform APIs & self-service (25%)

☺ Like you’re 10: This is the “build a friendly button for developers” shelf — custom APIs, Crossplane, and the developer portal.

The other 25% domain. Tasks here tend to be “define an abstraction and prove a developer can use it”: a CRD, a Crossplane composite, a Backstage template, a Helm chart or Kustomize overlay. Background reading: Platform APIs & CRDs, Self-Service, IaC & Control Planes, Config Management.

If the task asks you to…Go toWhat to copy
Define a new platform API (CRD) with a typed schemakubernetes.io → Extend Kubernetes → CustomResourceDefinitionsThe CRD skeleton; then versions[].schema.openAPIV3Schema, additionalPrinterColumns, subresources: {status: {}, scale: {}}, names.shortNames, scope
Publish a Crossplane API for developers to claimdocs.crossplane.io → “Composite Resource Definitions (XRD)”The CompositeResourceDefinition with group, names, claimNames, and the versions[].schema.openAPIV3Schema of developer-facing fields
Map that API onto real cloud resourcesdocs.crossplane.io → “Compositions”The Composition with compositeTypeRef, resources[].base, and the patches list (fromFieldPathtoFieldPath, transforms, ToCompositeFieldPath for outputs)
Use composition functions (pipeline mode)docs.crossplane.io → “Composition Functions”The mode: Pipeline composition with pipeline[].functionRef and the function’s input block
Install/configure a Crossplane providerdocs.crossplane.io → “Providers”The Provider package manifest and the ProviderConfig with its credentials.secretRef
Let a developer request an environment (the claim)docs.crossplane.io → “Claims” / “Composite Resources”The namespaced claim manifest — the small, friendly YAML a developer writes; note it uses the claimNames kind, not the X-prefixed composite kind
Add a scaffolding template to Backstagebackstage.io → Features → Software Templates → “Writing Templates”The Template entity: spec.parameters (the form), spec.steps (fetch:template → publish:github → catalog:register), and spec.output.links
Register a component in the Backstage catalogbackstage.io → Software Catalog → Descriptor FormatA catalog-info.yaml: apiVersion: backstage.io/v1alpha1, kind: Component, spec.type/lifecycle/owner/system, and the annotations block
Template or override configuration with Helmhelm.sh/docs → “Chart Template Guide” and “Helm Commands”values.yaml patterns, {{ .Values.x | default }}, helm upgrade --install -f, helm template for a dry render
Patch a base manifest per environment with Kustomizekubernetes.io → Declarative Management Using Kustomize, plus kubectl.docs.kubernetes.io → Kustomize referenceThe kustomization.yaml with resources, patches (strategic-merge and JSON 6902), images[].newTag, configMapGenerator, namePrefix, commonLabels

☺ Like you’re 10: Crossplane has two YAMLs that look almost the same — the definition (for the platform team) and the claim (for the developer). Check which one the task wants.

🦆 Dot’s-eye view

“When a task says ‘so a developer can request a database with five lines of YAML,’ the deliverable I actually care about is the claim — the small friendly one. The XRD and Composition are the plumbing behind it. If your answer doesn’t end with something a person like me would happily type, you probably built half the task.”

Map 4 — Observability & operations (20%)

☺ Like you’re 10: This shelf is about seeing what’s happening: numbers, dashboards, traces, and what things cost.

Observability tasks split into “make the platform collect X” and “write the query/rule that uses X.” The collection half is nearly always a copyable manifest; the query half is where you may genuinely need to think, so budget accordingly. See also Observability, Reliability & Incidents, and FinOps.

If the task asks you to…Go toWhat to copy
Scrape a new service with Prometheus Operatorprometheus-operator.dev → “Getting Started” / API referenceThe ServiceMonitor (or PodMonitor) — selector.matchLabels, namespaceSelector, endpoints[].port (the named port) and interval. Watch the operator’s own serviceMonitorSelector/release label.
Add an alerting ruleprometheus-operator.dev → API reference → PrometheusRule; syntax at prometheus.io → Alerting RulesThe groups[].rules[] block with alert, expr, for, labels.severity, annotations.summary
Write PromQL (rate, percentiles, aggregation)prometheus.io → Querying → Basics, Functions, and “Examples”rate(x_total[5m]), sum by (le) + histogram_quantile(0.99, …), increase(), topk(), offset/comparison operators
Route alerts to a receiverprometheus.io → Alerting → ConfigurationThe route tree (group_by, group_wait, repeat_interval, nested routes with match_re) and a receivers entry; plus inhibit_rules
Provision a Grafana datasource or dashboard as codegrafana.com/docs → Administration → ProvisioningThe apiVersion: 1 datasources YAML (type: prometheus, url, isDefault) and the dashboards provider block with its path
Configure an OpenTelemetry Collectoropentelemetry.io → Collector → ConfigurationThe four-block config: receivers (otlp grpc/http), processors (batch, memory_limiter, resource), exporters (otlp/prometheus/debug), and — the bit people forget — the service.pipelines that wires them together
Instrument workloads automatically in-clusteropentelemetry.io → Kubernetes → “OpenTelemetry Operator”The OpenTelemetryCollector CR and the Instrumentation CR + the instrumentation.opentelemetry.io/inject-… pod annotation
Deploy or query distributed tracesjaegertracing.io/docs → Getting Started / DeploymentThe all-in-one deployment for a quick stand-up, and the OTLP ingestion settings so the Collector can export to it
Report workload costopencost.io/docs → Installation / APIThe install manifest or Helm values, and the allocation API query shape (/allocation with window and aggregate)
Autoscale on a queue/event metrickeda.sh/docs → Scalers (pick your scaler) The ScaledObject with scaleTargetRef, minReplicaCount/maxReplicaCount, triggers[].type + metadata, and TriggerAuthentication if credentials are needed

☺ Like you’re 10: With the OpenTelemetry Collector, writing the receivers and exporters isn’t enough — you also have to say which ones connect to which. That’s the “pipelines” bit, and forgetting it is the classic mistake.

Map 5 — Security, policy & the mesh (15%)

☺ Like you’re 10: The guardrail shelf: rules that say no, encryption between services, and checks on what you ship.

Both major policy engines ship enormous libraries of ready-made policies — and neither library is reachable during the exam, so treat them as the best study resource in this domain rather than a lifeline on the day. Work through the Kyverno policy library and the gatekeeper-library now: read a dozen policies until the ClusterPolicy and ConstraintTemplate shapes feel obvious, so that when a task says “block containers running as root” you can write one rather than find one. Companion pages: Security & Policy Enforcement, Governance & Compliance, Secrets Management.

If the task asks you to…Go toWhat to copy
Enforce a rule with Kyverno (validate)kyverno.io/policies — the policy library, searchable — plus kyverno.io → Writing PoliciesA whole ClusterPolicy: spec.validationFailureAction: Enforce (vs Audit), rules[].match.any.resources.kinds, and validate.pattern or validate.deny.conditions
Inject a default with Kyverno (mutate)kyverno.io → Writing Policies → “Mutate Rules”; examples in the policy library under Other/Best PracticesThe mutate.patchStrategicMerge block (or patchesJson6902), and +(…) anchor syntax for conditional patches
Auto-create resources for new namespaces (generate)kyverno.io → Writing Policies → “Generate Rules”The generate rule with apiVersion/kind/name/namespace, synchronize: true, and data: vs clone:
Enforce a rule with OPA GatekeeperGatekeeper docs and the gatekeeper-libraryThe matching ConstraintTemplate (Rego in spec.targets[].rego, schema in spec.crd.spec.validation) — note the rule body Gatekeeper expects is violation[{"msg": msg}] { … }, not denyand its example Constraint with match.kinds + enforcementAction + parameters
Write raw Rego / test a policyopenpolicyagent.org/docs → Policy Language, and the Rego PlaygroundThe rule shape — deny[msg] { … } for standalone OPA, violation[{"msg": msg}] { … } inside a Gatekeeper ConstraintTemplate — plus input.review.object paths for admission input, input.parameters for Constraint parameters, and opa eval / opa test usage
Require mTLS across a namespace (Istio)istio.io → Tasks → Security → Authentication; reference at PeerAuthenticationThe PeerAuthentication with mtls.mode: STRICT — mesh-wide (in the Istio root namespace, no selector) or namespace/workload-scoped
Allow only certain callers (Istio)istio.io → Tasks → Security → Authorization; reference at AuthorizationPolicyThe AuthorizationPolicy with action: ALLOW/DENY, selector, rules[].from.source.principals (the SPIFFE ID) and to.operation.methods/paths. Remember the empty-spec deny-all policy.
Route traffic with Istio + Gateway APIistio.io → Tasks → Traffic Management, and the “Kubernetes Gateway API” taskEither the classic Gateway+VirtualService+DestinationRule, or the Gateway API Gateway+HTTPRoute with weighted backendRefs
Do the same with Linkerdlinkerd.io/2 → Getting Started; then Tasks & Features (“Automatic mTLS”, “Linkerd Viz”)linkerd install --crds | kubectl apply -f - then linkerd install | kubectl apply -f - (the CRD step is separate in current Linkerd and is easy to miss), linkerd check, the linkerd.io/inject: enabled annotation, and linkerd viz stat/linkerd viz tap for golden metrics
Issue TLS certificates in-clustercert-manager.io/docs → Configuration (Issuers) and Usage → CertificateA ClusterIssuer/Issuer (selfSigned, CA, or ACME with a solver) and the Certificate with secretName, dnsNames, issuerRef; plus the Ingress cert-manager.io/cluster-issuer annotation shortcut
Keep secrets out of Gitexternal-secrets.io (ExternalSecret) or the Sealed Secrets project docsSecretStore/ClusterSecretStore + ExternalSecret with target.name and data[].remoteRef; or kubeseal usage and the SealedSecret shape
Scan an image or manifesttrivy.dev → Docs → Scanner (Vulnerability / Misconfiguration / Secret)trivy image --severity HIGH,CRITICAL --exit-code 1 IMG, trivy config ./manifests, trivy fs, and the --format options for reports
Sign or verify an artifactdocs.sigstore.dev → Cosign (Signing / Verifying)cosign sign --key and cosign verify (keyless variants use --certificate-identity + --certificate-oidc-issuer); pair with a Kyverno verifyImages rule to enforce it
Detect runtime threatsfalco.org/docs → RulesThe custom rule shape: - rule: with condition, output, priority, and macro/list definitions
⚠ Enforce vs audit — the silent zero

Both policy engines default toward not blocking. A Kyverno policy with validationFailureAction: Audit, or a Gatekeeper Constraint with enforcementAction: dryrun, will apply successfully, look correct, log violations — and let the bad pod through. If a task says “prevent,” “block,” or “reject,” you must set enforcement explicitly, then prove it by trying to create a violating pod and seeing the rejection.

“Copy and adjust” — the discipline that turns an example into points

☺ Like you’re 10: Never reuse a recipe without changing the names to match your kitchen. Then taste it before you call it done.

Whether the example came from kubernetes.io, from a Quick Reference link, from an existing object already in the cluster, or straight out of your own memory, the same thing loses points next. Examples and remembered skeletons alike default to a fictional nginx in the default namespace; the grader is checking a specific object, in a specific namespace, with a specific name. Adopt a fixed checklist for every block you write:

# ── What the docs give you ─────────────────────────────────────
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress          # ① doc's name
  namespace: default                  # ② doc's namespace (often absent!)
spec:
  podSelector: {}                     # ③ matches ALL pods in the ns
  policyTypes:
  - Ingress

# ── What the task actually wanted ──────────────────────────────
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-ingress-payments     # ① renamed to the required name
  namespace: payments                 # ② the namespace the task named
spec:
  podSelector: {}                     # ③ left broad ON PURPOSE — verified intent
  policyTypes:
  - Ingress                           # ④ add Egress too IF the task said "all traffic"

The four-point sweep, every time: ① name — does it match the string in the task, character for character? ② namespace — did the doc omit it (defaulting you to default)? ③ selectors and labels — do they actually match the workload in front of you, or the doc’s imaginary one? ④ scope — did the task ask for more than the example covers (both traffic directions, all namespaces, a second port)?

Then verify — the step that separates a pass from a near-miss

Applying without verifying is how people lose points on tasks they genuinely solved. Verification is cheap; make it reflexive.

# Did it even apply, and is the controller happy with it?
kubectl apply -f policy.yaml
kubectl get networkpolicy -n payments
kubectl describe networkpolicy deny-all-ingress-payments -n payments

# For anything reconciled by a controller, the STATUS is the truth
kubectl get application -n argocd            # SYNC STATUS / HEALTH STATUS
kubectl get kustomization -A                 # READY column + message
kubectl get rollout -n demo                  # DESIRED/CURRENT/UP-TO-DATE
kubectl get certificate -A                   # READY=True or it did not work
kubectl get clusterpolicy                    # Kyverno: BACKGROUND / READY

# When status is unhelpful, events almost always name the real problem
kubectl get events -n payments --sort-by=.lastTimestamp | tail -20
kubectl describe pod <pod> -n payments | sed -n '/Events/,$p'
kubectl logs -n argocd statefulset/argocd-application-controller --tail=50

# Prove a policy BLOCKS — the only real test of an enforcement task
kubectl run bad --image=nginx --privileged -n payments   # expect: rejected
◆ Verification is a memory item too

Half of “how do I verify this?” has a documented answer — and since those docs are closed during the exam, the verification move for each tool is something to learn now. Argo CD sync statuses and what each one means; flux get all -A; the Istio task that ends in a curl returning 403; walking cert-manager’s Certificate → CertificateRequest → Order → Challenge chain. Read the troubleshooting page of the two or three tools you’re least confident in while you still can, and note that every CLI carries its own help (argocd app --help, flux --help, linkerd check) which is available in the exam terminal. Then read the troubleshooting playbook for the general drill.

Your exam-day reference plan

☺ Like you’re 10: You can’t line up a row of windows before you start — you get one. So the trick is knowing your way around the one site you’re allowed, fast. The long list of bookmarks is homework, not exam kit.

This is the part most study guides get wrong, so be deliberate — and the first thing to get right is that there is no tab allowance to plan around. The Important Instructions say candidates “are not allowed to have other applications or browser windows running except the one on which the Exam is being shown.” Anything you reach, you reach inside the exam’s own environment, and it must come from the permitted list: kubernetes.io/docs, kubernetes.io/blog, and pages the exam itself links from its Quick Reference box. That is a short list, which makes the terminal shortcuts below disproportionately important.

PERMITTED — park these before you read task one
 1  kubernetes.io/docs/                          ← home base; use its search box
 2  kubernetes.io/docs/reference/kubectl/quick-reference/     ← the cheat sheet
 3  kubernetes.io/docs/concepts/services-networking/network-policies/   ← default-deny
 4  kubernetes.io/docs/reference/access-authn-authz/rbac/     ← Role/RoleBinding
 5  kubernetes.io/docs/reference/kubernetes-api/  ← exhaustive fields for built-in kinds
 +  kubernetes.io/blog/                          ← permitted; good for newer APIs
 +  whatever the task's own "Quick Reference" box links — permitted, task-specific

NOT PERMITTED during the CNPE — study sites only, closed on the day
    argo-cd.readthedocs.io · fluxcd.io · tekton.dev · argoproj.github.io/argo-rollouts
    docs.crossplane.io · backstage.io · prometheus.io · prometheus-operator.dev
    opentelemetry.io · kyverno.io · open-policy-agent.github.io · istio.io · linkerd.io
    helm.sh/docs · cert-manager.io · grafana.com/docs · keda.sh · trivy.dev · falco.org
    …and general search engines. Do not follow outbound links off kubernetes.io either.

IN-TERMINAL SHORTCUTS — now your primary reference for everything above
  kubectl explain <kind>.spec --recursive        # authoritative, version-correct, instant
  kubectl api-resources | grep -i <word>         # find the kind, group + short name
  kubectl get <kind> -A -o yaml                  # an existing object IS a worked example
  kubectl create <thing> --dry-run=client -o yaml # generate boilerplate, don't type it
  argocd app --help / flux --help / kubectl <x> -h  # every CLI carries its own docs
  man <cmd>  ·  ls /usr/share/doc/               # locally installed docs are permitted

Re-check the rules, and re-walk the map, before exam day

Two things drift. The allowlist drifts — the Linux Foundation revises permitted resources per exam, and a page that describes the rules today (including this one) may be wrong by your exam date. Doc sites drift — pages move, sections get renamed, projects redesign navigation, and deep links rot, which matters for the study maps above.

⚠ Two or three days before: verify the rules first, then the links

First, re-read the official Resources Allowed page and Important Instructions: CNPE, and read the CNPE entry specifically rather than a neighbouring exam’s. If the permitted list has widened or narrowed since this page was written, the official page wins and this one is wrong. Second, sit down with the study maps and actually click through them; any that 404, find the new home. Half an hour, and it is the highest-return thirty minutes of your final week — you are re-calibrating to the world as it exists now.

🐿️ Nutty’s workshop · 20 min

The cold-start drill — a study-phase exercise, not an exam simulation, since most of these sites are closed on the day. Open a fresh browser window and set a timer. For each of these ten prompts, race to a page containing a complete example — you are not solving them, only finding them: (1) a default-deny-ingress NetworkPolicy; (2) an Argo CD ApplicationSet with a Git directory generator; (3) a Flux HelmRelease; (4) a Tekton Pipeline with a shared workspace; (5) an Argo Rollouts AnalysisTemplate using Prometheus; (6) a Crossplane Composition with patches; (7) a ServiceMonitor; (8) an OpenTelemetry Collector config with a full pipeline; (9) a Kyverno policy that requires resource limits; (10) an Istio AuthorizationPolicy that denies by default. Target: under 30 seconds each. Only number one is a genuine exam skill — it lives on kubernetes.io. The other nine are reading assignments: whichever ones took you over a minute are the specs you least know, so read them properly and then run the blank-page drill on them. Then take all ten into the practice tasks and actually build them.

🎬 At the Platform Guild
🦊

Foxy: Right, I read the actual Resources Allowed page instead of a blog post. Guess which doc sites you get in the CNPE.

🐿️

Nutty: …all of them in the tool list?

🦊

Foxy: kubernetes.io/docs. The blog. Whatever the task links in its Quick Reference box. Local man pages. That’s the list. No Argo CD, no Crossplane, no Prometheus, no Helm.

🐿️

Nutty: So half my beautiful catalogue is a reading list, not a lookup table. Fine — I re-file it under “before,” and the specs go in the memory drawer. Tasks for manifests, Reference for fields, Concepts for never — and that only applies to the one site I actually get.

👺

Gizmo: Or… just wing the Crossplane YAML on the day. How different can it be from a CRD? Ship it! 🤑

🐢

Timmy: And it lands in the default namespace called nginx, and scores nothing. Four fields, Gizmo: name, namespace, selector, scope. Then verify.

🤖

Recon: BEEP. Verification available locally. kubectl explain rollout.spec.strategy.canary. Zero network latency. Version-correct by construction.

🦆

Dot: At my job nobody remembers YAML, we remember which tab. Turns out the exam is stricter than my job.

So the thesis has two halves, and both are the actual job. For everything Kubernetes-native, the CNPE is not asking you to become a walking API reference — it is asking you to open kubernetes.io, adapt the right example, and prove it works. For everything else, the exam has quietly decided that a platform engineer should be able to write an Argo CD Application, a Tekton Pipeline or a Kyverno ClusterPolicy without help, and it is testing exactly that. Prepare for both halves and the narrow allowlist stops being a threat. Pair this map with the logistics in the exam guide, the lived experience in the field notes, the muscle memory in the command reference and the lab track, and the final sweep in the checklist. Then go and be fast.

🐢 Timmy’s checkpoint

1. Name the four categories of resource you are permitted to use during the CNPE — and name three in-scope tools whose docs you will not have. 2. Which pages are the authority on what you may open, and why shouldn’t you trust this one? 3. You may use the search box on a permitted site — so what are you not allowed to do with the results? 4. Name the four things you must sweep for after writing a manifest from an example or from memory. 5. A task says “prevent pods from running as root.” Which two policy engines could do it, and the one field on each that decides whether it actually blocks anything? 6. Give one in-terminal way to look up a CRD’s fields without opening a browser at all.

Check your answers
  1. kubernetes.io/docs (including translations); kubernetes.io/blog/; task-specific documentation linked from the exam’s own Quick Reference box; locally installed documentation (/usr/share, distribution packages, man pages). Not available: any three of Argo CD, Flux, Tekton, Crossplane, Backstage, Prometheus, OpenTelemetry, Kyverno, Gatekeeper, Istio, Helm.
  2. The official Resources Allowed page (docs.linuxfoundation.org/tc-docs/certification/certification-resources-allowed) and Important Instructions: CNPE (…/important-instructions-cnpe), plus the Linux Foundation certification FAQ. Don’t trust this page — or any blog — because permitted resources, task counts and rules change, and only the official pages are current. Read the CNPE row, not a neighbouring exam’s: CKA/CKAD also allow helm.sh/docs and CKS allows Falco/etcd/Cilium/Istio, but the CNPE does not.
  3. You may not open external search results, and you may not follow outbound links from a permitted site to a non-permitted one. A link from kubernetes.io to helm.sh does not make helm.sh permitted.
  4. ① name (exact string from the task), ② namespace (examples often omit it, defaulting you to default), ③ selectors/labels (must match the real workload, not the example’s), ④ scope (did the task ask for more than the example covers — both traffic directions, extra ports, all namespaces?).
  5. Kyverno (a ClusterPolicy) or OPA Gatekeeper (a ConstraintTemplate + Constraint) — and note you must write these from memory, since neither kyverno.io/policies nor the gatekeeper-library is open during the exam. The deciding field is Kyverno’s spec.validationFailureAction: Enforce (not Audit) and Gatekeeper’s Constraint enforcementAction: deny (not dryrun). Then prove it by trying to create a violating pod. (Pod Security Admission is a third route, and its docs are on kubernetes.io.)
  6. kubectl explain <kind>.spec --recursive — it reads the schema registered in the cluster, so it works for installed CRDs and is guaranteed version-correct. Support it with kubectl api-resources and any CLI’s --help.