Everything before this lesson taught you to do GitOps with Argo CD. This lesson teaches you to prove it — to a proctor and to a hiring panel. Those are two different audiences with one shared body of knowledge, and this is the capstone that turns forty lessons of mechanics into the two outcomes that actually pay: a certificate on your profile and an offer in your inbox.
There are two doors here. The first is the CGOA — the Certified GitOps Associate, the Cloud Native Computing Foundation’s vendor-neutral GitOps exam. It does not test Argo CD specifically; it tests GitOps the methodology — the four principles, the vocabulary, the patterns — with Argo CD and Flux as the reference tools. The second door is the Argo CD job interview: the junior screen (“what is an Application?”), the mid-level mechanics round (“app-of-apps or ApplicationSet?”), the staff-level design round (“GitOps for fifty teams across three clouds”), and the behavioural round (“tell me about a deploy that went wrong”). Both doors open with the same key.
Read this lesson the way you would train for an exam, not the way you read a tutorial. Cover the answers, attempt each question cold, then check yourself. The Hands-on lab at the end is a timed mock plus a grade-yourself rubric that maps every weak area back to the specific lesson you should revisit. Work it honestly and you will know — before the proctor or the panel tells you — exactly where you stand.
Why this matters
A certificate and an interview are both compression tests: someone with limited time needs a reliable signal that you understand a large subject. The CGOA compresses “do you understand GitOps?” into ninety minutes of multiple choice. An interview loop compresses “can we trust you with production?” into a few hours of conversation. In both cases, the person on the other side is not looking for trivia recall — they are looking for whether you hold the right mental model and can apply it under mild pressure.
That is good news, because a right mental model is exactly what this course has been building. The reader who started at GitOps From First Principles and worked through sync waves, ApplicationSets, multi-cluster fan-out, secrets, and progressive delivery already has the substance. What remains is packaging: knowing the exam’s shape so nothing surprises you, and knowing how to structure an interview answer so the model in your head lands cleanly in the interviewer’s.
Here is the anchor for the whole lesson. The CGOA and the Argo CD interview test the same substrate from two angles. The exam asks “what is continuous reconciliation?” in the abstract; the interview asks “your app shows OutOfSync forever — what’s happening?” in the concrete. If you can move fluidly between the abstract principle and the concrete Argo CD mechanism that implements it, you pass both. That fluency — concept on the left, kubectl/argocd mechanism on the right — is the single skill this lesson drills.
The CGOA — what the Certified GitOps Associate actually is
The Certified GitOps Associate (CGOA) is an entry-level certification created by the CNCF and administered by the Linux Foundation. It launched to give the GitOps community a vendor-neutral credential — a way to say “I understand GitOps as a discipline” without tying that claim to any one tool. The exam is built on the OpenGitOps project’s principles (covered below), and its reference reconcilers are the two CNCF GitOps tools: Argo CD and Flux. You will see concepts illustrated with both; you are never asked to recall an Argo-CD-only CLI flag.
Crucially, CGOA is a multiple-choice, knowledge exam — not a hands-on lab. This is the opposite of the CKA/CKAD/CKS certifications, which drop you into a live cluster. There is no terminal, no kubectl, no cluster to break. That changes how you prepare: you are optimising for conceptual precision and vocabulary, not for muscle memory at a prompt. Get the definitions exactly right and you are most of the way there.
The logistics, verified against the official Linux Foundation and CNCF pages:
| Attribute | Detail |
|---|---|
| Full name | Certified GitOps Associate (CGOA) |
| Owner / administrator | CNCF (content) · The Linux Foundation (delivery) |
| Level | Associate (entry-level, pre-professional) |
| Format | Online, remotely proctored, multiple-choice |
| Hands-on? | No — knowledge exam only (contrast: CKA/CKAD are performance-based) |
| Duration | 90 minutes |
| Cost | USD 250 (bundles available with a training subscription) |
| Retakes | One free retake included (two attempts total) |
| Eligibility window | 12 months to schedule and sit the exam |
| Validity | 2 years |
| Prerequisites | None (KCNA-adjacent foundational knowledge helps) |
| Result | PDF certificate + verifiable digital badge |
Two numbers people always ask for — the exact question count and the passing score — are not published by the Linux Foundation for CGOA. Be honest about this in your own head and do not repeat “60 questions, 75% to pass” as if it were official. It is reliable community folklore: candidates consistently report roughly 60 multiple-choice questions and a passing bar around 75%. Treat those as planning assumptions, not guarantees, and aim comfortably above 75% so a few surprises cannot sink you. What is official is the domain weighting, and that is where you should spend your minutes.
Where does CGOA sit relative to the other CNCF entry certs? It is a sibling to KCNA, not a competitor — different subject, same associate tier:
| Certification | Subject | Format | Hands-on | Best paired with |
|---|---|---|---|---|
| CGOA | GitOps methodology (Argo CD/Flux as references) | Multiple choice | No | This course; OpenGitOps docs |
| KCNA (Kubernetes and Cloud Native Associate) | Cloud-native + Kubernetes basics | Multiple choice | No | Foundational Kubernetes study |
| KCSA (Kubernetes and Cloud Native Security Associate) | Cloud-native security basics | Multiple choice | No | Security hardening lessons |
| CKA (Certified Kubernetes Administrator) | Operating Kubernetes | Performance-based | Yes | Hands-on cluster practice |
| CKAD / CKS | App dev on / security of Kubernetes | Performance-based | Yes | Post-CKA specialisation |
Is it worth your time and USD 250? Match the goal to the honest answer:
| If you are… | CGOA value | Why |
|---|---|---|
| Early-career, breaking into platform/DevOps | High | A concrete, vendor-neutral signal that you understand modern delivery |
| A Kubernetes engineer adding GitOps to your CV | High | Fills the “delivery methodology” gap next to a CKA |
| A senior/staff engineer already running Argo CD in prod | Moderate | The badge adds little; the structured review still sharpens interviews |
| Preparing for GitOps interviews specifically | High (as prep) | The CGOA syllabus is a near-perfect interview study map |
| Chasing a hands-on Argo CD skills proof | Low fit | CGOA is conceptual; prove hands-on skill with a portfolio/kind demo instead |
The five CGOA domains, mapped to this course
The exam is officially divided into five domains with fixed weights. Internalise these percentages — they tell you exactly where to spend study time, and they are the single most useful fact about the exam. GitOps Principles alone is 30%, so nearly a third of your result rides on four ideas. Terminology and Patterns are 20% each; Related Practices 16%; Tooling 14%.
This table is your study map. Each domain lists its official sub-topics and the course lessons that cover it — revisit the named lesson for any row you feel shaky on:
| Domain (weight) | Official sub-topics | Where this course covers it |
|---|---|---|
| GitOps Principles — 30% | Declarative · Versioned and Immutable · Pulled Automatically · Continuously Reconciled | GitOps From First Principles: Declarative, Versioned, Pulled & Continuously Reconciled; Sync Policies (automated/selfHeal/prune); Diffing, Drift & ignoreDifferences |
| GitOps Terminology — 20% | Continuous · Declarative Description · Desired State · State Drift · State Reconciliation · Managed Software System · State Store · Feedback Loop · Rollback | First Principles; Sync Status & Health Assessment; Architecture: repo-server, controller, Redis |
| GitOps Patterns — 20% | Deployment & Release Patterns · Progressive Delivery · Pull vs Event-driven · Architecture Patterns (in-cluster vs external reconciler) | App-of-Apps Pattern; ApplicationSets & Generators; Hub-Spoke Multi-Cloud Fleet; Argo Rollouts: Canary & Blue-Green; Rollouts Analysis & Auto-Rollback |
| Related Practices — 16% | Configuration as Code · Infrastructure as Code · DevOps & DevSecOps · CI and CD | First Principles (push vs pull, where CI hands off); Cluster Bootstrapping & Terraform Handoff; Image Updater |
| Tooling — 14% | Manifest format & packaging · State stores (Git & alternatives) · Reconciliation engines (Argo CD, Flux, alternatives) · Interop (notifications, observability, CI) | Helm Integration; Kustomize Integration; Config Management Plugins; Notifications; Observability: Metrics, Prometheus & Grafana; Argo CD vs Flux |
The diagram below is the same idea as a prep path. Read it left to right: the five domains on the left are the knowledge base; Argo CD is the reference tool you point every abstract concept at; you drill through a graded Q&A bank and design scenarios, then through troubleshooting reps; the payoff on the right is the same for both goals — a CGOA pass and a job offer.
The badges mark where candidates actually lose marks: over-index on the four principles because they are 30% (1); remember the exam is vendor-neutral but every concept has an Argo CD embodiment (2); interviews reward structure over trivia (3); troubleshooting is a fixed diagnostic order, not a lucky guess (4); know the exam format so nothing surprises you (5); and understand that one body of prep clears both the cert and the loop (6).
The OpenGitOps project — the source of the principles
You cannot over-prepare the principles, so start at their source. OpenGitOps is a CNCF Sandbox project run by the GitOps Working Group (under the CNCF Application Delivery Technical Advisory Group). Its job is to define GitOps in a tool-agnostic way — a set of open standards and principles that any tool (Argo CD, Flux, or something else) can claim to implement. The CGOA is built directly on OpenGitOps Principles v1.0.0. When the exam says “a GitOps system must…”, it is quoting this document.
| OpenGitOps at a glance | Detail |
|---|---|
| What it is | Vendor-neutral GitOps standards, principles, and community education |
| Governance | CNCF Sandbox project · GitOps Working Group · App Delivery TAG |
| Canonical artefact | The 4 GitOps Principles, v1.0.0 |
| Why it matters for CGOA | The exam’s Principles (30%) and much of Terminology come straight from it |
| One-line definition | GitOps is an operating model where the desired state of a system is declared, versioned in an immutable store, and continuously reconciled into the running system by software agents that pull it |
A subtle point the exam loves: the principles say the desired state lives in a versioned, immutable store — they do not say the store must literally be Git. Git is the overwhelmingly common choice (and the “Git” in GitOps), but an OCI registry or another versioned, immutable store can satisfy the principle. If a question offers “the state store must be a Git repository” as an absolute, be suspicious.
The four GitOps principles — the 30% that decides your result
Memorise these four, in order, by name — and, more importantly, by counter-example. The exam rarely asks “list the principles”; it describes a scenario and asks which principle it satisfies or violates. Knowing what breaks each principle is worth more than reciting it.
| # | Principle (v1.0.0 wording) | In plain English | How Argo CD embodies it | What VIOLATES it (the exam trap) |
|---|---|---|---|---|
| 1 | Declarative — “A system managed by GitOps must have its desired state expressed declaratively.” | You describe the what, not the how. Manifests, not scripts. | Kubernetes manifests / Helm / Kustomize are declarative desired state | An imperative kubectl scale or a bash deploy script that lists steps |
| 2 | Versioned and Immutable — “Desired state is stored in a way that enforces immutability, versioning and retains a complete version history.” | Every change is a new, immutable version with full history — so you can roll back to any point. | A Git repo (commits are immutable, history is complete) | Editing state in place with no version trail; a mutable “latest” that overwrites |
| 3 | Pulled Automatically — “Software agents automatically pull the desired state declarations from the source.” | An agent inside the trust boundary fetches the state — nobody pushes credentials in from outside. | The application-controller pulls from Git; the repo-server clones and renders | A CI job running kubectl apply from the pipeline (that is push, not pull) |
| 4 | Continuously Reconciled — “Software agents continuously observe actual system state and attempt to apply the desired state.” | The agent never stops comparing desired vs actual and correcting drift — it is a loop, not a one-shot. | The controller reconciles on a loop; selfHeal reverts drift |
A one-time apply with no ongoing drift correction; disabling reconciliation |
Two comparisons underpin these principles and appear constantly on both the exam and in interviews. First, declarative vs imperative — the heart of principle 1:
| Declarative | Imperative | |
|---|---|---|
| You specify | The desired end state | The steps to get there |
| Example | “3 replicas of image v2” in a manifest | kubectl scale --replicas=3, then set image … |
| Idempotent? | Yes — re-applying is a no-op if already correct | No — steps assume a starting state |
| GitOps-compatible | Yes (principle 1) | No — cannot be reconciled from a stored end-state |
| Rollback | Re-apply an older state (git revert) | Manually script the reverse steps |
Second, push vs pull — the heart of principle 3 and the single most-tested distinction across GitOps interviews. This is covered in depth in GitOps From First Principles; the exam-critical summary:
| Push (traditional CI/CD) | Pull (GitOps) | |
|---|---|---|
| Who applies changes | The CI pipeline, from outside the cluster | An agent inside the cluster (or a trusted hub) |
| Where cluster credentials live | In the CI system (a fat target) | Never leave the cluster/hub trust boundary |
| Drift correction | None by default — CI ran once and left | Continuous — the agent re-reconciles forever |
| New cluster onboarding | Wire CI creds to every new cluster | Register the cluster; the agent pulls |
| GitOps principle | Violates “pulled automatically” | Satisfies principles 3 and 4 |
| Argo CD’s model | — | Pull (with optional webhooks to trigger faster) |
A common point of confusion worth pre-empting: “pulled automatically” does not mean “polling only”. Argo CD polls Git on a reconciliation interval (three minutes by default) and accepts webhooks that trigger an immediate reconcile. Webhook-driven GitOps is still “pull” — the agent still fetches and applies; the webhook just tells it when. This is the exam’s pull vs event-driven pattern topic, and the correct framing is that event-driven is an optimisation of pull, not an alternative to it.
CGOA practice question bank
Twenty-five multiple-choice questions in the CGOA style, grouped by domain and weighted toward Principles. Cover the answers first. Each answer states the correct option and why, plus why the tempting wrong one is wrong — because on a multiple-choice exam, eliminating distractors is half the skill.
| Domain | Questions in this bank |
|---|---|
| Principles | Q1–Q8 (the 30% — most reps here) |
| Terminology | Q9–Q14 |
| Patterns | Q15–Q19 |
| Related Practices | Q20–Q22 |
| Tooling | Q23–Q25 |
Q1. Which is NOT one of the four OpenGitOps principles? A) Declarative · B) Versioned and Immutable · C) Encrypted at Rest · D) Continuously Reconciled Answer: C. The four are Declarative, Versioned and Immutable, Pulled Automatically, Continuously Reconciled. Encryption is good practice but is not a GitOps principle.
Q2. A CI pipeline runs kubectl apply -f against the cluster using credentials stored in the CI system. Which principle does this most directly violate?
A) Declarative · B) Pulled Automatically · C) Versioned and Immutable · D) Continuously Reconciled
Answer: B. Applying from CI is a push; the agent is not pulling desired state from inside the trust boundary. (It also fails continuous reconciliation, but the credentials-pushed-in detail points squarely at “pulled automatically”.)
Q3. Desired state stored so that every change is a new, immutable revision with complete history satisfies which principle? A) Declarative · B) Versioned and Immutable · C) Pulled Automatically · D) Continuously Reconciled Answer: B. Immutability + full version history is the definition of principle 2.
Q4. An operator uses kubectl edit to change a live Deployment’s replica count. Under continuous reconciliation with self-heal enabled, what should happen?
A) The change persists permanently · B) The agent reverts the live state back to the declared desired state · C) The Git repo is updated to match the live change · D) The application is deleted
Answer: B. Continuous reconciliation observes the drift and re-applies desired state. GitOps never writes live changes back to Git — that would invert the source of truth.
Q5. In GitOps, the correct way to roll back a bad release is to:
A) SSH to nodes and restore containers · B) kubectl rollout undo manually · C) Revert the commit in the state store and let the agent reconcile · D) Delete and recreate the cluster
Answer: C. Rollback in GitOps is a version operation on the immutable store; the reconciler applies the previous desired state. This ties principles 2 and 4 together.
Q6. Which statement about the GitOps state store is most accurate? A) It must be a GitHub repository · B) It must be a Git repository specifically · C) It must be versioned and immutable; Git is the common choice but not the only valid one · D) It can be any database Answer: C. The principle constrains the properties (versioned, immutable), not the product. Git is canonical; an OCI registry can also qualify. A mutable database does not.
Q7. “Declarative” in GitOps primarily means: A) Written in YAML · B) The desired end-state is described, not the steps to reach it · C) Stored in Git · D) Applied automatically Answer: B. YAML is a common format, but declarative is about end-state vs steps. A YAML file full of imperative Job steps is still imperative in spirit.
Q8. Which pair of principles most directly enables reliable, auditable rollback? A) Declarative + Pulled · B) Versioned and Immutable + Continuously Reconciled · C) Pulled + Declarative · D) Tooling + Terminology Answer: B. Immutable version history gives you a known-good point to return to; continuous reconciliation applies it. (Tooling and Terminology are domains, not principles — a distractor.)
Q9. In GitOps terminology, “state drift” is:
A) A network partition · B) Divergence between the actual system state and the declared desired state · C) A Git merge conflict · D) A slow reconcile
Answer: B. Drift = actual ≠ desired. In Argo CD this surfaces as an OutOfSync status.
Q10. The “feedback loop” in GitOps refers to: A) Slack notifications · B) Agents observing actual state and reporting/acting on the difference from desired · C) Pull request reviews · D) CI test results Answer: B. The feedback loop is the observe-compare-act cycle. Notifications are one output of it, not the loop itself.
Q11. “Continuous” in the GitOps sense means: A) The pipeline runs on every commit · B) Reconciliation is an ongoing process, not a one-time apply · C) Continuous integration · D) 24/7 on-call Answer: B. GitOps is “continuous” because the agent never stops reconciling — distinct from CI’s “continuous integration”.
Q12. “Desired state” is best defined as: A) The current live state of the cluster · B) The declared, version-controlled specification of how the system should be · C) The last successful deploy · D) The container image digest Answer: B. Desired state is what you declare in the store; actual state is what is running. The whole model is about closing the gap between them.
Q13. A “GitOps managed software system” is one where: A) The code is hosted on Git · B) The operational state is declared, versioned, and continuously reconciled by agents · C) Developers use pull requests · D) It runs on Kubernetes Answer: B. The defining trait is the operating model, not the hosting or the platform. GitOps is not Kubernetes-specific in principle.
Q14. “State reconciliation” is the process of: A) Merging two Git branches · B) Resolving RBAC conflicts · C) Making the actual state match the desired state · D) Backing up etcd Answer: C. Reconciliation drives actual toward desired — the core action of principle 4.
Q15. In the “in-cluster reconciler” architecture pattern, the reconciliation agent runs: A) In the CI system · B) Inside the cluster it manages · C) On the developer’s laptop · D) In the Git host Answer: B. In-cluster: the agent lives in the managed cluster (Flux’s typical model, or Argo CD managing its own cluster). Contrast with the external reconciler pattern, where a hub manages remote clusters.
Q16. A hub Argo CD instance reconciling into several remote clusters is an example of: A) The in-cluster pattern · B) The external reconciler pattern · C) Push-based CI · D) A monolith Answer: B. The reconciler is external to the clusters it manages — the hub-spoke topology.
Q17. Progressive delivery (canary, blue-green) is best described as: A) A Git branching strategy · B) Gradually shifting traffic/version to reduce blast radius, often gated by metrics · C) Rolling back on every error · D) A type of state store Answer: B. Progressive delivery limits blast radius by advancing exposure in steps, frequently gated by an automated analysis of metrics.
Q18. “Event-driven” reconciliation differs from “polling” in that: A) It violates GitOps principles · B) A change event (e.g. a webhook) triggers reconciliation instead of waiting for the next poll · C) It pushes from CI · D) It disables drift detection Answer: B. Event-driven is still pull; the event just triggers the fetch-and-apply sooner than the interval would.
Q19. Which is a deployment/release pattern rather than a GitOps principle? A) Declarative · B) Continuously Reconciled · C) Blue-green deployment · D) Pulled Automatically Answer: C. Blue-green is a release pattern (Patterns domain). The others are principles.
Q20. Infrastructure as Code (IaC) relates to GitOps by: A) Replacing it entirely · B) Declaring infrastructure declaratively and versioning it — a related practice GitOps builds on · C) Being the same thing as CI · D) Being incompatible with Git Answer: B. IaC is a related practice: declarative, versioned infra. GitOps applies the same discipline to the operational/app-delivery layer and adds continuous reconciliation.
Q21. Where does Continuous Integration (CI) end and GitOps (CD) begin, in the canonical model? A) They are the same system · B) CI builds/tests and pushes an artefact + updates the desired state in the store; the GitOps agent reconciles it · C) GitOps builds the images · D) CI reconciles the cluster Answer: B. CI produces artefacts and proposes a new desired state (e.g. a new image tag in Git); the GitOps agent pulls and applies it. GitOps does not build images.
Q22. “Configuration as Code” primarily means: A) Writing application source code · B) Managing configuration declaratively in version control · C) Hard-coding config in the binary · D) Storing config only in the cluster Answer: B. CaC keeps configuration in a versioned store, which is what makes it reconcilable.
Q23. Which two tools are the CNCF’s graduated GitOps reconciliation engines most referenced by CGOA? A) Jenkins and GitLab · B) Argo CD and Flux · C) Terraform and Ansible · D) Helm and Kustomize Answer: B. Argo CD and Flux are the reference reconcilers. Helm/Kustomize are packaging/templating tools, not reconcilers; Terraform/Ansible are IaC/config tools.
Q24. Helm and Kustomize, in GitOps tooling terms, are: A) Reconciliation engines · B) State stores · C) Manifest packaging/templating tools · D) CI systems Answer: C. They produce/parameterise manifests; a reconciler (Argo CD/Flux) then applies them.
Q25. Which is a valid GitOps state store besides a Git repository? A) A running Pod · B) An OCI registry holding versioned, immutable artefacts · C) A Redis cache · D) An etcd snapshot Answer: B. An OCI registry can hold versioned, immutable config artefacts and satisfy the store’s required properties. A cache or a live Pod does not.
Argo CD interview prep — junior level
The junior screen tests whether you have the vocabulary and the mental model right. Answers should be crisp, correct, and free of hand-waving. Interviewers at this level are ruling out people who have only read the marketing.
Q: What is GitOps, in one or two sentences? A: GitOps is an operating model where the desired state of a system is declared and versioned in an immutable store (usually Git), and software agents continuously pull that state and reconcile the running system to match it. In short: Git is the source of truth, and an agent inside the trust boundary makes reality match Git, forever.
Q: What is Argo CD? A: Argo CD is a declarative, pull-based GitOps continuous delivery tool for Kubernetes. It runs in the cluster (or a hub cluster), watches Git repositories for Kubernetes manifests (plain YAML, Helm, or Kustomize), and continuously reconciles the live cluster state to match Git — surfacing drift, self-healing, and giving you a UI/CLI view of sync and health.
Q: Push vs pull — what’s the difference and which is Argo CD? A: In push, a CI pipeline applies changes to the cluster from outside, holding cluster credentials. In pull, an in-cluster agent fetches desired state and applies it, so credentials never leave the cluster. Argo CD is pull-based, which is why it satisfies the “pulled automatically” GitOps principle and why a compromised CI system cannot directly touch the cluster.
Q: What is an Argo CD Application?
A: It is a custom resource (kind: Application, apiVersion: argoproj.io/v1alpha1) that defines one deployable unit: a source (repo URL, target revision, path, and Helm/Kustomize config), a destination (cluster server or name + namespace), a project (its AppProject guardrail), and a syncPolicy. It is the pairing of “this desired state, from here” with “goes to there”.
Q: Explain sync status vs health status — aren’t they the same?
A: No — they are orthogonal. Sync status (Synced / OutOfSync) answers “does the live cluster match Git?” Health status (Healthy, Progressing, Degraded, etc.) answers “are the running resources actually working?” You can be Synced but Degraded (Git applied cleanly, but the Pod is crash-looping) or OutOfSync but Healthy (the old version is running fine while a new commit waits to be applied). Confusing the two is the classic junior mistake.
Q: What does OutOfSync mean, exactly?
A: It means Argo CD computed a diff between the desired state rendered from Git and the live state in the cluster, and they differ. It does not mean anything is broken — it means “reality and Git disagree”. The next step is argocd app diff to see what differs.
Q: Does Argo CD build my container images? A: No. Argo CD is not a CI system. It does not build, test, or push images. Your CI pipeline builds and pushes the image and updates the image tag in the Git manifests (or Argo CD Image Updater does that write-back); Argo CD then reconciles the new desired state. Keeping this boundary clear is essential.
The states every junior candidate must recite cleanly:
| Category | State | Meaning |
|---|---|---|
| Sync | Synced |
Live state matches the desired state from Git |
| Sync | OutOfSync |
Live state differs from Git (drift or a pending change) |
| Sync | Unknown |
Argo CD could not determine sync status (e.g. comparison error) |
| Health | Healthy |
Resources are running and passing their health checks |
| Health | Progressing |
Resources are still rolling out (e.g. a Deployment mid-update) |
| Health | Degraded |
Resources failed their health check (crash-loop, failed rollout) |
| Health | Suspended |
Intentionally paused (e.g. a suspended CronJob or paused Rollout) |
| Health | Missing |
The resource is declared in Git but not present in the cluster |
| Health | Unknown |
Health could not be assessed |
This is the subject of the Sync Status & Health Assessment lesson; if any row above is fuzzy, that is your first revisit.
Argo CD interview prep — mid level
The mid-level round tests mechanisms — you know the concepts; can you explain how Argo CD actually implements them, and when to reach for which? Answers should name real fields and states.
Q: App-of-apps vs ApplicationSet — when do you use each?
A: App-of-apps is a bootstrap pattern: one parent Application whose source is a directory of child Application manifests. You commit each child by hand. It is perfect for a small, stable set of apps and for the initial bootstrap of a cluster. ApplicationSet is a controller that generates Applications from generators (List, Cluster, Git directories/files, Matrix, Merge, SCM Provider, Pull Request). You use it when the Applications are boilerplate that varies by a parameter — one per cluster, one per team directory, one per PR. Rule of thumb: app-of-apps to bootstrap, ApplicationSet to eliminate copy-paste at scale.
| App-of-apps | ApplicationSet | |
|---|---|---|
| What it is | A parent Application pointing at child Application manifests | A controller that templates Applications from generators |
| Children are | Hand-written and committed | Generated from parameters |
| Best for | Bootstrap; a small, stable app set | Fan-out: per-cluster, per-team, per-PR |
| Adding a cluster | Hand-write N new child apps | Register the cluster; apps appear (Cluster/Matrix generator) |
| Ephemeral previews | Awkward | Native (Pull Request generator) |
| Covered in | App-of-Apps Pattern | ApplicationSets & Generators |
Q: Sync waves vs resource hooks — what’s the difference?
A: Sync waves order resources within a single Application’s sync. You annotate resources with argocd.argoproj.io/sync-wave: "N" (integer, default 0, lower runs first); Argo CD applies each wave and waits for it to be Healthy before the next — this is how you put CRDs before the operator, or a database before the app. Hooks run arbitrary Jobs at defined phases of the sync: PreSync, Sync, PostSync, SyncFail, using argocd.argoproj.io/hook. A schema migration is a classic PreSync hook; a smoke test is a PostSync hook. Waves sequence; hooks inject steps. They compose — hooks also honour wave numbers.
| Sync waves | Resource hooks | |
|---|---|---|
| Purpose | Order resources within one sync | Run a Job at a sync phase |
| Annotation | argocd.argoproj.io/sync-wave: "N" |
argocd.argoproj.io/hook: PreSync|Sync|PostSync|SyncFail |
| Default | Wave 0 | — |
| Classic use | CRDs → operator → app; DB before app | DB migration (PreSync); smoke test (PostSync) |
| Cleanup | n/a | hook-delete-policy: HookSucceeded|HookFailed|BeforeHookCreation |
| Scope limit | Within one Application only — does not order across Applications | Within one Application’s sync |
Q: What is ignoreDifferences and why is it essential with self-heal?
A: ignoreDifferences tells Argo CD to stop diffing specific fields, so a legitimate external controller can own them without Argo CD fighting it. The canonical case: an HPA owns spec.replicas, so you ignore that path — otherwise Argo CD reverts the replica count, the HPA re-scales, and they flap forever. You scope it by group/kind plus jsonPointers, jqPathExpressions, or managedFieldsManagers. The rule: tune ignoreDifferences before enabling selfHeal, or self-heal will war with your controllers. This is the core of the [Diffing, Drift & ignoreDifferences] lesson.
Q: Walk through AppProject and RBAC — how does multi-tenancy work?
A: An AppProject is the tenancy boundary. It restricts which source repos, which destination clusters/namespaces, and which resource kinds its Applications may use (sourceRepos, destinations, clusterResourceWhitelist/Blacklist, namespaceResource…). The single strongest guardrail is an empty clusterResourceWhitelist plus a namespace-scoped destinations glob — a compromised app repo then cannot create a ClusterRole or escape its namespace. On top, RBAC (argocd-rbac-cm) maps SSO groups to actions (p, <group>, applications, sync, <proj>/*, allow) with built-in role:admin and role:readonly. App teams get project-scoped sync/get; they do not get create/delete on Applications when those come from platform-owned ApplicationSets.
Q: Explain automated, selfHeal, and prune.
A: Under spec.syncPolicy.automated: with nothing set, Argo CD detects drift but waits for a manual sync. selfHeal: true makes it automatically re-apply Git when the live state drifts. prune: true makes it delete resources that were removed from Git (without prune you accumulate orphans and Git stops being the whole truth). allowEmpty: true permits syncing down to zero resources. This is the [Sync Policies] lesson.
| Sync option / policy | What it does |
|---|---|
automated.selfHeal: true |
Revert live drift back to Git automatically |
automated.prune: true |
Delete resources removed from Git |
automated.allowEmpty: true |
Allow a sync that results in zero resources |
syncOptions: CreateNamespace=true |
Create the destination namespace if absent |
syncOptions: PruneLast=true |
Prune only after all other resources apply successfully |
syncOptions: ServerSideApply=true |
Use server-side apply (cleaner field ownership on big CRDs) |
syncOptions: ApplyOutOfSyncOnly=true |
Only apply resources that are actually OutOfSync (faster) |
syncOptions: RespectIgnoreDifferences=true |
Do not apply fields covered by ignoreDifferences |
retry.limit / backoff |
Retry a failed sync with exponential backoff |
Q: A teammate ran kubectl edit on a prod Deployment and it reverted seconds later. Why?
A: selfHeal is on. Continuous reconciliation observed the live state diverge from Git and re-applied the declared state. The correct way to make that change permanent is a commit to Git, not a live edit — which is exactly the GitOps discipline the reversion is enforcing.
Argo CD interview prep — senior and staff level
The senior/staff round is about operating Argo CD at scale and under failure — sharding, HA/DR, secrets, security, progressive delivery, and the sharp edges of the Helm model. Answers should show you have run this in anger, name trade-offs, and reach for guardrails.
Q: How do you run Argo CD across many clusters — and how does it scale?
A: The standard topology is hub-spoke: one (HA) Argo CD control plane manages many workload clusters registered as cluster Secrets. The control plane is not in the data path, so workloads keep serving even if the hub is down. It scales along three axes: the application-controller shards by cluster (--replicas + a sharding algorithm — legacy hash, round-robin, or consistent-hashing) so each shard owns a subset of clusters; the repo-server scales horizontally (it does the CPU-heavy git clone + manifest render) and caches in Redis; and you spread reconciliation with webhooks instead of pure polling. This is the [Hub-Spoke Multi-Cloud Fleet] and [Scaling & Sharding] material.
| Scaling axis | Component | How you scale it |
|---|---|---|
| Number of clusters | application-controller | Shard by cluster: --replicas + sharding algorithm (consistent-hashing) |
| Manifest render load | repo-server | Add replicas; it clones + renders; cache in Redis |
| API/UI load | argocd-server | Add replicas (stateless behind the service) |
| Reconcile timing | (all) | Webhooks to trigger on push; tune timeout.reconciliation |
| Cache | Redis | Redis-HA (Sentinel); it is a cache, never the source of truth |
Q: What’s your HA and DR posture for Argo CD?
A: HA: Redis-HA (Sentinel), multiple repo-server and argocd-server replicas, and a sharded controller. DR is rebuild, not restore, because Argo CD is mostly stateless — its desired state is your Git repos. You back up only the small state Git does not hold: the cluster Secrets and repo credentials, plus config via argocd admin export (settings, RBAC, projects). Redis is disposable — never back it up. On disaster you Terraform a fresh cluster, install Argo CD, restore those Secrets, apply the one root app-of-apps, and let it re-adopt the still-running workloads — verifying with argocd app diff showing no change before enabling auto-sync. This is the [HA & Disaster Recovery] lesson.
Q: How do you handle secrets in GitOps — you can’t commit plaintext? A: Never put a plaintext secret in Git. The mainstream options, each keeping Git safe:
| Approach | How it works | Trade-off |
|---|---|---|
| Sealed Secrets | Commit an encrypted SealedSecret; an in-cluster controller decrypts it to a Secret |
Simple; per-cluster key; encrypted blob lives in Git |
| External Secrets Operator (ESO) | Commit an ExternalSecret reference; ESO pulls the value from a cloud store at runtime |
No secret material in Git at all; needs cloud identity |
| SOPS (+ ksops/helm-secrets via a CMP) | Encrypt files with SOPS; a config-management plugin decrypts at render | Flexible, file-level; key management overhead |
| argocd-vault-plugin | Placeholders in manifests, substituted from Vault/cloud at render | Clean templating; adds a plugin to the render path |
| CSI Secrets Store driver | Mount secrets from the cloud store into Pods, bypassing Secret objects |
Secrets never become etcd Secrets; per-Pod mounting |
Because the identity to reach a cloud store is cloud-specific, this is where the multi-cloud edge appears. The per-cloud mapping every senior candidate should know cold:
| Concern | Azure (AKS) | AWS (EKS) | Google (GKE) |
|---|---|---|---|
| Secret store | Azure Key Vault | AWS Secrets Manager / Parameter Store | Google Secret Manager |
| Workload identity | Microsoft Entra Workload ID | IRSA or EKS Pod Identity | GKE Workload Identity |
| Common ESO backend | Key Vault provider | Secrets Manager provider | Secret Manager provider |
| Registry (for image pulls) | ACR | ECR | Artifact Registry |
Q: Progressive delivery — how do canary and automated rollback work with Argo CD?
A: Argo CD syncs the manifests; the progressive rollout is done by Argo Rollouts, a separate controller. You replace a Deployment with a Rollout CRD that has a canary or blueGreen strategy — setWeight/pause steps for canary, or an active/preview service pair for blue-green. An AnalysisTemplate runs during the rollout, querying metrics (Prometheus, Datadog, CloudWatch, etc.); if the AnalysisRun fails its success condition, the Rollout aborts and rolls back automatically. Traffic shaping is via trafficRouting (Istio, NGINX, ALB, SMI, Gateway API plugin). GitOps stays intact: Git holds the Rollout + AnalysisTemplate; Argo CD reconciles them; Rollouts does the gradual shift. This is the [Rollouts Analysis & Auto-Rollback] lesson.
| Strategy | Mechanism | Rollback trigger |
|---|---|---|
| Canary | setWeight + pause steps shift traffic gradually |
Failed AnalysisRun → abort → revert to stable |
| Blue-green | Preview service validated, then promote to active | Failed analysis / manual reject before promotion |
| Analysis | AnalysisTemplate queries metrics during rollout |
Success condition breached → automatic abort |
Q: How do you harden an Argo CD control plane? A: Least privilege everywhere. Concretely:
| Hardening control | What it prevents |
|---|---|
Per-team AppProject, empty clusterResourceWhitelist |
An app repo creating cluster-scoped resources / escaping its namespace |
RBAC mapped to SSO groups; no shared admin |
Untraceable, over-broad access |
Disable/secure the local admin user after bootstrap |
A static credential as a standing target |
| NetworkPolicy around argocd namespace | Lateral movement to/from the control plane |
| SSO via OIDC (Entra/Cognito/Google) + short-lived tokens | Long-lived static credentials |
argocd admin export treated as a secret (it contains cluster creds) |
Leaking spoke credentials via a backup file |
Signed commits / signatureKeys on projects |
Applying unverified desired state |
This is the [Security Hardening] lesson.
Q: Argo CD “renders, not installs” Helm — what does that mean and what breaks?
A: Argo CD does not run helm install. The repo-server runs helm template (after helm dependency build) to render the chart to plain manifests, and Argo CD applies and owns those manifests via its own reconcile loop. Consequences a senior must know: there is no Helm release stored in the cluster (helm ls shows nothing), so helm rollback is not your rollback — git revert is. Helm’s own lifecycle hooks are handled by Argo CD’s hook mechanism, not Tiller. And the Helm lookup function returns empty during render because the repo-server templates without live cluster access — a classic gotcha when a chart tries to read an existing Secret at template time. This is the [Helm Integration] lesson.
| Helm expectation | Under Argo CD |
|---|---|
helm install / release object |
No — helm template → apply; no release in cluster |
helm ls shows the release |
No — nothing to list |
helm rollback |
No — roll back with git revert |
lookup reads live cluster |
Returns empty — render has no cluster access |
| Values | From the Application’s spec.source.helm block / value files |
Design and scenario questions — the whiteboard round
Design questions are open-ended on purpose. The interviewer is watching how you structure the answer, not waiting for one magic diagram. Use the same four-beat structure every time: (1) clarify assumptions and constraints, (2) name the pattern, (3) walk the happy path, (4) name the failure modes and guardrails. Nervous candidates skip straight to boxes; strong candidates spend the first minute on assumptions.
| Prompt | How to structure the answer |
|---|---|
| Design GitOps for 50 teams across 3 clouds | Assumptions (fleet size, isolation needs) → hub-spoke + one Matrix ApplicationSet (apps × clusters) + per-team AppProject → happy path: label a cluster, apps appear → failure modes: thundering herd on a new cluster label, so gate with Progressive Syncs + repo-server parallelism limits |
| Promote a release dev → staging → prod | Assumptions (regulated? auto or gated?) → pattern: per-env overlay/values, targetRevision pinned to tags in prod → happy path: bump the image tag in the prod overlay via PR → guardrails: rendered-manifests for byte-exact review, sync windows, required approvals |
A prune deleted a prod resource — recover |
Assumptions (what was deleted, still in Git?) → immediate: git revert the deletion, re-sync (Git is the truth) → if it was never in Git: restore from backup, then add it to Git → prevent: PruneLast=true, prune off on critical projects, sync windows, --dry-run review |
| Secrets in GitOps at scale | Assumptions (existing cloud store? rotation policy?) → pattern: ESO + cloud store + workload identity (Key Vault/Secrets Manager/Secret Manager) → happy path: commit an ExternalSecret reference; ESO materialises it → guardrails: no plaintext in Git, per-namespace scoping, rotation handled in the store |
| Reconcile latency is climbing as the fleet grows | Assumptions (how many apps/clusters, polling or webhook?) → diagnose: repo-server CPU, controller shard balance, Git rate limits → fixes: shard the controller (consistent-hashing), add repo-server replicas, webhooks over polling, raise timeout.reconciliation, mono-repo caching |
| One cluster, one app, small team — is Argo CD overkill? | Assumptions (team maturity, growth) → honest answer: a single Application + auto-sync is fine and low-overhead; you do not need ApplicationSets/hub-spoke yet → guardrail: still pin targetRevision, still use a project — cheap habits that pay later |
Two of these deserve extra words because they separate senior from mid.
“A prune deleted prod — what now?” The panic answer is “restore from a backup”. The GitOps answer is calmer: if the resource is still declared in Git, the deletion was drift and the fix is to re-sync (or git revert the commit that removed it) — Argo CD re-creates it, because Git is the source of truth. Only if the resource was never in Git (someone created it live) is a backup restore needed — and then the real fix is to bring it under Git so it can never silently vanish again. The senior tell is separating “in Git” from “not in Git” before touching anything, and reaching for PruneLast=true and disabling prune on your most critical AppProject as the preventive control. Reference the Capstone: Multi-Cloud GitOps Platform for how this fits a real fleet.
“Design for 50 teams across 3 clouds” is really a blast-radius question wearing a scale costume. The scale part is easy — a Matrix ApplicationSet (git apps × cluster generator) fans everything out, and hub-spoke lets one control plane reach AKS, EKS, and GKE. The part that earns the offer is naming the failure mode: registering several new cluster Secrets at once makes the ApplicationSet render hundreds of Applications on one reconcile tick, hammering your Git host into rate limits and blowing out sync latency for the existing fleet. The guardrail is Progressive Syncs (roll new clusters in gated steps) plus a repo-server parallelism cap. Say that unprompted and you have demonstrated you have operated this, not just drawn it.
Troubleshooting drills
Given a symptom, the senior response is a fixed diagnostic order, not a guess. For Argo CD the order is almost always: argocd app diff (what differs?) → app events / status.conditions (what did Argo say?) → controller and repo-server logs (why?) → the CRD field responsible. Drill this table until the “diagnose” column is reflexive; it is drawn from the whole course.
| Symptom | Diagnostic approach | Likely answer / fix |
|---|---|---|
| App stuck OutOfSync forever, even right after a sync | argocd app diff; check for a controller mutating a field |
A controller (HPA, webhook, CA) owns a field — add it to ignoreDifferences; the diff never closes otherwise |
| Sync hangs on Progressing and never completes | Inspect the resource’s health; check hook/wave that gates the next wave | A wave resource never goes Healthy (bad probe, image pull) — Argo waits forever; fix the resource or the health check |
SyncFailed: rpc error: code = Unauthenticated to a spoke |
argocd cluster list; check the cluster Secret / token expiry |
Expired/rotated spoke credential — refresh the cluster Secret (or its IAM/exec provider config) |
ComparisonError / failed to load target state |
repo-server logs; validate the manifests render | Bad chart/kustomize path, missing values, or a Helm lookup returning empty at render — fix the source |
A prune deleted a prod resource |
Is it still declared in Git? Check the commit that removed it | Still in Git → re-sync/git revert (drift). Not in Git → restore from backup, then add to Git; set PruneLast=true |
| Multi-cluster app shows Unknown / Failed on one cluster only | argocd cluster list; connectivity + auth to that cluster |
Network path or credential to that spoke is broken — check the cluster Secret, private endpoint, or IAM |
| A canary won’t roll back on a bad release | kubectl argo rollouts get rollout; check the AnalysisRun |
Analysis query wrong/missing, or no AnalysisTemplate wired — fix the metric query so failure aborts the rollout |
| Secret rotation broke the app after the store rotated | Check ESO ExternalSecret status / refresh interval |
Stale Secret — trigger ESO refresh; ensure the workload identity still has store access post-rotation |
| Reconcile latency climbing across the fleet | Controller shard balance; repo-server CPU; Git rate-limit errors | Shard the controller (consistent-hashing), add repo-server replicas, switch polling → webhooks |
error: failed to get repo on a private repository |
Check the repo credential Secret / connection | Missing or wrong repo credentials — add the repo with a valid token/SSH key; verify argocd repo list |
Two drills are worth internalising as prose, because interviewers push on them.
Perpetual OutOfSync is the most common real-world Argo CD symptom and a favourite interview trap. The instinct is to sync harder; the fix is the opposite — stop diffing the field a legitimate controller owns. Someone enables selfHeal, an HPA scales replicas, Argo reverts them, the HPA re-scales, and the app flaps OutOfSync/Synced forever while the controller burns CPU. The answer is ignoreDifferences on /spec/replicas, then self-heal. The generalisation the interviewer wants: whenever a controller other than Argo CD legitimately mutates a field, that field must be in ignoreDifferences — HPAs, admission webhooks injecting sidecars, cert-managers injecting CA bundles. Deep-dive in Troubleshooting: OutOfSync, Degraded & Unknown.
A stuck sync on Progressing trips people because nothing has failed — Argo CD is politely waiting. Sync waves make Argo apply a wave and wait for it to be Healthy before the next; if a resource in an early wave never becomes Healthy (a bad readiness probe, an image it cannot pull, a PVC that never binds), the sync sits on Progressing indefinitely and later waves never start. The diagnosis is to find the first not-Healthy resource in wave order and fix that — not to retry the whole sync. The tell of a strong candidate is checking wave order and per-resource health rather than staring at the app-level status.
Behavioural and experience questions
For a platform/DevOps role, the behavioural round probes judgement and ownership, not syntax. Use STAR — Situation, Task, Action, Result — and make the Result quantified and the Action specifically yours. Have two or three real stories ready; a GitOps rollout and an incident are the highest-value ones.
| Question | What it is really testing | STAR angle to prepare |
|---|---|---|
| “Tell me about a deploy that went wrong.” | Do you own failure and learn from it? | A concrete incident → your diagnosis → the fix → the guardrail you added so it can’t recur (this last part is the point) |
| “How did you roll out GitOps to a skeptical team?” | Change management, not just tech | Start read-only/observe, migrate one non-critical app, show the drift-detection win, then expand — measured adoption |
| “Describe a time you disagreed with a technical decision.” | Can you disagree and commit? | A trade-off (e.g. monorepo vs polyrepo), how you argued it with data, and how you supported the final call |
| “A change you made caused an incident — walk me through it.” | Blameless ownership | What you shipped → blast radius → rollback (git revert) → the postmortem action items you drove |
| “How do you keep a growing platform maintainable?” | Systems thinking at scale | Eliminating boilerplate (ApplicationSets), guardrails (AppProject/RBAC), and paved roads for teams |
| “Tell me about mentoring or leveling up a team.” | Force multiplication (senior signal) | Docs, a paved-road template repo, office hours — how you made others self-sufficient |
The strongest deploy-gone-wrong stories share a shape: a specific failure, a calm diagnosis with the right tools, a fast rollback (in GitOps, git revert is a genuinely great answer — it is auditable and instant), and — the part most candidates forget — a systemic guardrail added afterward (a sync window, a required approval, PruneLast=true, an ignoreDifferences entry, a canary with analysis). Interviewers are not scared of engineers who have caused incidents; every senior person has. They are scared of engineers who caused one and changed nothing.
Study plan and resources
If you are prepping the CGOA specifically, here is a realistic two-to-three-week plan that uses this course as the backbone. Schedule the exam first — a booked date manufactures the discipline.
| Phase | Focus | This course + external |
|---|---|---|
| Week 1 — Principles & Terminology (50% of the exam) | The 4 principles by name + counter-example; the vocabulary (drift, desired state, reconciliation, rollback) | First Principles lesson; OpenGitOps docs (read them twice); the principle table above |
| Week 2 — Patterns, Related Practices, Tooling | Deployment/progressive patterns; in-cluster vs external reconciler; CI/CD/IaC boundaries; Argo CD vs Flux | App-of-Apps, ApplicationSets, Hub-Spoke, Rollouts, Helm/Kustomize lessons; Argo CD vs Flux |
| Week 3 — Drill & mock | Timed practice; find weak domains; hands-on to cement concepts | The practice bank + the mock lab below; a kind cluster with Argo CD installed |
| Final 48h | Re-read the 4 principles; skim your weakest domain; the cheat-sheet | The cheat-sheet; do not cram new material |
Even though CGOA is not hands-on, build the thing anyway — nothing cements “continuous reconciliation” like watching selfHeal revert a kubectl edit on your own laptop. A free local loop:
| Resource | Use it for |
|---|---|
| kind / minikube + Argo CD install | A free local cluster to watch reconciliation, drift, and self-heal happen |
| OpenGitOps docs (opengitops.dev) | The canonical principles — the exam’s source of truth |
| Argo CD docs (argo-cd.readthedocs.io) | The reference-tool mechanics behind every concept |
| Flux docs | The other reference reconciler — CGOA is vendor-neutral, so know both exist |
| CNCF / Linux Foundation CGOA curriculum | The official domain list and weights — study to it, not around it |
| This course | The forty lessons that map onto every domain (see the map table above) |
Hands-on lab: a timed self-assessment and mock
This is your dress rehearsal. Do it in three parts, honestly and timed. No cluster required — this is a knowledge assessment, exactly like the real CGOA.
Part 1 — a 15-question timed mini-mock (set a 20-minute timer)
Answer all fifteen before checking the key. Mimic exam conditions: no notes, one pass.
- The four GitOps principles are Declarative, Versioned & Immutable, Pulled Automatically, and ______?
- True/False: In GitOps, when live state drifts from desired state, the system updates Git to match the cluster.
- A CI job applies manifests to the cluster with
kubectl apply. Push or pull? - Argo CD sync status can be Synced, OutOfSync, or ______?
- Which is orthogonal to sync status: (a) repo URL (b) health status © project name?
- The GitOps term for “actual state ≠ desired state” is ______.
- Rollback in GitOps is best achieved by: (a)
kubectl rollout undo(b) reverting the commit © deleting the app. - In-cluster reconciler or external reconciler: a hub Argo CD managing remote spokes?
- True/False: The GitOps state store must be a Git repository specifically.
- Which tool is a reconciliation engine: (a) Helm (b) Kustomize © Flux?
- Sync waves order resources: (a) across all Applications (b) within one Application’s sync.
PreSync,Sync,PostSync,SyncFailare Argo CD ______.- Progressive delivery gated by metrics that auto-aborts on failure uses an Argo Rollouts ______.
- True/False: Argo CD builds and pushes your container images.
- Which principle does a one-time
kubectl applywith no ongoing correction violate?
Answer key (with why):
| # | Answer | Why |
|---|---|---|
| 1 | Continuously Reconciled | The fourth principle — the ongoing observe-and-apply loop |
| 2 | False | GitOps reverts the cluster to match Git, never the reverse — Git is the source of truth |
| 3 | Push | Applying from CI with cluster creds outside the cluster is push; it violates “pulled automatically” |
| 4 | Unknown | The three sync states are Synced, OutOfSync, Unknown |
| 5 | (b) health status | Sync (matches Git?) and health (working?) are orthogonal |
| 6 | State drift | The definitional term for divergence |
| 7 | (b) reverting the commit | Rollback is a version operation on the immutable store; the agent reconciles it |
| 8 | External reconciler | The reconciler is external to the clusters it manages (hub-spoke) |
| 9 | False | The store must be versioned + immutable; Git is common but not the only valid store |
| 10 | © Flux | Flux and Argo CD are reconcilers; Helm/Kustomize are packaging tools |
| 11 | (b) within one Application’s sync | Waves do not order across Applications |
| 12 | Hooks (resource hooks / phases) | The sync hook phases |
| 13 | AnalysisTemplate / AnalysisRun | Metric analysis drives the auto-abort |
| 14 | False | Argo CD is not CI; it does not build images |
| 15 | Continuously Reconciled | A one-shot apply with no drift correction breaks principle 4 |
Score yourself: 13–15 exam-ready on fundamentals · 10–12 close, drill weak domains · below 10, re-read the principles and terminology before continuing.
Part 2 — three design scenarios (10 minutes each, outline out loud)
Do not write essays — practise the four-beat structure (assumptions → pattern → happy path → failure modes). Model outlines follow.
Scenario A: “Onboard a new EKS cluster into an existing 12-cluster Argo CD fleet with zero hand-written Application manifests.”
Model outline: Assumptions — clusters already labeled; a Matrix ApplicationSet exists. Pattern — register the cluster as a cluster Secret with the right labels; the Cluster/Matrix generator renders its apps automatically. Happy path — label → apps appear → Synced/Healthy. Failure modes — thundering herd (hundreds of apps on one tick → Git rate limits): gate with Progressive Syncs; verify spoke auth (IRSA/Pod Identity) before expecting Healthy.
Scenario B: “Design dev → staging → prod promotion for a regulated fintech.”
Model outline: Assumptions — audit required; prod changes gated. Pattern — per-env overlays; targetRevision pinned to tags in prod (never a moving branch); rendered-manifests so the reviewed diff is byte-exact. Happy path — PR bumps the prod image tag → approval → Argo syncs. Failure modes/guardrails — sync windows for change freezes, required approvals via AppProject RBAC, and rollback = git revert.
Scenario C: “Secrets for 30 teams across AKS, EKS, and GKE.”
Model outline: Assumptions — each cloud has a native secret store; rotation required. Pattern — ESO per cluster, backed by Key Vault / Secrets Manager / Secret Manager, authenticated by Entra Workload ID / IRSA / GKE Workload Identity. Happy path — teams commit an ExternalSecret reference; ESO materialises the Secret. Failure modes — no plaintext in Git ever; scope ExternalSecrets per namespace; handle rotation in the store with a sane refresh interval.
Part 3 — grade yourself and fill the gaps
Map your weakest area to the exact lesson to revisit. Be ruthless; the point is to find gaps before the exam or interview does.
| If you struggled with… | Revisit this lesson |
|---|---|
| The four principles / push vs pull | GitOps From First Principles |
| Synced vs Healthy, the states | Sync Status & Health Assessment |
| App-of-apps vs ApplicationSet, generators | App-of-Apps Pattern; ApplicationSets & Generators |
| Sync waves vs hooks | Sync Waves & Resource Hooks |
| Perpetual OutOfSync / ignoreDifferences | Diffing, Drift & ignoreDifferences; Troubleshooting OutOfSync |
| RBAC / AppProject multi-tenancy | AppProjects & Multi-Tenancy; RBAC & Policies |
| Multi-cluster / sharding / scale | Hub-Spoke Multi-Cloud Fleet; Scaling & Sharding |
| HA / DR | HA & Disaster Recovery |
| Secrets strategy | Secrets: Sealed Secrets, ESO, SOPS, Vault |
| Progressive delivery / analysis | Argo Rollouts: Canary & Blue-Green; Rollouts Analysis & Auto-Rollback |
| The Helm render model | Helm Integration |
| Argo CD vs Flux (vendor-neutral) | Argo CD vs Flux |
Cheat-sheet
The night-before, one-screen reference.
The 4 GitOps principles (memorise in order):
| # | Principle | One-word cue |
|---|---|---|
| 1 | Declarative | what, not how |
| 2 | Versioned and Immutable | full history |
| 3 | Pulled Automatically | agent fetches |
| 4 | Continuously Reconciled | forever loop |
CGOA domains → weight → your revision anchor:
| Domain | Weight | Anchor |
|---|---|---|
| Principles | 30% | The 4 principles + counter-examples |
| Terminology | 20% | drift, desired state, reconciliation, rollback, state store, feedback loop |
| Patterns | 20% | deploy/release, progressive delivery, pull vs event-driven, in-cluster vs external |
| Related Practices | 16% | CaC, IaC, DevOps/DevSecOps, CI/CD boundary |
| Tooling | 14% | manifests/packaging, state stores, reconcilers (Argo CD/Flux), interop |
Rapid-fire fact sheet:
| Fact | Value |
|---|---|
| CGOA format | 90 min, online-proctored, multiple-choice, not hands-on |
| Cost / retakes / validity | USD 250 · one free retake · valid 2 years |
| Question count / passing score | Not officially published (~60 Q / ~75% commonly reported) |
| Principles source | OpenGitOps v1.0.0 (CNCF Sandbox) |
| Reference reconcilers | Argo CD and Flux |
| Sync states | Synced · OutOfSync · Unknown |
| Health states | Healthy · Progressing · Degraded · Suspended · Missing · Unknown |
| Rollback in GitOps | git revert → reconcile (not helm rollback) |
| Argo CD is | Pull-based; not CI; does not build images |
| Sync wave scope | Within one Application only |
| Self-heal + HPA | Needs ignoreDifferences on /spec/replicas or it flaps |
| Helm under Argo CD | helm template, not helm install; helm ls empty; lookup returns empty |
| Prune recovery | In Git → re-sync; not in Git → restore, then add to Git |
| DR posture | Rebuild + re-adopt (Git is the backup); Redis disposable |
Interview and exam questions
The dozen highest-frequency questions across both doors, with the tight, memorable version of each answer. If you can deliver these cold, you are ready.
Q: What is GitOps in one sentence? A: An operating model where desired state is declared and versioned in an immutable store, and agents continuously pull and reconcile it into the running system — Git is the source of truth, and reality is made to match it.
Q: Name the four GitOps principles. A: Declarative; Versioned and Immutable; Pulled Automatically; Continuously Reconciled.
Q: Push vs pull — which is Argo CD and why does it matter? A: Argo CD is pull: an in-cluster agent fetches and applies, so cluster credentials never leave the trust boundary and drift is corrected continuously. Push (CI applying from outside) violates “pulled automatically”.
Q: Sync status vs health status? A: Orthogonal. Sync = does live match Git (Synced/OutOfSync). Health = are the resources working (Healthy/Progressing/Degraded…). You can be Synced-but-Degraded or OutOfSync-but-Healthy.
Q: Is Git literally required as the state store? A: No — the principle requires a versioned, immutable store. Git is the standard choice; an OCI registry can also qualify.
Q: App-of-apps or ApplicationSet? A: App-of-apps to bootstrap a small, stable set of hand-written child apps; ApplicationSet to generate apps from parameters (per-cluster, per-team, per-PR) and kill boilerplate at scale.
Q: How do you roll back?
A: git revert the offending commit; the agent reconciles the previous desired state. Not helm rollback, not kubectl — the store is the source of truth.
Q: My app is stuck OutOfSync forever — why?
A: A controller (HPA, webhook, cert-manager) legitimately owns a field Argo keeps reverting. Add that field to ignoreDifferences; then self-heal stops flapping.
Q: Does Argo CD build images or run CI? A: No. CI builds/pushes the image and updates the tag in Git; Argo CD reconciles the new desired state. The CI/CD handoff is the manifest in Git.
Q: How does Argo CD scale to many clusters? A: Hub-spoke topology; shard the application-controller by cluster (consistent-hashing), scale the repo-server horizontally, and use webhooks over polling.
Q: What’s your DR plan if the Argo CD cluster dies?
A: Rebuild, don’t restore. Git holds desired state; back up cluster Secrets + argocd admin export; Redis is disposable. Stand up a fresh Argo CD, restore that small state, apply the root app-of-apps, and re-adopt — verifying argocd app diff is empty first.
Q: Tell me about a deploy that went wrong.
A: (STAR) A specific failure, a calm diagnosis with argocd app diff/events/logs, a fast git revert rollback, and — the point — the systemic guardrail you added so it can’t recur.
Key takeaways
- Two doors, one key. The vendor-neutral CGOA and the Argo CD interview loop test the same substrate — the four principles, the reconcile loop, sync vs health, fan-out, secrets, progressive delivery — from the abstract and the concrete side. Fluency between the two directions is the whole game.
- The four principles are 30% of the exam and the spine of every interview. Know them in order, by name, and — crucially — by counter-example. A described scenario asking which principle it violates is the exam’s default question shape.
- Know the format cold so nothing surprises you: 90-minute, online-proctored, multiple-choice, not hands-on; USD 250 with a free retake; valid two years. The Linux Foundation does not publish the question count or passing score — treat “~60 questions, ~75%” as folklore and aim well above it.
- Interviews reward structure over trivia. For design prompts, run the four beats: assumptions → pattern → happy path → failure modes and guardrails. Naming the failure mode (thundering herd, self-heal flapping, prune-without-PruneLast) is what separates senior from mid.
- Troubleshooting is a fixed diagnostic order, not a guess:
argocd app diff→ events/conditions → controller and repo-server logs → the responsible CRD field. Rehearse it until it is reflexive. - Rollback is
git revert; DR is rebuild-and-re-adopt; secrets never sit in Git in plaintext. These three are the senior-signal answers that come up again and again. - Build it anyway. CGOA is conceptual, but a free kind cluster running Argo CD turns “continuous reconciliation” from a definition into something you have watched happen — and that is what makes your answers sound like experience.
You started this course able to run kubectl apply. You are ending it able to explain — to a proctor and to a hiring panel — how a single control plane keeps hundreds of workloads across AKS, EKS, and GKE continuously reconciled to Git, how it fails, and how you would design, secure, scale, and recover it. That is not a tutorial’s worth of knowledge; that is a platform engineer’s. Book the exam, do the mock honestly, walk into the interview and structure your answers — and go run the multi-cloud platform you now know how to build. This is the send-off: from “what is GitOps” to production, you are ready.