ICA Mock Exam · Set 1
This is your first full sitting of the ICA in this course's own format: 17 items in one unbroken 120-minute block — nine hands-on tasks worked at a real command line against a live mesh, and eight multiple-choice questions — weighted to the four official domains in the same proportion the CNCF weights them: Traffic Management 35%, Securing Workloads 25%, Installation, Upgrades & Configuration 20%, Troubleshooting 20%, exactly as the ICA blueprint lays them out. Every task carries a done when check and a folded worked solution; every question carries a folded explanation. Hands-on work carries the majority of this paper's points — 69 of 100 — because that's where a hybrid exam actually spends most of its own effort, even though the Linux Foundation doesn't publish the exact split. This is Set 1 of three; Set 2 and Set 3 stay sealed until you've fixed whatever this one exposes. If you haven't worked through the blueprint, the study plan, and the untimed practice bank yet, start there — this paper measures whether that prep survives a clock and a real cluster, not whether you've read about Istio.
Most tests on this shelf are one kind of quiz: read a question, pick an answer, done. This one is two tests stitched together. Half of it is the normal kind — read a question, pick an answer. The other half hands you a real toy car engine that's been deliberately mixed up, gives you a screwdriver, and says "make it run properly" while someone times you. You don't get credit for describing how you'd fix the engine. You only get credit once it's actually purring. That's why this page keeps sending you back to a real terminal instead of just more flashcards — half the score lives there and nowhere else.
Where Set 1 sits in your ICA prep
☺ Like you're 10: First you learn the mesh piece by piece, then you drill loose jobs and questions about it, and only then do you sit the whole timed test with everything mixed together.
The natural sequence on this course is: read the ICA blueprint for the four domains, their real weights, and the resource pairs the exam actually tests; follow the study plan's build-it-from-memory drills; work the untimed practice bank until nothing there surprises you; and only then sit this paper as your first honest measurement of all four domains at once, under a clock, on a real cluster. This paper assigns points to each domain in the exact proportion the CNCF assigns them — 35% Traffic Management, 25% Securing Workloads, 20% Installation, 20% Troubleshooting — so a weak score in one domain here is unusually actionable: it names precisely which section of the blueprint to reread, not just that you "did badly" in some vague sense.
| Stage | What you do | What it tells you |
|---|---|---|
| 1 · Build the vocabulary | Read the blueprint and follow the study plan's manifests-from-memory drills. | Whether you know the material at all — untimed, open-book, no cluster required. |
| 2 · Drill loose items | The practice bank, untimed, on a throwaway cluster, reading every explanation even for items you got right. | Whether you can execute a task and recognize a right answer among convincing distractors. |
| 3 · Sit Set 1 | This page. One 120-minute block, no pausing, all 17 items. | Your pacing under a clock — can you bank a passing score on a live mesh, not just eventually get there. |
| 4 · Fix gaps, then sit Set 2 and Set 3 | Re-drill only the domains you missed, then sit Set 2 and later Set 3 — two fresh, unseen papers — days apart. | Whether the gap is actually closed, on material you haven't already seen the answer to. |
The Linux Foundation doesn't publish the ICA's real item count — the blueprint's logistics table already says so plainly, and candidate write-ups cluster loosely around fifteen to twenty items in the two hours, which is community anecdote rather than a specification. This paper's 17 items — nine hands-on tasks and eight multiple-choice questions, split 69/31 by points — sit inside that anecdotal range and were chosen because they divide cleanly across the four real domain weights without much rounding. Treat that shape as this course's own study scaffolding, not a leaked format.
Sit it like the real thing
☺ Like you're 10: No notes, no open tabs, one sitting, go — and a hands-on job only counts once it actually works, not once it looks finished.
The ICA is online, remote-proctored, and hybrid — performance-based tasks at a command line, mixed with multiple-choice items, in roughly two hours. Sit this practice paper under the same restriction: close every other tab, work the 17 items below exactly as you would a locked-down sitting, and for the hands-on tasks specifically, don't call one "done" until its done when check actually passes against your cluster. For the multiple-choice items, read the stem once, commit to an answer, and only then open the explanation underneath it — peeking first turns a diagnostic into a comprehension exercise and tells you nothing about whether you'd have gotten there cold. As on the real exam, never leave a multiple-choice item blank: eliminate what you can and commit to your best remaining option, since the Linux Foundation doesn't publish a separate penalty for a wrong guess beyond simply not earning the point.
This is an independent, unofficial study resource, not affiliated with the CNCF or the Linux Foundation. Duration, price, item count, pass mark, retake policy, the pinned Istio version, and — for a hybrid exam, worth stressing twice — which documentation, if any, you're permitted to have open during the sitting are all figures the Linux Foundation revises without much announcement, and several of them (item count, pass mark, permitted docs) aren't published at all. Read the current official Linux Foundation ICA page and its candidate handbook end to end before you register or pay for anything. If anything on this page disagrees with the official page, the official page is right and this one is stale.
Pre-flight — build the mesh cluster the night before
☺ Like you're 10: Set up your whole toolbox the day before, so that when the clock starts you're already holding the screwdriver, not still looking for it.
A throwaway kind or minikube cluster is enough. Install Istio with the demo profile, which brings the ingress and egress gateways along with the control plane, then deploy a small two-version service to route against. Confirm everything is healthy before the timer starts — if something turns out to be missing mid-sitting, skip the item and move on, never stop the clock to fix your environment, because the real exam won't let you either.
# --- the night before -------------------------------------------------
kind create cluster --name ica-mock1
istioctl install --set profile=demo -y
kubectl get pods -n istio-system # istiod + both gateways Running
kubectl create namespace orbit
kubectl label namespace orbit istio-injection=enabled
kubectl apply -n orbit -f telemetry-api-v1-v2.yaml # your own two-version Deployment+Service
kubectl apply -n orbit -f ground-console-client.yaml # a curl-capable pod, SA: ground-console
kubectl apply -n orbit -f weather-sync-client.yaml # a second curl-capable pod, SA: weather-sync
kubectl -n orbit get pods # every app pod should read 2/2 (sidecar injected)
# --- ninety seconds before the clock starts ---------------------------
kubectl config set-context --current --namespace=orbit
kubectl config view --minify -o jsonpath='{..namespace}{"\n"}' # say it out loud
istioctl analyze -n orbit # clean baseline before you touch anythingA number of self-inflicted zeros in a performance sitting are not wrong YAML — they are correct YAML applied against a cluster that was never actually ready. Run istioctl analyze -n orbit as your last step before starting the timer specifically because you want a clean baseline: if it's already complaining before you've written a line of your own, you'll waste minutes during the sitting deciding whether a warning is yours or the environment's.
Your 120-minute budget
☺ Like you're 10: Give every job and every question a small slice of the two hours, weighted by how big a piece of the exam it stands in for.
Seventeen items in 120 minutes is not an even split, and it shouldn't be — a ten-point hands-on task earns a bigger slice of the clock than a three-point question. Allocate 5 minutes to read the whole paper first, 102 minutes of item work, and 13 minutes at the end to re-run every done-when check. That last block earns more points per minute than anything else on the paper, because a hands-on task you never verified scores exactly the same as one you never attempted.
| Block | Items | Points | Minutes | Running total |
|---|---|---|---|---|
| Read the whole paper | — | — | 5 | 5 |
| 🐦 Traffic Management | T1–T5 (3 hands-on, 2 MCQ) | 35 | 35 | 40 |
| 🐢 Securing Workloads | S1–S4 (2 hands-on, 2 MCQ) | 25 | 26 | 66 |
| 🦫 Installation, Upgrades & Config | I1–I4 (2 hands-on, 2 MCQ) | 20 | 21 | 87 |
| 🐘 Troubleshooting | D1–D4 (2 hands-on, 2 MCQ) | 20 | 20 | 107 |
| Verify & sweep flags | — | — | 13 | 120 |
The paper — 17 items across four domains
☺ Like you're 10: Nine real jobs on a real cluster, eight pick-the-right-answer questions, all sorted into the same four groups the real exam sorts them into.
Every item is tagged with its domain and its type — the real exam won't hand you that label quite so plainly, but it helps you total your score afterward and decide where to spend the fortnight after you mark this paper. Read a task's brief and its done when check, work it against your cluster, then open the folded solution only once you've genuinely attempted it. For the multiple-choice items, pick an answer before you look.
🐦 Traffic Management — 35 points
T1 (Hands-on · 10 pts · ~12 min). telemetry-api in namespace orbit has two live subsets, v1 and v2. You need a canary split with resilience built in.
Your task:
- Write a
DestinationRuledefining subsetsv1andv2, with atrafficPolicythat circuit-breaks at 50 concurrent TCP connections and ejects an endpoint after 3 consecutive 5xx errors within a 10s window, for up to 30s, capped at half the pool. - Write a
VirtualServicesplitting traffic 80/20 betweenv1andv2, with a 2s timeout and 2 retries at a 300ms per-try timeout on5xxandreset.
Done when: a loop of 50 curls from the ground-console pod to telemetry-api lands roughly 4-in-5 on v1 and 1-in-5 on v2, and istioctl analyze -n orbit reports no subset or routing errors.
Show the worked solution
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: telemetry-api
namespace: orbit
spec:
host: telemetry-api.orbit.svc.cluster.local
subsets:
- name: v1
labels: { version: v1 }
- name: v2
labels: { version: v2 }
trafficPolicy:
connectionPool:
tcp: { maxConnections: 50 }
outlierDetection:
consecutive5xxErrors: 3
interval: 10s
baseEjectionTime: 30s
maxEjectionPercent: 50
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: telemetry-api
namespace: orbit
spec:
hosts: ["telemetry-api"]
http:
- timeout: 2s
retries:
attempts: 2
perTryTimeout: 300ms
retryOn: 5xx,reset
route:
- destination: { host: telemetry-api, subset: v1 }
weight: 80
- destination: { host: telemetry-api, subset: v2 }
weight: 20The two objects have to agree with each other: the VirtualService's subset names must exist in the DestinationRule, or the split simply won't route. Weights inside one route must sum to 100.
T2 (Hands-on · 8 pts · ~9 min). External callers need to reach telemetry-api through the mesh's ingress gateway at host telemetry.orbit.example.com over plain HTTP.
Your task:
- Write a
Gatewaynamedorbit-gatewayselecting the demo profile's ingress gateway workload, listening on port 80 for that host. - Write a
VirtualServicethat binds to both the gateway and the mesh, and routes matching requests totelemetry-api.
Done when: a curl -H "Host: telemetry.orbit.example.com" against the ingress gateway's external address returns 200, and in-mesh calls to telemetry-api from inside the cluster keep working too.
Show the worked solution
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: orbit-gateway
namespace: orbit
spec:
selector:
istio: ingressgateway
servers:
- port: { number: 80, name: http, protocol: HTTP }
hosts: ["telemetry.orbit.example.com"]
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: telemetry-api-ingress
namespace: orbit
spec:
hosts: ["telemetry.orbit.example.com"]
gateways: ["orbit-gateway", "mesh"] # omit "mesh" and in-mesh callers lose this route
http:
- route:
- destination: { host: telemetry-api }The gateways field is the detail that trips people up: leave it off, or forget mesh, and either external or internal traffic silently stops matching this VirtualService.
T3 (Hands-on · 7 pts · ~8 min). The mesh is running with outboundTrafficPolicy.mode: REGISTRY_ONLY, so nothing not explicitly declared can leave it. telemetry-api needs to call an external service at api.weatherstation.example over HTTPS on port 443.
Your task: write the resource that registers this external host so calls to it are permitted.
Done when: a curl from telemetry-api's pod to https://api.weatherstation.example succeeds, while a curl to any other unlisted external host is still blocked by the registry-only policy.
Show the worked solution
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: weatherstation-api
namespace: orbit
spec:
hosts: ["api.weatherstation.example"]
ports:
- number: 443
name: https
protocol: TLS
resolution: DNS
location: MESH_EXTERNALA ServiceEntry is the mesh's registry entry for anything outside it. With REGISTRY_ONLY set, this is the only way in or out for that host — nothing else needs to change.
T4 (🐦 Traffic Management · Multiple choice · 5 pts · ~3 min). A VirtualService's route references a subset named canary, but the DestinationRule for that host defines only v1 and v2 — no canary subset exists. What is the most likely observed behavior?
- A. The request is silently routed to
v1instead - B. Requests fail — Envoy has no cluster configured for a subset that doesn't exist, typically surfacing as a 503
- C. The mTLS handshake fails
- D. The Gateway refuses to accept new listeners
Check the answer
B. A subset a VirtualService names but no DestinationRule defines has no corresponding Envoy cluster to route into, and the request fails — this is the single most common self-inflicted 503 on the real exam. istioctl analyze catches it before you ever apply it.
T5 (🐦 Traffic Management · Multiple choice · 5 pts · ~3 min). Which of the following is not one of the five resilience features the ICA curriculum names under "Using Resilience Features"?
- A. Circuit breaking
- B. Outlier detection
- C. Rate limiting
- D. Timeouts and retries
Check the answer
C. The curriculum names circuit breaking, failover, outlier detection, timeouts, and retries — five features, all covered above and in the blueprint. Rate limiting is a real Istio capability, but it isn't one of the five the curriculum lists by name under this competency, which is exactly what makes it a good distractor.
🐢 Securing Workloads — 25 points
S1 (Hands-on · 10 pts · ~12 min). The orbit namespace needs zero-trust workload identity, and telemetry-api should accept reads only from one known caller.
Your task:
- Write a
PeerAuthenticationthat requires mTLS for every workload inorbit. - Write an
AuthorizationPolicythat allows only theground-consoleServiceAccount to callGET /api/readings*ontelemetry-api.
Done when: a GET /api/readings call from the ground-console pod succeeds, the identical call from the weather-sync pod returns RBAC: access denied, and a plaintext (non-mTLS) call to telemetry-api from outside the mesh is rejected outright.
Show the worked solution
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
name: default
namespace: orbit
spec:
mtls:
mode: STRICT
---
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: allow-ground-console-reads
namespace: orbit
spec:
selector:
matchLabels: { app: telemetry-api }
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/orbit/sa/ground-console"]
to:
- operation:
methods: ["GET"]
paths: ["/api/readings*"]The moment this ALLOW policy selects telemetry-api, that workload becomes default-deny for everything not explicitly matched — which is exactly why weather-sync's identical-looking call is refused. principals is a SPIFFE identity, not an IP or a label.
S2 (Hands-on · 6 pts · ~8 min). External callers should reach telemetry-api over HTTPS at the edge. A TLS secret named orbit-tls-cert already exists in the gateway's own namespace, istio-system.
Your task: write a Gateway that terminates TLS at the edge for host telemetry.orbit.example.com using that secret.
Done when: curl https://telemetry.orbit.example.com against the ingress gateway completes a TLS handshake and returns 200.
Show the worked solution
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: orbit-gateway-tls
namespace: istio-system # credentialName must sit in the gateway's own namespace
spec:
selector:
istio: ingressgateway
servers:
- port: { number: 443, name: https, protocol: HTTPS }
hosts: ["telemetry.orbit.example.com"]
tls:
mode: SIMPLE
credentialName: orbit-tls-certSIMPLE is server-only TLS — the client verifies the server, not the reverse. credentialName only resolves against a Secret sitting in the same namespace as the gateway workload itself, which is the detail this task is actually testing.
S3 (🐢 Securing Workloads · Multiple choice · 5 pts · ~3 min). A team needs to reject requests carrying an invalid JWT, but must let requests with no JWT at all pass through untouched. Which single resource, configured alone, achieves exactly this?
- A.
RequestAuthenticationalone - B.
PeerAuthenticationinSTRICTmode alone - C.
AuthorizationPolicyalone - D. None of these alone — always pair two of them
Check the answer
A. RequestAuthentication validates a JWT if one is presented and rejects it if invalid, but it never rejects a request that presents no token at all — requiring a token to be present is a separate job for an AuthorizationPolicy with requestPrincipals. PeerAuthentication is workload identity via mTLS certificates, unrelated to end-user JWTs.
S4 (🐢 Securing Workloads · Multiple choice · 4 pts · ~3 min). An AuthorizationPolicy rule is meant to require both a specific caller identity and a valid JWT. The author writes the identity check and the JWT check as two separate - source: entries under from instead of two keys inside one source: block. What's the practical effect?
- A. No effect — both forms are identical
- B. The policy now requires identity or valid token, not identity and valid token — a hole, not a policy
- C. The policy becomes stricter, requiring both twice
- D. The policy fails to apply at all and is silently ignored
Check the answer
B. Keys inside one source (or operation) block are ANDed together; separate list entries are ORed. Splitting one intended AND condition into two list entries silently turns it into an OR — exactly the kind of self-inflicted gap this domain is built to catch.
🦫 Installation, Upgrades & Configuration — 20 points
I1 (Hands-on · 8 pts · ~9 min). Starting from a bare cluster with no mesh installed, bring up Istio and enroll the orbit namespace in sidecar mode.
Your task:
- Install Istio using
istioctlwith thedemoprofile. - Label
orbitfor sidecar injection and restart any workloads already running there.
Done when: kubectl -n istio-system get pods shows istiod and both gateways Running, and every pod in orbit reads 2/2 containers ready.
Show the worked solution
istioctl install --set profile=demo -y kubectl -n istio-system get pods # istiod, istio-ingressgateway, istio-egressgateway kubectl label namespace orbit istio-injection=enabled kubectl -n orbit rollout restart deployment # injection only applies at pod creation kubectl -n orbit get pods # every app pod should now read 2/2
Injection is a mutating webhook that only fires when a pod is created — labeling the namespace never retrofits pods already running, which is exactly why the restart is part of the done-when check, not optional cleanup.
I2 (Hands-on · 6 pts · ~9 min). A second Istio version needs to reach orbit without touching any other namespace, using a canary upgrade rather than an in-place one.
Your task:
- Install a second control plane under revision
1-25-0. - Create a revision tag
orbit-stablepointing at it. - Move only the
orbitnamespace onto the new revision and restart it.
Done when: istioctl proxy-status shows every proxy in orbit synced against the 1-25-0 control plane, while proxies in any other namespace remain on the original.
Show the worked solution
istioctl install --set revision=1-25-0 -y istioctl tag set orbit-stable --revision 1-25-0 kubectl label namespace orbit istio-injection- --overwrite # remove the plain label first kubectl label namespace orbit istio.io/rev=1-25-0 --overwrite kubectl -n orbit rollout restart deployment istioctl proxy-status # orbit rows show revision 1-25-0, SYNCED
If both istio-injection=enabled and istio.io/rev sit on the same namespace, the plain label wins — remove it first, or the namespace never actually moves to the new revision no matter what you set istio.io/rev to.
I3 (🦫 Installation · Multiple choice · 3 pts · ~2 min). Which label correctly enrolls a namespace in ambient mode, as distinct from sidecar mode?
- A.
istio-injection=enabled - B.
istio.io/dataplane-mode=ambient - C.
istio.io/rev=ambient - D.
sidecar.istio.io/inject=false
Check the answer
B. istio.io/dataplane-mode=ambient enrolls a namespace in ambient mode, where a per-node ztunnel plus the cni chart do the work instead of an injected sidecar. istio-injection=enabled is the sidecar-mode label — the two modes use different labels entirely and are mutually exclusive per namespace.
I4 (🦫 Installation · Multiple choice · 3 pts · ~2 min). Installing Istio via Helm rather than istioctl, which order must the three charts be installed in?
- A.
istiod, thenbase, thengateway - B.
gateway, thenbase, thenistiod - C.
base, thenistiod, thengateway - D. Order doesn't matter — Helm resolves it automatically
Check the answer
C. base installs the CRDs everything else depends on, istiod installs the control plane, and gateway installs per ingress or egress gateway last — each chart genuinely depends on the one before it.
🐘 Troubleshooting — 20 points
D1 (Hands-on · 8 pts · ~9 min). After a routing change, calls to telemetry-api started returning 503s. The DestinationRule from T1 is in place, but the VirtualService was just edited by a teammate.
Your task: using the mesh's own tooling — not a guess — find what the teammate broke, and fix it.
Done when: istioctl analyze -n orbit reports no errors, and curls to telemetry-api succeed again.
Show the worked solution
# 1. Configuration first — lint before assuming a network fault istioctl analyze -n orbit # analyze typically reports something like: # Warning [IST0101] VirtualService telemetry-api: subset "cannary" # referenced by route is not found in DestinationRule "telemetry-api" # 2. Confirm at the data-plane layer, one proxy at a time istioctl proxy-config route telemetry-api-7d9f-abcde.orbit --name 80 # 3. Fix the typo in the VirtualService's route and reapply kubectl -n orbit edit virtualservice telemetry-api # cannary -> v2 istioctl analyze -n orbit # clean
The three-layer ladder — configuration, control plane, data plane — puts istioctl analyze first for exactly this reason: a typo'd subset name is a static configuration error, and the linter finds it in one command instead of a chain of live-traffic guesses.
D2 (Hands-on · 6 pts · ~7 min). The weather-sync ServiceAccount reports RBAC: access denied calling telemetry-api, even though a teammate insists they wrote an AuthorizationPolicy that should allow it.
Your task: find the bug in the existing policy below and fix it — do not simply delete it.
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: allow-weather-sync
namespace: orbit
spec:
selector:
matchLabels: { app: telemetry-api }
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/orbit/sa/weather_sync"] # <- bug is in here
to:
- operation:
methods: ["GET"]Done when: GET calls from the weather-sync pod to telemetry-api succeed.
Show the worked solution
The principals value has an underscore where the real ServiceAccount name uses a hyphen — weather_sync instead of weather-sync — so the SPIFFE identity never matches and every call from that ServiceAccount falls through to the implicit default-deny. Correct it:
principals: ["cluster.local/ns/orbit/sa/weather-sync"]
Identity strings in AuthorizationPolicy are compared exactly, with no fuzzy matching — a one-character typo produces the identical RBAC: access denied as a genuinely missing rule, which is exactly why this class of bug survives a quick read-through of the YAML.
D3 (🐘 Troubleshooting · Multiple choice · 3 pts · ~2 min). Running istioctl proxy-status, one proxy's row reads STALE instead of SYNCED. What does that mean?
- A. The proxy has received no configuration at all yet
- B. The control plane has a newer configuration push that hasn't reached this proxy — it's running out-of-date config
- C. The workload has no sidecar injected
- D. The proxy's mTLS certificate has expired
Check the answer
B. STALE means a push is stuck — the control plane has something newer than what this proxy is currently running. NOT SENT, not STALE, is the status for "nothing to send yet."
D4 (🐘 Troubleshooting · Multiple choice · 3 pts · ~2 min). Immediately after enabling STRICT mTLS on a namespace, a handful of calls that used to work start failing. What is the single most likely cause?
- A. The
DestinationRulewas deleted - B. Something outside the mesh is calling in directly — an unlabeled namespace, a liveness probe, or a client hitting a pod IP without a sidecar
- C. The Istio version was downgraded
- D. The ingress gateway's certificate expired
Check the answer
B. STRICT mode requires every caller to present a mesh certificate. Callers that were never part of the mesh in the first place — an unenrolled namespace, a kubelet probe, a plaintext client — are exactly what starts failing the moment the mode flips, and it's the first thing to check before assuming a policy or routing bug.
"The multiple-choice half of this paper felt familiar — I've sat plenty of quizzes. The hands-on half was the surprise. Knowing that PeerAuthentication answers 'must the caller present a certificate' is not the same skill as typing it correctly at 11pm with a stopwatch running, and D2 humbled me — I stared at weather_sync for four minutes convinced the policy logic itself was wrong, when the bug was one character wide the whole time."
Before you sit the whole 120 minutes, do a dry run of just the transition between item types. Set a 10-minute timer, work T1 (hands-on) to a passing done-when check, then immediately open S3 (multiple choice) and answer it cold within 90 seconds. Notice the mental gear change — from "is this YAML actually applying correctly on a live cluster" to "which one of these four options is exactly right." That gear change, repeated seventeen times under a clock, is most of what makes a hybrid exam harder than either half alone.
Score yourself
☺ Like you're 10: Add up your points, but then look at which of the four groups cost you the most — that second part is the useful part.
Mark after a break, not immediately — marking your own work while still adrenalised produces generous nonsense. For hands-on tasks, award full points only when the done-when check actually passed on your cluster, half when the resource exists and is broadly right but the check didn't pass, and zero for anything unattempted. Multiple-choice items are binary: full points for the correct letter, zero otherwise — there's no partial credit for a right idea and a wrong click. The Linux Foundation doesn't publish a pass mark for the ICA at all; treat a comfortable, round 75 of 100 as this course's own rough target, not a guaranteed line on the real exam, and verify current guidance on the official Linux Foundation ICA page before you rely on any number here.
| Domain | Items in this paper | Points available | Your score |
|---|---|---|---|
| 🐦 Traffic Management (35%) | T1–T5 | 35 | |
| 🐢 Securing Workloads (25%) | S1–S4 | 25 | |
| 🦫 Installation, Upgrades & Config (20%) | I1–I4 | 20 | |
| 🐘 Troubleshooting (20%) | D1–D4 | 20 | |
| Total | 17 items | 100 |
Also total your two item types separately: hands-on (out of 69) and multiple-choice (out of 31). A strong multiple-choice score covering a weak hands-on score is the specific failure mode this paper exists to catch — you can describe every resource correctly and still fail a hybrid exam if your hands never quite keep up with your explanation of them.
Sort every miss into one of three piles, because each calls for a different fix. A hands-on task where you didn't know which resource to reach for is a genuine content gap — reread the matching section of the blueprint and redo the exact task cold in a couple of days. A hands-on task where you knew the shape but the YAML had a small, silent error — like D2's typo'd ServiceAccount name — is a precision problem, and the fix is more untimed reps in the practice bank, typing every manifest out in full rather than copying it. A multiple-choice miss where you genuinely didn't know the fact is the plainest kind of gap and the cheapest to close by rereading; a miss where you knew it and still picked wrong under time pressure is a confidence problem, and the fix is another timed paper, not more reading.
Foxy: I finished all four multiple-choice sections early. It's D2 that wrecked me — I was so sure the policy logic itself was broken.
Benny: That's the point of putting a hands-on troubleshooting task next to the questions, Foxy. Reading about a bug and finding one in your own broken cluster use different muscles entirely.
Timmy: How many done-when checks did you actually re-run in the verification sweep, versus just eyeballing the YAML?
Foxy: …eyeballed most of them. They looked right.
Gizmo: Obvious fix — skip the thirteen-minute verify block entirely next time. Free minutes for more questions! 😈
Timmy: The verify block is exactly where "looked right" turns into "actually passed" or "actually still broken," Foxy — that's not spare time, that's where half your hands-on points get confirmed or lost.
Professor Owl: Re-drill D2's exact pattern — one typo, real damage — then sit Set 2 once you trust your own re-reads. Not before, or you'll just relearn the same lesson twice.
After the sitting
☺ Like you're 10: Practice only the parts you got wrong, and save the next two tests for when you're actually ready for them.
Resist the urge to re-drill everything. The whole value of a scored, weighted paper is that it tells you where not to spend your next week. Take your weakest domain and your weakest item type, work only those — the blueprint and the practice bank both split cleanly along the same four domains — and re-run the specific tasks you flagged rather than the whole paper. Everything else you already demonstrated under a clock; grinding it again is comfort, not preparation. Leave Set 2 and Set 3 genuinely sealed until then, spacing them a few days apart as your remaining cold measurements before the real exam.
1. Why does this paper split points 69/31 between hands-on tasks and multiple-choice questions, and why is that specific split this course's own construction rather than a published CNCF ratio? 2. State the grading rule for a hands-on task — what earns full credit, what earns half, what earns zero? 3. What is the flag-and-move threshold on this paper, and what should you do with the YAML you already applied when you flag a task? 4. Which two domains together make up 60 of this paper's 100 points, and why does that make them the ones to shore up first if your prep is thin? 5. Why should the final 13-minute verification sweep re-run every done-when check rather than trusting your memory of what happened? 6. The real ICA's item count and pass mark are both unpublished — what number does this page use as a rough target, and how should you treat it? 7. When should Set 2 and Set 3 be sat relative to Set 1, and what must you avoid doing with them beforehand?
Check your answers
- Because a hybrid exam spends most of its own effort on the hands-on half even though the Linux Foundation doesn't publish an exact ratio — this paper's 69/31 split is this course's own study scaffolding, chosen to sit inside the anecdotal fifteen-to-twenty item range candidates report, not a leaked format.
- Full points only when the done-when check actually passed on your cluster; half when the resource exists and is broadly right but the check didn't pass; zero for anything unattempted.
- Roughly the item's own budgeted minutes (see the budget table) without a passing check or a confident answer. For a hands-on task, write one line on where you stalled, leave the YAML applied — partial credit is real — and move to the next item.
- Traffic Management (35) and Securing Workloads (25), totaling 60 of 100 points. They're the largest domains by a wide margin, so a gap in either one costs far more than an equivalent gap in Installation or Troubleshooting, and both deserve the first pass of any remedial studying.
- Because a hands-on task that "looks right" and one that actually passes its check score identically to the grader that matters — the real exam's — and only re-running the check tells you which one you actually have. Trusting memory is exactly how a passing-looking task quietly earns a zero.
- 75 of 100, presented explicitly as this course's own rough target rather than a confirmed pass mark, since the Linux Foundation publishes neither the ICA's item count nor its cut score. Verify current guidance on the official Linux Foundation ICA page before relying on any number here.
- Days apart, only after re-drilling the specific gaps this sitting exposed — not immediately, and not skimmed "just to see how hard they are" beforehand, since that spends your last genuinely cold measurements for nothing.
That's the full sitting. Reset the timer, close every tab except whatever documentation you've actually verified is permitted, and let the seventeen items above show you exactly which of the four domains — and which item type — is still soft. Fix precisely that, and nothing else, before you move on to Set 2.