FluxCD
Pure GitOps β no UI, CRD-driven, multi-tenancy
Category: CI/CD
Learning Path: What β Why β Learning Modules β Production Example β Interview Prep
Before you start: this page assumes you already know what GitOps is (Git as the single source of truth for cluster state, a controller pulling and reconciling changes rather than a pipeline pushing them) β see the ArgoCD overview if that's new, since it covers the concept from scratch. No prior FluxCD-specific experience is needed.
What is FluxCD?
Both ArgoCD and FluxCD implement GitOps β cluster pulls desired state from Git. Key difference: ArgoCD has a rich UI for visualising application state; FluxCD has no UI β everything is CRDs managed via CLI or kubectl. FluxCD is preferred by platform teams who want pure CLI-driven GitOps with no web UI to maintain. FluxCD has better multi-tenancy support natively.
Why FluxCD?
FluxCD is built around CRDs. GitRepository tells Flux where to watch. Kustomization tells Flux what path to apply from that repo. HelmRelease manages Helm charts. The key GitOps loop: Git changes β source-controller detects β kustomize-controller applies β cluster matches Git.
Learning Modules
Module 01 β FluxCD vs ArgoCD
Two GitOps tools β key differences
Both ArgoCD and FluxCD implement GitOps β cluster pulls desired state from Git. Key difference: ArgoCD has a rich UI for visualising application state; FluxCD has no UI β everything is CRDs managed via CLI or kubectl. FluxCD is preferred by platform teams who want pure CLI-driven GitOps with no web UI to maintain. FluxCD has better multi-tenancy support natively.
Topics covered:
Module 02 β Core FluxCD CRDs
GitRepository, Kustomization, HelmRelease
FluxCD is built around CRDs. GitRepository tells Flux where to watch. Kustomization tells Flux what path to apply from that repo. HelmRelease manages Helm charts. The key GitOps loop: Git changes β source-controller detects β kustomize-controller applies β cluster matches Git.
Topics covered:
Module 03 β FluxCD Multi-Tenancy
Team isolation, RBAC, path-based tenancy
FluxCD multi-tenancy: each team gets their own GitRepository pointing to their own repo (or their own path in a monorepo). Each team's Kustomization runs with a ServiceAccount scoped to their namespace. Team A cannot deploy to Team B's namespace. This is more native in FluxCD than ArgoCD.
Topics covered:
Production Example
Interview Prep
PSR Formula: Answer every question: Problem β Solution β Result. 45-90 seconds max.
Common Interview Questions
Q1. What is FluxCD and why would you use it in production?
A: Problem: manually running kubectl apply against a cluster means the cluster's actual state and Git's declared state drift apart the moment anyone makes a manual change β there's no single source of truth. Solution: FluxCD is a pull-based GitOps tool β controllers running inside the cluster continuously reconcile cluster state to match what's declared in Git, with zero UI, everything expressed as CRDs (GitRepository, Kustomization, HelmRelease) managed via CLI or kubectl. Result: Git becomes the actual source of truth, not just documentation of intent β any manual kubectl drift gets auto-corrected back to what Git says on the next reconciliation, and every change has a Git history/PR trail.
Q2. How does FluxCD work internally? Explain the architecture.
A: Problem: without knowing which controller does what, "my change isn't showing up in the cluster" is guesswork. Solution: source-controller watches Git repos, Helm repos, and OCI registries for changes; kustomize-controller applies Kustomization CRDs (which reference a path in that source); helm-controller manages HelmRelease CRDs; the loop is Git changes β source-controller detects β kustomize-controller/helm-controller applies β cluster matches Git. Result: "my change isn't applying" splits into two different problems depending on which controller is stuck β flux get sources git shows whether the source was even detected, flux get kustomizations shows whether the apply step is the one failing.
Q3. What are the main components of FluxCD?
A: Problem: FluxCD's CRD-driven design means there's no single dashboard listing "the components" the way a UI-based tool would show β knowing them requires knowing the controllers. Solution: source-controller (watches sources), kustomize-controller (applies Kustomizations), helm-controller (manages HelmReleases), notification-controller (sends Slack/Teams/webhook alerts on reconciliation events), and image-automation-controller (auto-updates image tags in Git when a new image is pushed) are the five core controllers, each running as its own pod in the flux-system namespace. Result: flux check and kubectl get pods -n flux-system are the two commands that confirm all five are actually running β a missing pod there is a direct explanation for a specific class of stuck reconciliation.
Q4. How do you handle failures in FluxCD?
A: Problem: a Kustomization that isn't reconciling could be stuck for a source problem, an apply problem, or a health-check problem, and each needs a different command. Solution: flux get all gives a fast overall status across every Flux resource; flux logs --all-namespaces surfaces the actual controller error; flux reconcile source git forces a re-fetch if the source looks stale; flux trace kustomization traces a specific resource's lineage back through which Kustomization/GitRepository produced it, useful when the same resource is unexpectedly touched by two different tenants. Result: most stuck-reconciliation incidents resolve to a source-fetch failure (bad credentials, unreachable Git host) or a healthChecks:-blocked apply (the Kustomization won't report healthy until the named Deployment is actually healthy) β flux get all distinguishes the two immediately.
Q5. What is your production experience with FluxCD?
A: This is a genuinely personal question β answer with a real incident using the Problem β Solution β Result structure: what broke (a stale GitRepository due to expired credentials, a Kustomization stuck on a failing healthChecks: target, a multi-tenant RBAC misconfiguration), your actual diagnostic sequence, and what the root cause turned out to be. Interviewers are listening for whether you have real operational experience, not textbook recall.
Q6. How do you monitor and observe FluxCD in production?
A: Problem: a Kustomization silently failing to reconcile can leave a cluster running stale, drifted config for a long time before anyone notices. Solution: notification-controller pushes reconciliation events (success and failure) to Slack/Teams/webhooks, so a failed sync surfaces immediately rather than waiting for someone to run flux get all; healthChecks: on a Kustomization ties reconciliation success to an actual Deployment being healthy, not just "the YAML applied without error"; flux get all and flux logs remain the manual fallback for deeper investigation. Result: the notification-controller alert is what catches drift proactively β the CLI commands are for diagnosing an alert that already fired, not the primary detection mechanism.
Q7. What are the security considerations for FluxCD?
A: Problem: Flux has cluster-wide apply permissions by default, and in a multi-tenant cluster an over-broad ServiceAccount means one team's Kustomization could apply resources into another team's namespace. Solution: scope each tenant's Kustomization with serviceAccountName: pointing at a ServiceAccount whose RBAC is limited to that team's namespace (not cluster-admin, despite that being the quickest way to unblock a new tenant), keep each team's GitRepository pointed at their own repo or repo path, and use secretRef: for private-repo credentials rather than embedding tokens in the CRD. Result: this is what makes "Team A cannot deploy to Team B's namespace" actually true rather than aspirational β the isolation is enforced by RBAC on the reconciling ServiceAccount, not by convention.
Q8. How does FluxCD compare to alternatives?
A: Problem: FluxCD and ArgoCD solve the same GitOps problem, and picking between them is a real, recurring decision. Solution: both are pull-based GitOps with drift detection, pruning, health checks, and Helm support β the real difference is UI and tenancy model: ArgoCD has a rich web UI for visualizing app state and an App-of-Apps pattern that's easy for non-platform engineers to use; FluxCD is pure CLI/CRD-driven with no UI to maintain, and has more native multi-tenancy (per-team GitRepository/ServiceAccount isolation) built in. Result: the choice tracks who's actually doing deployments β teams where non-platform engineers need visual rollback lean ArgoCD; platform teams standardizing on CLI-only workflows across many tenants lean FluxCD β not a capability gap either way.
Q9. Walk through the difference between GitRepository, Kustomization, and HelmRelease.
A: Problem: all three are Flux CRDs and it's easy to conflate "watching a source" with "applying it." Solution: GitRepository only watches β it tells Flux where to poll (a Git URL, branch, and interval) and does nothing else; Kustomization references a GitRepository as its sourceRef and applies a specific path from it, with options like prune: true (delete resources removed from Git) and healthChecks: (don't report success until a named Deployment is actually healthy); HelmRelease similarly references a Helm chart source and manages installing/upgrading that chart. Result: a GitRepository that's healthy but a Kustomization that isn't means the source is being fetched fine but the apply or health check is failing β these two CRDs failing independently is exactly why flux get sources git and flux get kustomizations are checked separately, not as one combined status.
Q10. How does FluxCD's multi-tenancy model actually enforce isolation between teams?
A: Problem: without a design for it, any team's Kustomization could apply resources anywhere in the cluster, defeating the point of "self-service GitOps" once more than one team shares a cluster. Solution: each tenant gets their own GitRepository (pointing at their own repo or repo path) and their own ServiceAccount, and their Kustomization sets serviceAccountName: to that scoped account with targetNamespace: limiting where it can apply β Flux then reconciles that tenant's resources using that tenant's RBAC, not Flux's own cluster-wide permissions. Result: this is more native to FluxCD's design than ArgoCD's β the isolation is a first-class field on the Kustomization spec itself, not a separate RBAC layer bolted on afterward.

