KCA Mock Exam · Set 2
This is the companion paper to Set 1: fifty more multiple-choice questions, weighted question-for-question to the same six domains of the official KCA curriculum — sixteen on Writing Policies, nine on Fundamentals of Kyverno, nine on Installation, Configuration & Upgrades, six on the Kyverno CLI, five on Applying Policies, five on Policy Management. Every question and scenario below is original to this course, built around a fictional orbital-habitat cluster rather than anything lifted from CNCF material or reused from elsewhere on this shelf. KCA is a pure knowledge exam — no live cluster, no terminal — so there is nothing to install here: read the stem, pick an answer, then read the explanation underneath whether you got it right or not. Sit it as one uninterrupted block, answer every question even when guessing, and treat each miss as a pointer to exactly which part of the blueprint page to re-read.
This is the second half of a two-part practice test, and it's built the same way the first half was: fifty questions, sharing out the marks exactly the way the real Kyverno test does, with the biggest topic getting the most questions and the smallest getting the fewest. The scenarios are new, though — different fictional spaceship parts, different fictional policies, so you can't just remember an answer from last time. Answer before you peek at the explanation, even when you're only half sure. Getting it wrong here, with the right answer sitting right underneath, is how the wrongness turns into rightness by exam day.
How to sit this paper
☺ Like you're 10: Set a timer, close every other tab, and go straight through without stopping to look anything up.
A mock paper only tells you the truth if you sit it under the conditions it's imitating. Looking things up mid-paper measures your search skills, not your recall — so treat this like the real 90-minute sitting: one block, no documentation open, no other tabs, and a committed answer on every question, even a guessed one. Nothing published states that Linux Foundation multiple-choice exams deduct marks for a wrong answer, so there is no reason to ever leave one blank.
The protocol
- Set a clock for 90 minutes. That's the duration the Linux Foundation publishes for KCA — see the logistics table on the blueprint page for the full picture and why it's worth re-verifying before you book.
- Answer, then open the explanation. If it just confirms what you thought, move on. If it surprises you, write down the concept — that list becomes your revision plan for the next two days.
- Don't re-sit immediately. Go and re-read your two weakest domains first. A second attempt an hour later measures short-term memory, not knowledge.
- Sit Set 1 and this paper on separate days if you haven't already — same weighting, different scenarios, and together they're a much more honest signal than either alone.
What this paper deliberately is not
It isn't a leaked or reconstructed exam — the wording, the fictional cluster, and every resource name below are original to this course, not the CNCF's. A multiple-choice paper is the right shape of practice specifically because KCA is knowledge-based: you pick answers, you never touch a live cluster, unlike the fully performance-based LFCS or the hybrid ICA elsewhere on this shelf. And it isn't a general Kubernetes security exam — this course assumes the five core Kubernetes certifications, including CKS, are already cleared over in the sibling Kubernetes course. Nothing here re-teaches kubectl, RBAC fundamentals, or admission-control theory in general — only Kyverno's own idioms on top of them.
How the fifty questions are weighted
☺ Like you're 10: The questions are shared out the same way the real test shares out its marks — the biggest topic gets almost a third, the smallest two get a tenth each.
The six published weights — 32%, 18%, 18%, 12%, 10%, 10% — are applied to fifty questions the same way the blueprint page applies them to the real exam. The arithmetic lands exactly, with no remainder to argue about: 32% of 50 is 16, 18% of 50 is 9 (twice), 12% of 50 is 6, and 10% of 50 is 5 (twice). Add them up — 16 + 9 + 9 + 6 + 5 + 5 — and you get exactly 50, so unlike some forty-question papers on this shelf, no domain here needs a rounding tie-break at all.
Score yourself by domain, not just by total. Missing three of five Policy Management questions costs far less than missing three of sixteen Writing Policies questions — the domains are not equally dangerous to be weak in, because they don't carry equal weight on the real paper either.
The fifty questions run across three blocks, each mixing all six domains rather than grouping them — exactly like the real exam, where you never know which domain the next question belongs to. Budget your 90 minutes roughly in proportion to each domain's share, with a few minutes held back at the end for anything you flagged:
The paper — 50 questions across six domains
☺ Like you're 10: Read the recipe card if there is one, pick your best answer, then check yourself before moving to the next one.
Each question names its domain in parentheses. On the real exam you won't get that label, so if you sit this paper a second time, try covering the domain tags and see how many you can still place by content alone. Every resource, namespace and policy name below belongs to one running fiction — an orbital habitat cluster called orbit — used only to make the scenarios concrete.
Block 1 — Q1–17
Q1 (Writing Policies). A validate rule is installed using the current per-rule schema, with no failureAction field set anywhere inside its validate block. A resource is created that violates the rule's pattern. What happens?
- A. The resource is rejected immediately —
Enforceis the default - B. The violation is recorded in a policy report, but the resource is still admitted — the default
failureActionisAudit, notEnforce - C. The resource is rejected only if
background: trueis also set - D. The rule is skipped entirely, since
failureActionis required for the rule to evaluate at all
Check the answer
B. Leaving failureAction unset does not mean "no action" — it means the rule quietly audits every violation instead of blocking any of them. Enforcement has to be requested explicitly.
Q2 (Fundamentals of Kyverno). Within a single ClusterPolicy, can one entry inside spec.rules[] declare both validate and mutate at the same time?
- A. Yes, freely — both actions execute together as one rule
- B. No — each rule declares exactly one of
validate,mutate,generate, orverifyImages; combining two actions means writing two separate rules, not merging them into one - C. Only if
background: trueis also set - D. Only inside a namespaced
Policy, never aClusterPolicy
Check the answer
B. A rule is exactly one job. A policy with several jobs to do is a policy with several rules, each carrying its own match and its own single action.
Q3 (Installation, Configuration, and Upgrades). What is the standard Helm-based method to install Kyverno for the first time onto a cluster?
- A.
kubectl apply -f https://kyverno.io/install.yaml— Helm is never the named method - B. Add the
kyvernoHelm repo, thenhelm install kyverno kyverno/kyverno -n kyverno --create-namespace, which installs the CRDs and the controllers together - C. A mandatory three-chart split — a base chart, a control-plane chart, and a gateway chart — with no single-chart option
- D.
istioctl install --set profile=kyverno
Check the answer
B. Helm is the curriculum's named installation method, and the standard path is one repo add and one helm install against the kyverno/kyverno chart.
Q4 (Writing Policies). A precondition on a rule reads: key: "{{ request.operation }}", operator: AnyIn, value: [CREATE, UPDATE]. A DELETE request arrives that otherwise satisfies the rule's match block. What happens?
- A. The rule still evaluates its
validatepattern against the DELETE - B. The precondition evaluates false, so the rule is skipped entirely for that request — a cheaper filter than trying to encode the same logic inside the pattern itself
- C. DELETE requests are always evaluated regardless of any precondition
- D. Preconditions can only reference
request.object, neverrequest.operation
Check the answer
B. Preconditions are a gate that runs before the rule's main action — a false precondition means the rule does nothing at all for that request, cheaply, without ever touching pattern.
Q5 (Kyverno CLI). What is the key advantage of kyverno apply ./policies/ --resource ./manifests/ over applying a policy straight to a live cluster to see what it does?
- A. It's simply faster, nothing else changes
- B. It evaluates the policies against the manifest files with no cluster required at all — safe to run against arbitrary local YAML before anything touches a real environment
- C. It automatically fixes any violations it finds
- D. It requires cluster-admin privileges, unlike a live apply
Check the answer
B. This is the whole point of the standalone CLI: rehearse a policy change against manifests on disk, with zero cluster dependency, before it ever reaches a real environment.
Q6 (Policy Management). What's the difference between kubectl get polr -A and kubectl get cpolr?
- A. They're aliases for exactly the same underlying resource
- B.
polr(PolicyReport) holds results for namespaced resources, one report per namespace;cpolr(ClusterPolicyReport) holds the cluster-scoped equivalent, for resources likeNamespaceitself - C.
cpolris deprecated and no longer produced by current Kyverno releases - D.
polronly ever shows failing results, never passing ones
Check the answer
B. Scope is the whole distinction — namespaced results land in a PolicyReport per namespace, cluster-scoped results land in the cluster-wide ClusterPolicyReport.
Q7 (Writing Policies). Which two mechanisms can a mutate rule use to rewrite an incoming resource on its way in?
- A.
patchStrategicMergeandpatchesJson6902(an RFC 6902 JSON patch) - B.
patternanddeny - C.
generateandclone - D.
webhookTimeoutSecondsandbackground
Check the answer
A. A strategic merge patch reads like the object it's patching; an RFC 6902 JSON patch is a list of explicit op/path/value operations. Both belong to mutate, not to any of the other three rule types.
Q8 (Applying Policies). A ClusterPolicy is installed with background left unset, so it defaults to true. What does this mean for resources that already existed in the cluster before the policy was created?
- A. Nothing — policies never evaluate resources that predate them, under any setting
- B. They get evaluated too — the background controller periodically scans existing resources against the policy, in addition to the live admission path catching new and updated ones going forward
- C.
backgroundonly ever affectsgeneraterules, nevervalidate - D. Pre-existing violating resources are automatically deleted
Check the answer
B. Admission control only ever sees requests in flight; background scanning is what closes the gap for everything that was already sitting in the cluster before the policy arrived.
Q9 (Fundamentals of Kyverno). Why can a platform engineer write and review Kyverno policies without learning a brand-new domain-specific language first?
- A. Kyverno rules are written in Rego, the same language used by several other admission-control tools
- B. A Kyverno policy is itself an ordinary Kubernetes YAML resource, and a rule's pattern is expressed by echoing the shape of the resource it's checking — the same YAML structure already read every day
- C. Policies must be compiled into a binary before they can be applied
- D. Kyverno only accepts JSON manifests, never YAML
Check the answer
B. A pattern block mirrors the resource it constrains, which is exactly why a reviewer fluent in ordinary Kubernetes YAML can audit a Kyverno policy's intent at a glance.
Q10 (Installation, Configuration, and Upgrades). Which of the following is not a genuine, separate Kyverno CRD?
- A.
ClusterPolicy - B.
PolicyException - C.
ClusterCleanupPolicy - D.
ValidatingAdmissionPolicy
Check the answer
D. ValidatingAdmissionPolicy is a native Kubernetes API server resource, not a Kyverno CRD. Kyverno's CEL support deliberately reuses the same expression language that resource uses, but the resource itself belongs to the API server, not to Kyverno.
Q11 (Writing Policies). A generate rule uses clone rather than data to create a companion resource, with synchronize: true set. What does synchronize: true actually do?
- A. Nothing — it only ever affects
data-based generation, notclone - B. Keeps the generated copy in step with the source object going forward — if the source changes later, the generated copy updates to match, and a direct edit to the generated copy is reverted
- C. Deletes the generated resource automatically if the trigger resource is later deleted
- D. Forces the generated resource into the same namespace as the source, regardless of what
namespacesays
Check the answer
B. Without synchronize, a generated resource is a one-time copy that can drift. With it, Kyverno keeps enforcing that the generated object matches its source — including reverting a well-meaning manual edit.
Q12 (Kyverno CLI). What does adding --cluster to kyverno apply ./policies/ --policy-report change?
- A. Nothing; the flag doesn't exist in the CLI
- B. It evaluates the named policies against the resources actually present in your currently-configured live cluster, rather than local manifest files — still a dry run, just against real cluster state instead of files on disk
- C. It installs the named policies onto the cluster permanently
- D. It switches evaluation to CEL-only mode
Check the answer
B. --cluster swaps the resource source from local files to whatever the current kubeconfig context points at — nothing about the dry-run nature changes.
Q13 (Fundamentals of Kyverno). What kind of Kubernetes object does Kyverno register itself as, in order to intercept every create and update before persistence?
- A. A
CustomResourceDefinitiononly - B. A
ValidatingWebhookConfigurationand aMutatingWebhookConfiguration— both — so it can act in either capacity depending on the rule type in play - C. Only a
MutatingWebhookConfiguration; validation happens out-of-band, after the fact - D. A
CronJobthat polls the API server on an interval
Check the answer
B. Kyverno needs both webhook kinds registered, because validate and verifyImages need validating hooks while mutate and generate need mutating ones — one engine wearing two webhook hats.
Q14 (Writing Policies). Which phase of the Kyverno admission webhook does a verifyImages rule execute in, and why does that matter?
- A. The validating phase — it can only ever reject, never modify the object
- B. The mutating phase — because a successful verification can rewrite the image tag to the verified digest via
mutateDigest, closing the tag-mutation race - C. A separate, third phase that runs after both validate and mutate have finished
- D. Entirely inside the background controller, never on the live admission path
Check the answer
B. verifyImages is a mutating-phase check precisely because a security control that pins a tag to the digest it just verified needs write access to the object — that's a fact multiple-choice writers love to test.
Q15 (Applying Policies). A rule's match.any block lists two separate resources filters: one for kinds: [Pod] and one for namespaces: [orbit]. How does any combine these two filters?
- A. Both must be true simultaneously for a resource to match — effectively an AND
- B. Either filter alone is sufficient to match — this actually matches any Pod anywhere in the cluster, or anything at all in the
orbitnamespace, which is likely broader than intended - C. Neither filter applies unless both are written inside the same single
resources:block - D.
anyis only valid syntax underexclude, never undermatch
Check the answer
B. Separate list entries under any are ORed. This is exactly the trap behind "the commonest reason a policy matches something too broad" — a selector that reads narrow but behaves wide.
Q16 (Installation, Configuration, and Upgrades). Chart values for controller flags — such as admissionController.container.extraArgs — can differ between Kyverno chart releases. What's the reliable way to check which flags a specific chart version actually supports, rather than trusting an old blog post?
- A.
kubectl explain kyverno - B.
helm show values kyverno/kyverno, run against the specific chart version you're installing, sincevalues.yamlis the authoritative, versioned source - C. Reading through the Kyverno GitHub issues tracker
- D. There's no reliable way to check this ahead of time
Check the answer
B. Chart values are versioned right alongside the chart itself — helm show values against the exact version you're installing is the one source that can't be stale.
Q17 (Policy Management). A team wants exactly one workload exempt from one specific rule, without weakening that rule for every other workload in the cluster. What's the idiomatic Kyverno mechanism for this?
- A. Add an
excludeblock directly to the shared policy, naming that one workload - B. Create a
PolicyException— a separate, reviewable resource naming the exempted policy, rule, and resource, so the exemption goes through Git and code review without editing the policy itself - C. Set
failureAction: Auditfor the whole policy - D. Delete the rule entirely and rely on a different rule to cover the gap
Check the answer
B. A PolicyException is the dedicated, reviewable carve-out mechanism. Option A can technically work, but it means editing the one policy every other workload also depends on, just to grant a one-off exemption — exactly the pattern PolicyException exists to replace.
Block 2 — Q18–34
Q18 (Writing Policies). A rule needs to read a value from a ConfigMap that isn't part of the incoming request at all, then use it inside a validate.pattern. Which mechanism supplies that value?
- A.
preconditionsalone, with no other construct needed - B. A
contextentry (for example aconfigMapentry) that fetches the value, referenced afterward as a{{ }}variable inside the rule - C.
background: true - D. The
pod-policies.kyverno.io/autogen-controllersannotation
Check the answer
B. context is exactly the escape hatch for data that doesn't arrive with the request — a ConfigMap lookup, a variable derived from one, or a call to the Kubernetes API mid-rule.
Q19 (Fundamentals of Kyverno). Which of these is a digest-pinned image reference, as opposed to a tag-pinned one?
- A.
ghcr.io/orbit/telemetry-uplink:v2 - B.
ghcr.io/orbit/telemetry-uplink@sha256:9f86d0... - C.
ghcr.io/orbit/telemetry-uplink:latest - D.
ghcr.io/orbit/telemetry-uplinkwith no suffix at all
Check the answer
B. Digest-pinned references use the @sha256: form — exactly the shape a verifyImages rule with mutateDigest: true rewrites a tag-pinned reference into once verification succeeds.
Q20 (Writing Policies). Which RFC 6902 JSON Patch operation would you use inside patchesJson6902 to add a new field to a Pod's first container that doesn't yet exist there, without disturbing the rest of the container spec?
- A.
replace, sinceaddrequires the target field to already exist - B.
add, targeting the specific path —addworks whether or not the target key already exists at that location, unlikereplace - C.
remove, followed by a second operation that re-adds it - D.
copy
Check the answer
B. add is the safe general-purpose choice for introducing a field — it doesn't require the target to already exist the way replace does.
Q21 (Installation, Configuration, and Upgrades). Take the rule fragment below:
- name: generate-default-deny
match:
any:
- resources: { kinds: [Namespace] }
generate:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
name: default-deny
namespace: "{{ request.object.metadata.name }}"
data:
spec:
podSelector: {}
policyTypes: [Ingress, Egress]This rule is installed cluster-wide, kyverno test passes locally, but on the live cluster no NetworkPolicy ever actually appears in newly-created namespaces. What's the most likely operational cause?
- A. The rule's YAML is malformed, despite
kyverno testreporting success - B. The background controller's
ClusterRoledoesn't grant permission to createNetworkPolicyobjects —generaterules need RBAC for whatever kind they create, and a silently-missing permission is a very common cause of a generate rule that appears to do nothing - C.
generaterules can never targetNetworkPolicy, only ConfigMaps - D. The rule needs
background: trueexplicitly set to create anything
Check the answer
B. kyverno test checks the policy's logic against fixtures, never the live cluster's RBAC — a generate rule that's logically correct can still silently do nothing for want of a permission nobody granted.
Q22 (Kyverno CLI). Running kyverno test ./policies/ with no other arguments, how does the CLI know which test cases to actually run?
- A. It requires an explicit
--fileflag naming every individual test case - B. It recursively discovers
kyverno-test.yamlfiles under the given path and runs the declarative test cases they define - C. It only runs tests embedded as comments inside the policy YAML itself
- D. It re-runs whatever was most recently applied with
kyverno apply
Check the answer
B. kyverno-test.yaml is the auto-discovered convention — no flag needed, the same way many test runners auto-discover files matching a naming pattern.
Q23 (Writing Policies). A validate rule matches only kind: Pod in its match block. A developer creates a Deployment whose Pods would violate that rule if they were created directly. Assuming autogen is left at its default behavior, what actually happens?
- A. Nothing — a Pod-only rule never applies to a Deployment
- B. Kyverno's autogen mechanism automatically generates an equivalent rule for the pod controllers, including Deployment, so the Deployment is checked and rejected with the message at the layer the developer actually applied
- C. The rule silently applies to the Deployment's ReplicaSet only, never to the Deployment resource itself
- D. Autogen only works for
mutaterules, never forvalidate
Check the answer
B. Autogen exists precisely so a rule written once for Pod still surfaces its message where a developer's kubectl apply actually landed — usually a Deployment, not a bare Pod.
Q24 (Policy Management). Kyverno exposes its own operational metrics via the kyverno-svc-metrics Service. What format are they in, and what do they integrate with?
- A. A proprietary JSON format, readable only through the Kyverno CLI
- B. Ordinary Prometheus-format metrics — admission counts, rule-result totals, latencies — so guardrail behavior lands on the same dashboards as everything else already being monitored
- C. StatsD format, requiring a separate exporter to translate it
- D. Kyverno exposes no metrics at all; only
PolicyReportobjects carry that information
Check the answer
B. Prometheus format is the point — a guardrail's health question ("are rejections spiking?") should be answerable from the exact same dashboards as everything else, not a separate bespoke tool.
Q25 (Fundamentals of Kyverno). A Policy (not a ClusterPolicy) is created in namespace orbit. Can its rules match a Namespace resource?
- A. Yes — any policy kind can match any resource kind
- B. No — a namespaced
Policycan only ever match resources inside its own namespace, andNamespaceitself is cluster-scoped, so only aClusterPolicycan match it - C. Only if
background: trueis also set on thePolicy - D. Only if the target
Namespacecarries a matching label
Check the answer
B. Scope is the entire distinction between Policy and ClusterPolicy. A cluster-scoped resource is structurally out of reach for anything confined to one namespace.
Q26 (Installation, Configuration, and Upgrades). A team wants to make their Kyverno install highly available and, due to a resource budget, can only prioritize scaling one controller's replica count first. Which controller should that be, and why?
- A. The cleanup controller — it runs on the most frequent schedule
- B. The admission controller — it's the only one of the four directly in the live request path, so its unavailability blocks new resource creation cluster-wide in a way the other three controllers don't
- C. The reports controller —
PolicyReportobjects are the most operationally important artifact - D. It doesn't matter; all four controllers sit directly in the live request path equally
Check the answer
B. Only the admission controller intercepts live create/update requests. The background, reports and cleanup controllers matter, but none of them can single-handedly stall every deploy in the cluster the way the admission controller can.
Q27 (Writing Policies). A ClusterCleanupPolicy is created with schedule: "0 2 * * *" and a match selecting completed Jobs older than 48 hours. Which statement about this resource is correct?
- A. It's a fifth Kyverno rule type, nested inside
spec.ruleslikevalidateormutate - B. It's a separate CRD served by its own cleanup controller, unrelated to
spec.ruleson aClusterPolicy, and it deletes matching resources on the stated cron schedule - C. It only ever runs once, at the moment it's created
- D. It requires
background: trueto take effect
Check the answer
B. Cleanup policies are their own CRD family with their own controller — not a fifth action bolted onto an ordinary policy's rule list.
Q28 (Applying Policies). Which match.any.resources field would you use to make a rule apply only to requests made by a specific ServiceAccount, rather than filtering by the resource's own kind or namespace?
- A.
kinds - B.
subjects, listing the ServiceAccount (or user, or group) making the request - C.
selector - D.
operations
Check the answer
B. kinds, namespaces and selector all describe the resource being acted on; subjects is the field that describes who is acting.
Q29 (Writing Policies). Kyverno's validate rules can express their check using CEL instead of the pattern-matching style. What's true about the CEL option?
- A. It's a Kyverno-invented language unrelated to anything else in Kubernetes
- B. It's the same Common Expression Language the API server itself uses natively for
ValidatingAdmissionPolicy, so CEL knowledge transfers directly between the two - C. CEL rules can only ever audit, never enforce
- D. CEL is only usable inside
generaterules, never insidevalidate
Check the answer
B. This is deliberate design, not coincidence — Kyverno reuses the exact expression language the API server already speaks natively, so time spent learning CEL for one pays off for the other.
Q30 (Kyverno CLI). A kyverno-test.yaml file declares, for one resource and one rule, an expected result of fail. Applying that policy to that resource actually results in a pass. What does kyverno test report?
- A. Nothing —
kyverno testhas no way to detect this kind of mismatch - B. A test failure — the actual result didn't match the declared expected result, exactly the way a unit-testing framework flags a mismatched assertion
- C. It silently updates the expected result in the file to
pass - D. It only ever compares
failureAction, never the pass/fail outcome itself
Check the answer
B. kyverno test works exactly like a unit test: a declared expectation, an actual result, and a failure the moment the two disagree.
Q31 (Fundamentals of Kyverno). A validate pattern block is written as nested YAML mirroring the shape of the resource it's checking, rather than as a separate expression language, in its non-CEL form. What does this design choice buy a reviewer?
- A. Nothing meaningful — it's purely a stylistic preference
- B. A rule's pattern reads almost like the manifest it's meant to constrain, so a reviewer already fluent in Kubernetes YAML can audit a policy's intent without learning new syntax first
- C. It means a pattern can only ever check
metadata, neverspec - D. It means every pattern must itself be valid as an applyable Kubernetes resource
Check the answer
B. Shape-mirroring is exactly what keeps policy review approachable — the reader's existing Kubernetes fluency carries most of the weight.
Q32 (Installation, Configuration, and Upgrades). Before running helm upgrade kyverno kyverno/kyverno --version X, what does the curriculum's "Upgrading Kyverno" competency specifically expect a candidate to check first?
- A. Nothing — Helm upgrades are always safe to run blind, regardless of version gap
- B. The target version's release notes, because CRD handling has varied between chart versions and skipping minor versions can leave CRDs in an inconsistent state
- C. Only the cluster's own Kubernetes version, never Kyverno's own release notes
- D. Whether
background: trueis set on any installed policy
Check the answer
B. CRD compatibility across versions is exactly the kind of quiet operational risk this domain exists to test — read the release notes for your target version before jumping.
Q33 (Writing Policies). A validate rule's pattern checks request.userInfo.username to restrict who may create a resource, and the same policy sets background: true. What happens when the background controller scans a pre-existing resource against this rule?
- A. The background scan reports a violation normally, using the original creator's recorded username
- B. The background scan cannot evaluate this rule meaningfully — admission-only context like
request.userInfoisn't available outside a live admission request, so identity-dependent rules can only ever run at admission time - C.
background: trueis simply ignored wheneveruserInfois referenced anywhere in the rule - D. The rule is automatically rewritten to skip the
userInfocheck during background scans
Check the answer
B. Background scanning only ever sees the object as it currently sits in the cluster — the original request's identity context is long gone by the time a scheduled scan reaches it.
Q34 (Policy Management). A PolicyReport entry shows a result of error for one resource against one rule, distinct from fail. What does error typically indicate?
- A. The resource violated the rule's pattern, exactly the same meaning as
fail - B. The rule itself could not be evaluated correctly for that resource — for example a
contextAPI call failed, or a JMESPath expression errored — a different problem from the resource simply failing the check - C. The rule was skipped because the resource was caught by
exclude - D. The resource passed, but with a non-blocking warning attached
Check the answer
B. error means the evaluation itself broke down; fail means evaluation completed and the resource genuinely didn't satisfy the rule. Telling those apart is exactly what a report's status column is for.
Block 3 — Q35–50
Q35 (Writing Policies). A validate rule needs to allow a resource if it matches any one of several acceptable label patterns, not all of them simultaneously. Which field expresses that?
- A.
patternalone, since it supports OR conditions natively - B.
anyPattern— a list of patterns where satisfying at least one single entry passes the rule - C.
preconditions.any - D.
exclude.any
Check the answer
B. pattern is a single shape that must be satisfied in full; anyPattern is specifically the OR construct, a list where one match is enough.
Q36 (Fundamentals of Kyverno). Besides CREATE and UPDATE, which other admission operation can a Kyverno rule's match legitimately filter on?
- A. Only CREATE and UPDATE are ever visible to Kyverno at all
- B. DELETE (and CONNECT, for certain resource types) are also visible admission operations a rule can match against, not just CREATE and UPDATE
- C. Kyverno cannot see DELETE requests under any circumstances
- D. PATCH is a distinct operation type, separate from UPDATE, that Kyverno also sees
Check the answer
B. Admission control isn't limited to creation and modification — a rule can be written to react to deletion too, which matters for anything trying to protect a resource from being removed.
Q37 (Installation, Configuration, and Upgrades). What does the --create-namespace flag do in helm install kyverno kyverno/kyverno -n kyverno --create-namespace?
- A. Creates a
NetworkPolicyrestricting traffic into thekyvernonamespace - B. Creates the target namespace (
kyverno) automatically if it doesn't already exist, rather than requiring it as a separate step beforehand - C. Enables
background: truecluster-wide, for every installed policy - D. Registers the admission webhook a second time
Check the answer
B. A convenience flag, nothing more — it saves a separate kubectl create namespace step ahead of the install.
- name: default-pull-policy-all
match:
any:
- resources: { kinds: [Pod] }
mutate:
patchesJson6902: |-
- op: add
path: "/spec/containers/0/imagePullPolicy"
value: IfNotPresentQ38 (Writing Policies). The rule above only ever patches container index 0. A Pod defines three containers, and the requirement is to add the same imagePullPolicy field to all three, not just the first. Which construct fixes this without hand-writing three separate patch operations?
- A. A second
patchesJson6902entry, one hardcoded per index, up to some assumed maximum - B.
foreachinside the mutate rule, iterating overrequest.object.spec.containersand applying the patch to each entry it visits - C.
preconditions.all - D. Setting
background: trueon the rule
Check the answer
B. foreach is exactly the mechanism for applying one patch shape across every entry in an array, regardless of how many containers a given Pod actually declares.
Q39 (Kyverno CLI). Why would you run kyverno jp query -i pod.yaml 'spec.containers[*].image' before pasting that same expression into a rule's {{ }} variable?
- A.
jpand{{ }}use entirely unrelated expression syntaxes, so there's no real benefit - B.
jplets you evaluate a JMESPath expression against a real manifest and see the exact result it produces, so you can debug the expression in isolation before trusting it inside a live policy rule - C.
jponly works insidegeneraterules, never insidevalidate - D.
jprequires a live cluster connection to run at all
Check the answer
B. Debugging an expression against a real file, outside a rule, is far faster than iterating by repeatedly re-applying a whole policy just to see what one JMESPath expression actually returns.
Q40 (Applying Policies). A rule's context entry calls an external API mid-evaluation, and that call is occasionally slow. Which common policy setting controls how long Kyverno waits before the webhook call itself times out?
- A.
background - B.
webhookTimeoutSeconds - C.
failureAction - D.
synchronize
Check the answer
B. A slow context call is exactly the scenario webhookTimeoutSeconds exists to guard against — without it tuned appropriately, a slow external dependency can start failing admission requests outright.
Q41 (Writing Policies). Which fields must a generate rule specify to know what resource to actually create, at minimum?
- A. Only a
datablock, nothing else - B.
apiVersion,kind, andname, along with a targetnamespacefor a namespaced kind, plus eitherdataorcloneto supply the content - C. Only a
contextentry naming the source - D.
mutate.foreach
Check the answer
B. A generate rule needs to know what kind of object to make, what to name it, where it lives, and what content it holds — that last part is either inlined via data or copied via clone.
Q42 (Fundamentals of Kyverno). Why does the KCA curriculum name "OCI Images" as its own fundamentals competency, distinct from Kubernetes generally?
- A. Because Kyverno defines and requires its own private, non-standard image format
- B. Because
verifyImagesoperates directly on OCI (Open Container Initiative) image references and their registry-published signatures and attestations — reasoning correctly about that rule type requires understanding how an OCI reference and its signature are structured - C. Because OCI images are unrelated to ordinary container images entirely
- D. Because Kyverno cannot run in a cluster that uses OCI-format images at all
Check the answer
B. The competency exists because one whole rule type is built on top of OCI's own reference and signature conventions — you can't reason well about verifyImages without that grounding.
Q43 (Installation, Configuration, and Upgrades). Structurally, what kind of Kubernetes object is a PolicyException?
- A. A field written directly inside the
ClusterPolicyit exempts - B. Its own separate CRD, referencing the policy and rule names it exempts and the resources it applies to — a standalone, reviewable object rather than an edit buried inside the policy itself
- C. An annotation attached to the exempted resource
- D. A Helm chart value
Check the answer
B. Being its own CRD is exactly what makes a PolicyException reviewable in Git independently of the policy it carves an exception out of.
Q44 (Writing Policies). A verifyImages rule's attestors block uses keyless, naming a subject and an issuer, rather than a static public key. What does keyless verification actually check?
- A. Nothing at all —
keylessmeans verification is effectively skipped - B. A Sigstore/Fulcio-issued short-lived certificate binding the signature to an OIDC identity (the
subject/issuerpair), rather than a long-lived static key pair - C. Only that the image was pulled from a specific registry, unrelated to who actually signed it
- D. Whether the image carries a
latesttag
Check the answer
B. "Keyless" doesn't mean "no verification" — it means the identity behind the signature is a short-lived, OIDC-bound certificate instead of a key pair someone has to store and rotate forever.
Q45 (Kyverno CLI). Beyond standard JMESPath, Kyverno's expression evaluation supports extra custom functions for things standard JMESPath can't express on its own. Which command lists them?
- A.
kyverno apply --list-functions - B.
kyverno jp function - C.
kyverno test --functions - D.
helm show values kyverno/kyverno --functions
Check the answer
B. jp function is the CLI's own reference for the custom functions layered on top of standard JMESPath — worth running once just to see what's available.
Q46 (Policy Management). A PolicyException names policies: [require-team-label] and a match block selecting one specific Deployment by name. What does this exemption actually cover?
- A. Every rule in every policy, for every resource in the entire cluster
- B. Only the named policy's named rule(s), and only for resources matching the exception's own
matchblock — the same match/exclude filtering vocabulary an ordinary policy uses, scoped down to one narrow carve-out - C. The entire namespace the named Deployment happens to live in, regardless of resource name
- D. All future policies created after this exception, automatically
Check the answer
B. A PolicyException is precisely scoped — it names exactly which policy, which rule, and which resources, using the same filtering vocabulary as an ordinary policy's match block.
Q47 (Writing Policies). Inside a validate pattern, what's the difference between the wildcard ?* and * when checking a field like metadata.labels.team?
- A. They're functionally identical
- B.
?*requires at least one character to be present — the field must exist and be non-empty;*matches any value including an empty string, but the field still has to exist - C.
*requires the field to be entirely absent - D.
?*only matches numeric values
Check the answer
B. This distinction is a favorite exam trap: * alone would happily accept team: "", which is almost never what a policy author actually wants — ?* is the wildcard that closes that gap.
Q48 (Fundamentals of Kyverno). Why does installing a single policy that only matches kind: Pod not add any latency at all to, say, ConfigMap creation elsewhere in the cluster?
- A. ConfigMaps are always exempt from admission control by default
- B. Kyverno dynamically configures its own webhook rules to cover only the kinds referenced by currently installed policies — so the API server never calls Kyverno at all for kinds nothing has policies against
- C. Kyverno processes every request regardless of kind, then silently discards non-Pod ones after the fact
- D. ConfigMaps are routed through a separate, lower-priority webhook entirely
Check the answer
B. Kyverno keeps its own webhook registration narrow on purpose — only the kinds your policies actually reference ever pay the round-trip cost of being sent to Kyverno at all.
Q49 (Installation, Configuration, and Upgrades). Unlike Istio's revision-tag canary upgrade pattern — installing a second, parallel control plane under a new revision label, then moving namespaces across one at a time — how does a standard Kyverno upgrade typically proceed?
- A. Identically — Kyverno also supports revision-tagged, side-by-side control planes selected per namespace
- B. In place, via
helm upgradeagainst the existing release — Kyverno has no equivalent namespace-revision-label mechanism, which is exactly why release notes and CRD compatibility matter even more before upgrading - C. By deleting and recreating the entire cluster on every upgrade
- D. Kyverno cannot be upgraded once installed; it must be reinstalled from scratch each time
Check the answer
B. Kyverno's upgrade model is a plain in-place helm upgrade, with none of the parallel-revision machinery some other CNCF projects offer — which is exactly why reading the release notes first is non-optional here.
Q50 (Applying Policies). A very old ClusterPolicy manifest sets spec.validationFailureAction: enforce at the top level, rather than failureAction: Enforce inside each rule's validate block. What should a candidate recognize about this?
- A. It's invalid YAML and will be rejected outright by the API server
- B. It's the older, deprecated form of the same setting — expect to recognize both the legacy
spec.validationFailureActionand the current per-rulevalidate.failureActionon the exam - C. It only ever affects
mutaterules, nevervalidaterules - D. It silently disables the entire rule
Check the answer
B. Both forms mean the same thing operationally; the curriculum expects you to recognize the old spelling on sight, not just the current one, since older manifests in the wild still use it.
Score yourself
☺ Like you're 10: Your score is a thermometer, not a verdict — the list of questions you got wrong is the actually useful part.
Count your correct answers out of 50 and convert to a percentage. The number to beat is 75%: per the blueprint page's logistics table, the Linux Foundation's Multiple Choice Exam FAQ states that a score of 75% or above must be earned to pass a multiple-choice exam, and KCA is one — though that figure lives on the Foundation's general FAQ, not a KCA-specific page, so it's worth re-confirming before you book. This paper isn't calibrated to the real exam's difficulty and every scenario is entirely original to this course, so don't read a score here as a literal prediction of your real result — but the pattern of where you lost points travels reliably:
| Domain | Items in this paper | Your score | If you're under two-thirds, go here |
|---|---|---|---|
| 🐢 Writing Policies | 16 | /16 | KCA — the exam |
| 🦉 Fundamentals of Kyverno | 9 | /9 | Kyverno |
| 🦫 Installation, Configuration, and Upgrades | 9 | /9 | KCA — the exam |
| 🐿️ Kyverno CLI | 6 | /6 | KCA — the exam |
| 🤖 Applying Policies | 5 | /5 | KCA — the exam |
| 🐘 Policy Management | 5 | /5 | KCA — the exam |
| Total | 50 items | /50 | 75%+ (38/50) is the published pass mark |
The 90-minute duration and 75% pass mark quoted here reflect the Linux Foundation's published figures as of 2026; question count is not published at all for KCA, so treat any specific figure you read for it — here or elsewhere — as candidate folklore. Price, retake terms, eligibility windows and even domain weights are revised without announcement. This is an independent, unofficial study resource, not affiliated with the CNCF or The Linux Foundation — confirm everything on the official Linux Foundation KCA page and the CNCF KCA page before you register or pay.
| Where you land | What it usually means | Next move |
|---|---|---|
| Under 60% | Gaps in the fundamentals, not exam technique. | Re-read the blueprint page in full, in weight order — Writing Policies, then the two 18% domains, then the rest — before touching another paper. |
| 60–75% | Below the published pass mark. The core vocabulary is there, but the distinctions are fuzzy — audit vs enforce, Policy vs ClusterPolicy, PolicyReport vs PolicyException. | Re-read your two weakest domains, then re-sit the questions you missed in both this paper and Set 1 from memory. |
| 75–90% | At or above 75%, but not comfortably so. What's usually left is one under-studied smaller domain — often Policy Management or Applying Policies, each only 10% of the real blueprint. | Spend a focused hour on the applying-policies and policy-management sections, then re-sit this paper's ten questions from those two domains cold. |
| Over 90% | Comfortable on paper. The remaining risk is recognizing a familiar-sounding option rather than actually reasoning from the YAML. | Try the workshop on the blueprint page — install Kyverno on a throwaway cluster and run all four rule types for real — then book the exam. |
Whatever you scored, do one more thing before closing the tab: for every question you missed, write in your own words why the option you picked was wrong — not just why the correct one was right. That sentence is what actually stops the same mistake happening again in the real sitting.
Where each domain is taught
☺ Like you're 10: Every question above traces back to one of a handful of pages — go back to the page, not to a search engine.
Nothing in this paper examines anything outside this course's own material. The KCA blueprint page is the primary source for all six domains; where a competency needs the wider admission-control or supply-chain picture, it lives in this course's own tool and deep-dive pages.
Writing Policies
The four rule types, preconditions, background scans, variables and context, JSON patches, autogen, cleanup policies, and CEL.
🦉 · 9 QFundamentals of Kyverno
Policy and rule structure, YAML-shaped patterns, the admission-webhook mechanism, and OCI image references.
🦫 · 9 QInstallation, Config & Upgrades
The Helm-based install, the four controllers, CRDs, controller flags, RBAC, HA, and upgrade mechanics.
🐿️ · 6 QKyverno CLI
apply, test, jp, and installing the standalone CLI itself.
Applying Policies
Resource selection via match/exclude, common policy settings, and applying policy in-cluster.
🐘 · 5 QPolicy Management
Policy reports, cluster policy reports, PolicyExceptions, and Kyverno's Prometheus metrics.
Round it out with the KCA study plan for a pacing schedule funded by domain weight, the practice question bank for drilling between full papers, the glossary for terminology, flashcards for the vocabulary, and the certifications overview for where KCA sits against the other eight badges on this ladder. Because Kyverno enforces admission control, the sibling CKS blueprint over in the Kubernetes course is worth a skim if the surrounding cluster-security picture ever feels shakier than the Kyverno-specific facts themselves.
Foxy: I got 40 out of 50 on Set 2. Better or worse than Set 1?
Remy: Wrong comparison. Which ten did you drop? Two in Policy Management barely dents you. Five in Writing Policies is a real problem, because that one domain carries sixteen of the fifty marks on its own.
Foxy: Mostly the wildcard question, actually — I keep forgetting * happily matches an empty string and ?* is the one that actually demands a real value.
Timmy: Say it out loud until it's boring, Foxy — that one wildcard is exactly the kind of detail a rule can pass code review with and still do nothing in production.
Gizmo: Or just skip the wildcard entirely and leave the field unchecked. No pattern, no confusion! 😏
Ellie: Which is also exactly how six hundred silent policy-report failures happen — the rule that checks nothing catches nothing, and nobody notices until the report's FAIL column is unreadable.
Foxy: Fine, fine. Back to the blueprint page for an hour, then I'm re-sitting just the Writing Policies questions from both papers.
1. Name the six KCA domains and their weights, heaviest first. 2. What does failureAction: Enforce actually change, and what happens without it? 3. Which of the four rule types runs in the mutating phase even though its job sounds like validation, and why? 4. What's the practical difference between the wildcards * and ?* inside a validate pattern? 5. Name Kyverno's four controllers and which one sits directly in the live admission path. 6. What does a PolicyException give you that editing the policy directly does not? 7. Which three kyverno CLI subcommands does the curriculum name, and what does each one answer?
Check your answers
- Writing Policies 32%, Fundamentals of Kyverno 18%, Installation, Configuration, and Upgrades 18%, Kyverno CLI 12%, Applying Policies 10%, Policy Management 10%.
- It turns a rule from a silent auditor into an actual blocker. Without it, the rule's default behavior is
Audit— every violation is recorded in a policy report, but nothing is ever rejected. verifyImages. It runs in the mutating phase because a successful verification rewrites the image tag to the digest it just verified (viamutateDigest), and only a mutating webhook is permitted to change the object on its way through.?*requires the field to exist and hold at least one character;*matches any value, including an empty string, as long as the field is present at all —*alone would happily accept a blank label.- Admission (validates and mutates every live request — the only one directly in the request path), background (scans, generate, mutate-existing — needs RBAC for what it touches), reports (aggregates results into PolicyReport/ClusterPolicyReport), and cleanup (runs CleanupPolicy schedules).
- A separate, reviewable resource: one named workload skips one named rule, through Git and code review, while the policy stays strict for everyone else — instead of permanently weakening the rule for the whole fleet.
apply— "what would these policies do to these resources?";test— run declarative unit tests and assert each rule's expected result;jp— evaluate a JMESPath (or custom-function) expression against a manifest, to debug it before pasting it into a rule.