Infrastructure as Code and GitOps Questions
Defining and managing infrastructure and delivery state declaratively: provisioning as code (Terraform, CloudFormation, Pulumi, Ansible, Puppet), configuration management, idempotency, drift detection and remediation, and version control for infrastructure definitions, extended by GitOps where git is the source of truth for deployment and infrastructure state. Covers keeping environments consistent, treating config as a first-class versioned artifact, pull-based deployment and continuous reconciliation toward the committed state (ArgoCD, Flux, and similar controllers), Kubernetes manifest and configuration delivery via git, secrets handling for IaC and GitOps pipelines, policy-as-code guardrails (OPA, Sentinel), Terraform state management and locking, and auditable change through version control: branching strategy, pull request review, commit conventions, and code review policy for infrastructure code. Distinct from the CI/CD pipeline design topic, which owns generic pipeline structure and platform-scale release orchestration (build, test, artifact publishing, runner mechanics) and the architectural choice between push-based CI/CD and pull-based GitOps, even when the payload is infrastructure code. Distinct from the safe deployment and rollback strategies topic, which owns deployment-strategy mechanics: canary and blue-green traffic shifting, automated rollback triggered by metrics or SLOs, feature-flag progressive delivery, Kubernetes rollout mechanics (maxSurge, maxUnavailable, health-check gating), and database or schema migration safety as it gates a release, even when the delivery mechanism is GitOps. Distinct from the automation and scripting topic, which owns operational-scripting disciplines (retry and backoff logic, CLI tool design, generic file, checksum, or diff utilities) when the task is not specifically about declarative infrastructure or configuration state. This topic keeps the GitOps reconciliation loop itself, drift detection and remediation, and IaC state and module lifecycle management regardless of which adjacent discipline a question also touches.
Explain what 'declarative manifests' means and why storing manifests and environment overlays in version control is considered the 'source of truth' in GitOps. Describe benefits for auditing, rollbacks, CI/CD automation, and one practical limitation or challenge teams face when adopting this approach.
Sample Answer
Direct answer
A declarative manifest specifies the DESIRED END STATE of a resource (how many replicas, which image, what configuration) and leaves it to a controller to figure out HOW to get there, in contrast to an imperative script that specifies the exact SEQUENCE OF STEPS to take. Storing those manifests, plus their environment-specific overlays, in version control makes Git the SOURCE OF TRUTH because Git then holds a complete, ordered, attributable history of every intended state the system has ever been in, and a reconciler can always compare "what Git says should be running" against "what is actually running" to detect and correct any difference, a capability that does not exist if desired state lives only in someone's head or in an imperative script's implicit side effects.
Structured elaboration
Why "declarative" and "source of truth" are linked, not two separate features. A declarative manifest is a snapshot of intended state that can be diffed, reviewed, and reconciled against; an imperative script's "state" is only ever the CUMULATIVE EFFECT of running it, which is not directly comparable to anything without re-running it or inspecting the live system by hand. Git-as-source-of-truth specifically REQUIRES the declarative model: you cannot usefully version-control "the sequence of commands someone ran against production last Tuesday" the way you can version-control "here is the desired Deployment spec," because only the latter is a stable, comparable artifact.
Benefits for auditing. Every change to desired state is a Git commit: who made it, when, what exactly changed (a real diff, not a description of an action), and (with PR-based workflow) who reviewed and approved it. This turns "what changed and why" from a question requiring log archaeology into a question git log and git blame answer directly.
Benefits for rollbacks. Because past states are just earlier commits, rolling back is conceptually git revert (or checking out a prior commit) plus letting the reconciler apply it, not manually reconstructing what the PREVIOUS configuration must have been from memory, monitoring dashboards, or scattered notes.
Benefits for CI/CD automation. A declarative desired-state file is something automation can generate, validate, diff, and apply mechanically (a pipeline can run policy checks against a manifest, produce a human-readable plan of what will change, and gate merges on that), none of which is straightforward for an imperative script whose effects are not knowable without executing it.
One practical limitation. Not everything maps cleanly to "desired state" the way a Deployment's replica count does: operations that are inherently ACTIONS rather than states (rotate this specific secret NOW, run a one-time data migration, manually promote a canary after watching metrics for an hour) resist pure declarative modeling and typically need an imperative escape hatch (a Job, a manually-triggered pipeline step, an operator-specific custom action) layered alongside the declarative core, which means real GitOps systems are rarely 100% declarative in practice, just declarative for the steady-state configuration that dominates day-to-day change.
Trade-offs and pitfalls
- Common mistake: treating "declarative" as meaning "no procedural logic anywhere in the system." The MANIFESTS are declarative; the CONTROLLER reconciling them is free to use arbitrarily complex procedural logic internally (retries, ordering, backoff) to get from current state to desired state. The declarative/imperative distinction is about what gets COMMITTED and DIFFED, not about banning procedural code from existing anywhere in the system.
- A team new to GitOps often struggles most with the "one practical limitation" above, expecting every operational action to have a clean declarative expression and getting frustrated when some genuinely don't; naming this limitation explicitly upfront, rather than discovering it mid-adoption, is worth doing as part of onboarding.
- Git-as-source-of-truth only holds if NOTHING legitimately bypasses it. A team that occasionally "just runs a quick kubectl edit for this one urgent thing" quietly reintroduces exactly the untracked-state problem GitOps exists to solve; the discipline (and the reconciler's drift-correction behavior, which will eventually revert an out-of-band edit) is what makes the source-of-truth claim actually true in practice, not just in principle.
- Auditability benefits assume the Git history itself is trustworthy (protected branches, required reviews, no force-push rewriting history); a Git repo with no branch protection gives the AUDIT-TRAIL APPEARANCE of Git-as-source-of-truth without the actual guarantee, since history itself could be silently altered.
Compare Helm and Kustomize for managing Kubernetes manifests in a GitOps workflow. For each tool describe how parameterization and environment overlays are implemented, pros and cons (templating, repeatability, security), and provide a short recommendation for a multi-team organization.
Sample Answer
Direct answer
Helm packages Kubernetes manifests as a TEMPLATED chart (Go template syntax over YAML, plus a values.yaml providing parameters) with a release/versioning model and a package registry ecosystem; Kustomize takes plain, valid YAML manifests as a BASE and applies structural, patch-based OVERLAYS per environment with no templating language at all. For a multi-team organization, the practical recommendation is Kustomize for INTERNAL application manifests owned and reviewed by the teams that run them (overlays are easy to read as plain YAML diffs in a PR), and Helm specifically for THIRD-PARTY or widely-reused software (anything you install FROM someone else's chart, or genuinely reusable internal building blocks you want to parameterize and publish once for many independent consumers).
Structured elaboration
Parameterization and environment overlays, Helm. A chart defines {{ .Values.X }} template placeholders throughout its manifests; each environment supplies its own values-<env>.yaml overriding just the fields that differ. This is powerful (conditionals, loops, helper functions, subchart composition) but the templates themselves are not valid YAML until rendered, so reviewing a raw chart change means mentally executing the template logic, not just reading YAML.
Parameterization and environment overlays, Kustomize. A base/ directory holds plain, directly-appliable YAML; each environment's overlays/<env>/kustomization.yaml lists STRATEGIC MERGE PATCHES or JSON patches against that base (bump replica count, change an image tag, add an env-specific label). Every file at every layer is always valid, renderable YAML on its own, so a reviewer can read a base manifest and an overlay patch and understand the FULL resulting object without running anything.
Pros and cons.
| Helm | Kustomize | |
|---|---|---|
| Templating power | Full (conditionals, loops, functions, subcharts) | None by design (patches only) |
| Readability of a single file | Requires mentally rendering the template | Always plain, valid YAML |
| Repeatability | Strong: chart + values + pinned chart version is a reproducible unit | Strong: base + overlay is deterministic, but overlays can silently diverge if not carefully reviewed |
| Security surface | Template injection risk if values come from untrusted input; a large ecosystem of third-party charts of varying quality | Smaller surface (no template engine to exploit), but patch-based diffs can be harder to reason about in aggregate at a glance across many small patch files |
| Ecosystem | Large public chart registry (Bitnami, official vendor charts) | No equivalent package ecosystem; overlays are typically repo-local |
| Native kubectl support | Requires the helm CLI/library (Argo CD and Flux both have native Helm support, so this is not usually a GitOps-adoption blocker) | kubectl apply -k and native Kustomize support are built into kubectl itself |
Recommendation for a multi-team organization. Use Kustomize as the default for TEAM-OWNED application manifests: base manifests live in the service's own repo, environment overlays are small, auditable patch files that show up as clean diffs in pull requests, and a reviewer with zero Helm-template-rendering context can read exactly what changes between staging and production. Reserve Helm for two specific cases: consuming THIRD-PARTY software (installing Prometheus, cert-manager, ingress controllers from their published charts, since fighting the ecosystem's Helm-only distribution model is not worth it), and building genuinely reusable INTERNAL platform building blocks meant to be parameterized and consumed by many independent, less-GitOps-sophisticated teams, where Helm's stronger parameterization primitives (conditionals, defaults, schema validation via values.schema.json) earn their complexity. A common, workable hybrid: use helm template to render third-party charts into plain YAML, then apply Kustomize overlays ON TOP of the rendered output for environment-specific tweaks, getting Kustomize's review-friendliness for the parts a team actually edits while still consuming the Helm ecosystem for upstream software.
Trade-offs and pitfalls
- Common mistake: adopting Helm organization-wide "because it's the ecosystem standard" without weighing the code-review cost. A templated chart's diff in a pull request shows changes to TEMPLATE LOGIC or VALUES, not the resulting Kubernetes objects; a reviewer who does not mentally render the template can approve a change without fully understanding what will actually be applied, a real, recurring review-quality gap Kustomize's plain-YAML model avoids by construction.
- Common mistake: assuming Kustomize overlays scale cleanly to many environments without discipline. A patch-based model with no templating can accumulate subtle, hard-to-track divergence across a dozen environment overlays if there is no convention for what belongs in the base versus what belongs in each overlay; Kustomize's simplicity is a review-time advantage, not a substitute for a deliberate base/overlay design convention.
- Security: template injection is a REAL risk specific to Helm when chart values are ever sourced from something less trusted than the chart author (a CI variable an external contributor could influence, for instance), since Go template execution can, in pathological cases, be abused; Kustomize's patch-only model has no equivalent template-execution attack surface, a genuine, structural security argument in Kustomize's favor for team-owned manifests.
- The two tools are not mutually exclusive, and the strongest real-world setups typically use both, Helm for what the ecosystem forces (third-party software) and Kustomize for what teams actually author and review day to day; treating this as an either/or organizational mandate usually produces friction in whichever direction was NOT chosen.
Compare Argo CD and Flux as GitOps controllers. Focus on architecture (pull vs push, UI presence), reconciliation model, multi-cluster support, extensibility, and example use-cases where one might be preferred over the other.
Sample Answer
Direct answer
Argo CD is PULL-based with a first-class web UI: an in-cluster (or centrally-hosted) controller polls/watches Git and reconciles state, and its UI is a core, heavily-used part of the product for visualizing application health, sync status, and diffs. Flux is ALSO pull-based (both tools use the pull model that defines GitOps, an in-cluster agent reconciling toward Git, not a CI pipeline pushing kubectl apply), but Flux has historically been UI-LESS by design (a set of Kubernetes-native controllers and CRDs (custom resource definitions), composable with flux CLI and optionally a separate UI product, Weave GitOps, rather than a built-in dashboard); the real architectural distinction between them is less "push vs pull" (both pull) and more UI-centricity, extensibility model, and multi-cluster management approach.
Structured elaboration
Architecture and reconciliation model. Both tools run an in-cluster (or hub-cluster) controller that watches a Git source and reconciles the cluster's actual state toward it, the defining GitOps pull pattern. Argo CD's application-controller compares each Application CRD's live state against its Git-sourced desired state on a poll/watch interval and can auto-sync or wait for manual sync. Flux's toolkit is composed of several purpose-specific controllers (source-controller watching Git/Helm/OCI sources, kustomize-controller and helm-controller applying the resulting manifests, notification-controller for alerting) communicating via Kubernetes CRDs, a more Unix-philosophy, composable design versus Argo CD's more monolithic (though still modular internally) application model.
UI presence. Argo CD's UI is a primary, widely-relied-upon interface: application topology visualization, live sync-status and health, diff view before syncing, and manual sync/rollback actions performed directly through it. Flux is designed to be operated primarily via kubectl/flux CLI and GitOps itself (changes go through Git, not a UI); Weave GitOps (and other third-party dashboards) can be layered on for visualization, but it is an add-on, not baked into the core toolkit the way Argo CD's UI is.
Multi-cluster support. Argo CD's typical pattern is a SINGLE (or small number of) hub instance managing many registered target clusters via cluster credentials stored centrally, giving one place to see everything across the fleet. Flux's typical pattern is per-cluster (or per-cluster-group) installation, each cluster running its own Flux controllers watching its own (or a shared) Git source; multi-cluster fleets are usually composed via Flux's Kustomization dependency ordering and a shared source repo rather than a single central controller instance. This is a genuine architectural fork: Argo CD centralizes visibility and control, Flux distributes it, each with corresponding operational trade-offs (a central Argo CD instance is a single higher-value target and a potential bottleneck; distributed Flux installations avoid that single point but lose the single-pane-of-glass view without additional tooling).
Extensibility. Argo CD extends via Config Management Plugins (custom manifest generation tools beyond Helm/Kustomize/plain YAML) and Argo CD Notifications/Argo Rollouts as companion projects. Flux extends via its CRD-based controller composition (adding a new source type or a new applier is architecturally closer to adding a new controller to the toolkit) and integrates natively with Flagger for progressive delivery.
Worked example
When Argo CD tends to be preferred: an organization wants a SINGLE central dashboard across dozens of clusters for platform-team visibility, non-GitOps-fluent stakeholders (engineering managers, on-call responders) who need a UI to check deployment status without learning kubectl/flux commands, and out-of-the-box multi-cluster fleet management from one control point.
When Flux tends to be preferred: a Kubernetes-native, CLI/CRD-first team that wants each cluster fully self-sufficient (no dependency on a central controller instance being reachable, which matters for edge or air-gapped clusters), tight composability with other CNCF toolkit pieces (Flagger for progressive delivery, notification-controller for lightweight native alerting), and a philosophy of "the CRDs and Git ARE the interface" with no expectation of a built-in dashboard.
Trade-offs and pitfalls
- Common mistake: describing this comparison as "push vs pull." Both tools are pull-based; this is the single most common factual error in comparing them, and stating it correctly (both pull, differing mainly in UI-centricity, controller composition, and multi-cluster topology) is itself a signal of genuine familiarity with the tools rather than a surface-level comparison.
- A single central Argo CD hub instance is both its biggest UX advantage and its biggest operational risk: losing that instance (or its access to target-cluster credentials) affects visibility and control across the entire fleet at once, a concentration-of-risk trade-off distributed Flux installations avoid by design, at the cost of needing separate tooling for fleet-wide visibility.
- Common mistake: assuming Flux's lack of a built-in UI means it is less mature or less capable. The absence is a deliberate design choice (CLI/CRD/Git as the primary interface), not a capability gap; teams that prioritize a rich UI experience should weigh that as a genuine feature difference, not treat Flux as behind on a roadmap item it deliberately chose not to prioritize the same way.
- Neither tool's multi-cluster model is strictly superior; centralized (Argo CD-style) visibility trades against distributed (Flux-style) independence and blast-radius isolation, and the right choice depends on whether the organization values single-pane-of-glass control more than fleet-wide resilience to a single control-plane instance's availability.
Threat modeling exercise: enumerate the attack surface of a configuration repository and CI/CD pipeline that automates promotions to production. Identify controls you would implement to mitigate risks around secrets leakage, compromised runners, supply chain attacks, and unauthorized promotions. Prioritize controls by effectiveness and operational cost.
Sample Answer
Direct answer
The attack surface of a configuration repository and its promotion pipeline splits into four zones an attacker could target: the REPOSITORY itself (who can commit, whose commits get merged), the CI RUNNERS that execute pipeline steps (what they can read and reach), the SUPPLY CHAIN of dependencies and base images the pipeline pulls in, and the PROMOTION MECHANISM that actually applies changes to production. A prioritized control set addresses the zone with the highest (likelihood times blast radius) first: branch protection and required review (repository), ephemeral, least-privilege runner credentials (runners), pinned and verified dependencies (supply chain), and a promotion gate that cannot be bypassed by a single compromised identity (promotion mechanism).
Structured elaboration
Repository zone risks and controls. Risk: a compromised or malicious contributor merges a change that exfiltrates secrets or grants themselves broader access, or force-pushes to rewrite history and hide evidence. Controls, roughly ordered by effectiveness per unit of operational cost: branch protection requiring review from someone OTHER than the author (cheap, high effect, stops the single most common path); required status checks (policy-as-code, secret-scanning) that must pass before merge (cheap, catches accidental leaks and known-bad patterns); disallowing force-push and requiring signed commits on protected branches (moderate cost, closes the history-tampering path); a CODEOWNERS-style requirement that changes to the pipeline definition ITSELF need a security or platform-team reviewer, not just any team member (moderate cost, closes the meta-attack of modifying the pipeline to weaken its own controls).
CI runner zone risks and controls. Risk: a compromised runner (via a malicious dependency executed during the build, or a vulnerability in the runner's own environment) reads secrets injected into the job, or pivots to reach other systems the runner's network position allows. Controls: short-lived, scoped credentials issued PER JOB (OIDC-based federation to the cloud provider rather than a long-lived static secret stored in the CI system) so a compromised runner's blast radius is bounded to that one job's narrow scope and a short time window; network-isolate runners so they cannot reach anything beyond what THAT specific job legitimately needs; and treat runner logs as potentially containing secrets, redacting known secret patterns automatically rather than trusting every script to avoid printing them.
Supply chain zone risks and controls. Risk: a malicious or compromised third-party action, base image, or dependency executes arbitrary code during the pipeline run. Controls: pin dependencies to exact versions or content hashes rather than floating tags (actions/checkout@<sha> not @v4), scan and sign container images used as pipeline steps, and restrict which third-party actions/images are allowed at all (an explicit allowlist for anything with write access to secrets or production credentials).
Unauthorized promotions zone risks and controls. Risk: a compromised identity, or a legitimate identity acting outside intended process, triggers a production promotion without the required review. Controls: require the promotion trigger (a merge to a protected production-overlay path, or an explicit approval gate in the deployment tool) to be tied to a REVIEWED PR event, not a webhook or manual trigger any single credential can fire; and log every promotion event with enough context (who/what triggered it, which commit, which approvals) to make an unauthorized promotion immediately detectable even if it cannot be prevented outright.
Worked example
Prioritized by (likelihood times blast radius), for a mid-size organization with an existing but not security-hardened pipeline:
| Priority | Control | Effectiveness | Operational cost |
|---|---|---|---|
| 1 | Branch protection + required review on protected branches | High (stops the most common compromise path) | Low |
| 2 | Ephemeral, scoped, per-job credentials for runners (OIDC federation, not static secrets) | High (bounds blast radius of a compromised runner) | Medium (requires reworking existing static-secret pipelines once) |
| 3 | Pin third-party actions/images to exact digests, allowlist high-privilege ones | Medium-high (closes a real, historically-exploited path) | Low-medium |
| 4 | Promotion gated on a reviewed PR event only, with logged approvals | High for the specific "unauthorized promotion" risk | Low (mostly configuration) |
| 5 | Automated secret-scanning as a required check | Medium (catches accidental leaks, not determined exfiltration) | Low |
| 6 | Signed commits on protected branches | Medium (raises the bar for history tampering specifically) | Medium (workflow change for every contributor) |
The first four sit at the top because they each close a HIGH-BLAST-RADIUS path (a merged malicious change, a compromised runner with broad reach, an unpinned supply-chain dependency, or a promotion nobody reviewed) at comparatively low implementation cost; signed commits and some of the more process-heavy controls are real but address a narrower slice of risk relative to their rollout cost, so they land lower without being unimportant.
Trade-offs and pitfalls
- Common mistake: treating a required status check as equivalent to a required human review. An automated check catches known patterns; it does not catch a change that is subtly malicious but syntactically clean, which is exactly what human review is for. The two are complementary, not substitutes.
- Ephemeral, per-job credentials are the single highest-leverage control on this list and also the one most often skipped, because migrating away from a long-lived static secret already embedded in a working pipeline feels riskier to touch than leaving it; the actual risk asymmetry runs the other way, a long-lived static secret is a standing target for as long as it exists.
- An allowlist for third-party actions/images needs an owner and a review process for ADDING to it, otherwise it either calcifies (blocking legitimate new tooling and creating pressure to bypass it) or erodes (approvals granted too casually under time pressure, defeating its purpose).
- Common mistake: prioritizing controls by ease of implementation rather than by risk reduction per unit of cost. The cheapest controls to implement are not always the highest-leverage ones; a genuinely prioritized list, as above, has to weigh blast radius explicitly, not just roll out whatever is fastest to configure first.
Explain how reconciliation loops work in GitOps controllers (for example Argo CD and Flux). Discuss scaling challenges when managing thousands of manifests across many clusters, including informer/watch scaling, reconcile frequency, rate-limiting, caching strategies, and design decisions to reduce API-server and controller load.
Sample Answer
Direct answer
A GitOps controller's reconciliation loop is fundamentally: watch a source (Git, or the cluster via informers) for changes, compute a diff between desired and live state, and apply the difference, repeated continuously. At small scale this is simple; at THOUSANDS of manifests across MANY clusters, the loop's naive form breaks down along four specific axes, informer/watch scaling (how many objects a single controller can efficiently watch), reconcile frequency (how often it re-checks everything), rate-limiting (how fast it can safely apply changes without overwhelming the API server), and caching (how much redundant API-server work each reconcile avoids), and a controller designed for scale has to address all four, not just add more compute.
Structured elaboration
Informer/watch scaling. Kubernetes controllers typically use informers (a local, continuously-updated cache backed by a watch connection to the API server) rather than polling list calls, so each reconcile reads from the LOCAL cache, not the API server directly. At thousands of manifests across many clusters, the watch connections themselves (one per resource type per cluster, potentially) and the memory footprint of the local caches become the bottleneck; a controller architecture built for scale shards this work (per-cluster or per-namespace informer instances, only watching resource kinds actually in use) rather than running one giant informer set watching everything everywhere.
Reconcile frequency. A fixed, short polling interval applied uniformly to every application (checking every 30 seconds regardless of how often that application's config actually changes) wastes API-server and controller CPU on applications that rarely change while still being too slow for applications that need faster drift detection. Event-driven reconciliation (triggering a reconcile on a Git webhook or a Kubernetes watch event, rather than a fixed poll interval) plus EXPONENTIAL BACKOFF for applications that are healthy and unchanged (progressively lengthening the interval between checks when nothing has changed recently, resetting to a fast interval the moment something DOES change) gets fast reaction time where it matters without constant unnecessary work everywhere.
Rate-limiting. Applying many changes simultaneously across a large fleet risks overwhelming the target API server(s) with a burst of writes, especially right after a controller restart when every application needs to be re-evaluated at once (a "thundering herd"). Controllers built for scale use client-side rate limiting (a token-bucket or leaky-bucket limiter on outbound API calls per cluster) and STAGGER the initial reconcile pass after startup (jittered delays rather than firing every application's first reconcile in the same instant) specifically to avoid this.
Caching strategies. Beyond the informer's live-object cache, a scaled controller caches EXPENSIVE derived computations, rendered manifests (re-running a Helm template or Kustomize build on every single reconcile pass is wasteful if the underlying chart/base hasn't changed), diff results, and resolved Git commit SHAs (avoiding a fresh Git fetch on every poll when polling for changes rather than using webhooks), invalidating each cache layer only when its actual input changes.
Trade-offs and pitfalls
- Common mistake: treating "add more controller replicas" as the primary scaling lever. Horizontal scaling helps only if the WORK is genuinely partitionable (sharded by cluster or namespace, with each replica owning a disjoint slice); naively running multiple replicas all reconciling the SAME full set of applications multiplies API-server load without increasing effective throughput, and risks duplicate/conflicting apply operations unless there is a leader-election or sharding scheme.
- Event-driven reconciliation reduces average load but does NOT eliminate the need for a periodic full reconcile. Webhooks and watch events can be missed (a delivery failure, a network partition during the exact window a change happened), so a scaled system still needs an occasional FULL reconciliation pass (hourly, or some longer interval) as a correctness backstop, purely event-driven with no periodic fallback risks silent, permanent drift if even one event is ever lost.
- Aggressive caching trades staleness risk for reduced load, and that trade-off needs an explicit, bounded staleness budget, not an open-ended "cache until something tells us to invalidate," since a caching bug that fails to invalidate correctly can leave a controller confidently reconciling against a manifest render that is silently out of date.
- Rate-limiting protects the API SERVER, but does not by itself protect against a controller being overwhelmed by its OWN internal queue if events arrive faster than they can be rate-limited out; a bounded work queue with backpressure (dropping or coalescing redundant re-reconcile requests for the same object rather than queuing every single trigger separately) is a necessary complement to outbound rate-limiting, not a substitute for it.
Unlock Full Question Bank
Get access to all Infrastructure as Code and GitOps interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.