Certifications · ICA · hybrid · mock exam · set 1

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.

☺ Explain it like I'm 10

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.

🐢🦫Your hosts for this topic: Timmy the Turtle & Benny the Beaver — Timmy holds the stopwatch for the full two hours and won't stop it for anything, and Benny refuses to award a single point until the done-when check actually passes against a live mesh, not just "looks right" in the YAML.

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.

StageWhat you doWhat it tells you
1 · Build the vocabularyRead 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 itemsThe 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 1This 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 3Re-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.
◆ Why 17 items in this shape

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.

⚠ Format specifics — verify officially before booking

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 anything
⚠ Confirm this before the clock starts, not after

A 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.

120 minutes · 17 items · 100 points · pass mark not published (verify officially) Weighted to the four real ICA domains 🐦 Traffic 35% 🐢 Securing 25% 🦫 Install 20% 🐘 Diagnose 20% Points by item type — hands-on carries most of the paper Hands-on · 9 tasks · 69 pts Multiple choice · 8 · 31 pts 0 120 min Flag-and-move rule Hands-on task past its budgeted minutes with no passing done-when check: write one line on where you stalled, leave the YAML applied, move on. MCQ past its budget: commit to your best guess and go.
BlockItemsPointsMinutesRunning total
Read the whole paper55
🐦 Traffic ManagementT1–T5 (3 hands-on, 2 MCQ)353540
🐢 Securing WorkloadsS1–S4 (2 hands-on, 2 MCQ)252666
🦫 Installation, Upgrades & ConfigI1–I4 (2 hands-on, 2 MCQ)202187
🐘 TroubleshootingD1–D4 (2 hands-on, 2 MCQ)2020107
Verify & sweep flags13120

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:

  1. Write a DestinationRule defining subsets v1 and v2, with a trafficPolicy that 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.
  2. Write a VirtualService splitting traffic 80/20 between v1 and v2, with a 2s timeout and 2 retries at a 300ms per-try timeout on 5xx and reset.

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: 20

The 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:

  1. Write a Gateway named orbit-gateway selecting the demo profile's ingress gateway workload, listening on port 80 for that host.
  2. Write a VirtualService that binds to both the gateway and the mesh, and routes matching requests to telemetry-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_EXTERNAL

A 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?

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"?

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:

  1. Write a PeerAuthentication that requires mTLS for every workload in orbit.
  2. Write an AuthorizationPolicy that allows only the ground-console ServiceAccount to call GET /api/readings* on telemetry-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-cert

SIMPLE 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?

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?

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:

  1. Install Istio using istioctl with the demo profile.
  2. Label orbit for 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:

  1. Install a second control plane under revision 1-25-0.
  2. Create a revision tag orbit-stable pointing at it.
  3. Move only the orbit namespace 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?

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?

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?

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?

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.

🦆 Dot's-eye view

"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."

🦫 Benny's twenty-minute drill

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.

DomainItems in this paperPoints availableYour score
🐦 Traffic Management (35%)T1–T535
🐢 Securing Workloads (25%)S1–S425
🦫 Installation, Upgrades & Config (20%)I1–I420
🐘 Troubleshooting (20%)D1–D420
Total17 items100
◆ Key idea

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.

🎬 At Mission Control
🦊

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.

🐢 Timmy's checkpoint

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
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.

⏱️ The three papers

Set 1 (you are here) · Set 2 · Set 3. All three are 17 items weighted to the same official domain percentages and scored against the same 75-point rough target; see the study plan for when to sit each one, and the ICA blueprint for the real exam's domains, resource pairs, and day-of logistics.