Direct answer
Multi-tenant Airflow isolation is a spectrum, not a binary choice, and keeping operational overhead low means choosing the cheapest isolation mechanism that actually stops each specific cross-tenant risk, rather than defaulting to the most expensive option, fully separate Airflow deployments per team, everywhere. Namespace isolation plus role-based access control handles the access-control risk cheaply, resource quotas plus separate queues handle the contention risk, and a deliberate secrets-management approach handles the credential-leakage risk, each independently, at the granularity that risk actually requires.
Structured elaboration
Namespace isolation. Airflow's own access control lets DAGs be grouped into logical roles per team inside one deployment, a low-cost way to give each team a tidy, separated view. On Kubernetes, real namespaces per team for the worker pods add actual infrastructure-level isolation, network policy boundaries and separate role-based-access-control scoping, beyond what Airflow's own user-interface-level grouping provides alone. The cheap, logical-only version is often sufficient for teams that trust each other's code and just want tidy separation; true namespace-level infrastructure isolation is needed once teams genuinely should not be able to affect each other's workloads even if one team's code turns out to be buggy.
Role-based access control (RBAC). Airflow's built-in RBAC restricts who can view, trigger, or edit which DAGs, configured per team, so one team cannot accidentally, or deliberately, trigger or modify another team's DAGs. This is largely a configuration exercise on top of a feature Airflow already has, low operational overhead to set up once, not a system built from scratch.
Resource quotas. Per-team pools cap each team's concurrent task execution against shared worker capacity, the same pattern used for general resource-contention prevention elsewhere, applied here specifically at the tenant or team granularity.
Separate queues and workers. For a team needing stronger isolation than a shared pool with quotas provides, a team whose workload could still degrade shared infrastructure through node-level contention even while staying within its own quota, dedicate a separate queue or a separate node pool specifically for that team. This mirrors the tiered pattern: logical grouping first, hard infrastructure separation only where a team's actual needs justify it, rather than defaulting every team to the most expensive tier by default.
Managing shared connections and variables securely. Connections genuinely shared across teams, a common data-warehouse connection everyone reads from, live in Airflow's connections and secrets backend with read access for every team needing it, but write access restricted to whichever team actually owns that credential. Team-specific connections should be clearly namespaced or prefixed and access-restricted to that team alone through the same RBAC mechanism, so a team cannot accidentally use, or accidentally overwrite, another team's credential just because Airflow's connections list is otherwise a flat, shared namespace by default.
Worked example
8 teams share one Airflow deployment. Namespace and RBAC isolation, configured once, costs roughly a day of initial setup, not ongoing per-team infrastructure, and each team sees only its own DAGs by default. Resource quotas give each team a pool sized proportionally to its typical daily task volume, a team responsible for 40 percent of total daily tasks gets a proportionally larger pool than a team responsible for 5 percent, preventing any one team's burst from starving another's normal operation, at near-zero marginal operational cost beyond the initial pool-sizing exercise.
One team, processing regulated financial data, needs stronger isolation than pools alone provide for compliance reasons. Only that team gets a dedicated Kubernetes node pool and a dedicated queue, an isolation tier the other 7 teams do not need and are not paying the operational cost of, keeping the deployment's average per-team overhead low while still meeting the one team's genuinely stricter requirement.
Trade-offs and pitfalls
Applying the cheapest isolation tier uniformly, namespace, RBAC, and quotas only, is operationally cheap but insufficient for a tenant with a genuine compliance or blast-radius requirement that a count-based quota alone cannot satisfy; a quota limits how much of shared capacity a team can consume, it does not necessarily prevent every form of cross-tenant interference at the infrastructure level.
Applying the most expensive tier, fully separate deployments, uniformly solves isolation completely but multiplies operational overhead by the tenant count, directly working against the low-overhead constraint the question itself sets.
The tiered approach requires an actual, periodically revisited risk assessment per team, which tier a given team genuinely needs, rather than a one-time decision made at onboarding; a team's isolation needs can change, starting to process regulated data it did not handle before, for instance, without anyone proactively re-evaluating its tier unless that review is a deliberate, recurring process.