Skip to main content
Cloud DevOps Solutions
Get a quote Talk to an engineer

Kubernetes Consulting

How to Separate Dev, Staging and Production Across Kubernetes Clusters

A multi-cluster strategy decides which workloads share a Kubernetes cluster and which get their own. For most teams we recommend at least one production cluster separate from non-production, then add clusters only where blast radius, compliance or team boundaries justify the extra operating cost.

Key takeaways

  • The real question is blast radius: what breaks, and for whom, when something goes wrong.
  • Production should never share a cluster with experiments, since quotas, upgrades and mistakes are shared too.
  • Namespaces give organisation, not hard isolation, so decide what level of isolation you actually need.
  • Every extra cluster multiplies upgrades, add-ons, monitoring and cost, so each one needs a reason.
  • Promotion between environments should be code driven and identical in shape, so staging genuinely predicts production.

The question behind the question

When teams ask how many clusters they need, they are really asking how much damage one mistake is allowed to do. A multi-cluster Kubernetes strategy answers that deliberately. Without one, clusters multiply by accident: a team creates one for a proof of concept, it becomes load bearing, and a year later nobody is sure what runs where.

This page covers how we advise on dev, staging and production separation as part of our Kubernetes consulting work, including when a single cluster is the better answer.

What goes wrong with the wrong layout

Everything in one cluster. A runaway staging job consumes memory and evicts production pods. A cluster upgrade needed by one team forces risk on all of them. A leaked credential in dev reaches production secrets because RBAC was never tightened.

A cluster per everything. Twelve clusters, each upgraded by whoever remembers, each with slightly different add-on versions. Security fixes land unevenly, monitoring has gaps, and cost climbs because every cluster has fixed overhead.

Both are failures of intent, not of technology.

Namespaces versus clusters

A namespace is a soft boundary. It scopes names, and lets you attach quotas, access rules and network policy. It does not give separate nodes, a separate control plane or isolation from cluster-wide objects.

NeedNamespaceSeparate cluster
Organise teams or servicesGoodOverkill
Limit resource use per teamGood (ResourceQuota)Not needed
Test a Kubernetes upgradeCannotRequired
Contain a compromised workloadWeakStrong
Separate regulated dataUsually insufficientPreferred
Per-team cost visibilityPossible with labelsStraightforward

If you cannot tolerate a bad day in one area affecting another, use a separate cluster. If you simply want order, use namespaces.

Layouts we recommend, and when

  1. Two clusters: production and non-production. The default for small and mid-sized teams. Dev and staging share a cluster, separated by namespace and ideally dedicated node pools.
  2. Three clusters: dev, staging, production. Worth it when you need to rehearse cluster-level changes in staging before production, or when dev is chaotic enough to threaten staging stability.
  3. Production split further. By region for latency or resilience, by business unit, or by compliance scope. Each split needs a clear owner.
  4. A sandbox cluster. Disposable, torn down on a schedule, for experiments that should never touch real environments.

We do not recommend a design before understanding team structure. A platform team serving ten product teams is a different problem from a team of six engineers.

Making environments actually comparable

Staging that differs from production gives false confidence. We enforce parity on the things that cause surprises:

  • Same Kubernetes minor version and add-on versions (ingress, CNI, DNS, autoscaler).
  • Same policies: network policy, admission rules and RBAC patterns.
  • Same deployment mechanism, so the path to staging is the path to production.

Differences are allowed in size, replica counts, and data volume. A convenient pattern is a shared base with per-environment overlays:

# overlays/staging/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ../../base
patches:
  - target:
      kind: Deployment
      name: api
    patch: |-
      - op: replace
        path: /spec/replicas
        value: 2

Overlays like this are the backbone of GitOps deployment with Argo CD or Flux, where each cluster tracks its own directory in Git.

Promotion, access and cost

Promotion. A change is merged, built once, and the same image digest moves from dev to staging to production. Environment specific values live in configuration, never in a rebuilt image. Approvals or automated checks gate the production step.

Access. Developers usually get broad rights in dev, read access in staging and tightly controlled access in production. Our RBAC design work covers how to express that without hand-edited bindings.

Cost. Non-production clusters can scale down outside working hours, and quotas stop one team from consuming the pool. Our EKS cost optimisation guide lists the levers that apply on AWS. Fixed per-cluster costs, such as control plane fees and monitoring, are real, so count them before adding clusters.

Worked example: a growing team deciding on a third cluster

Imagine a company with one production cluster and one shared non-production cluster. Dev and staging are separate namespaces, and the arrangement has worked for a year. Then the platform team plans a Kubernetes minor upgrade and realises they cannot rehearse it safely: any change to the shared non-production cluster affects developers and staging tests together.

That is a concrete reason for a third cluster, and it is a different reason from “staging should be separate”. The new cluster can be smaller and can follow the same Terraform module as production, so it works as the rehearsal ground for cluster-level change. Dev stays on the shared cluster. We write down the trigger that justified the split, so a later request for a fourth cluster is judged against the same standard: what risk does it remove, and who will operate it?

Retiring a cluster

Retirement deserves as much care as creation. We list what still runs there, move or delete it through Git, remove DNS records and cloud load balancers, revoke access, and only then destroy the infrastructure from code. Skipping these steps is how orphaned clusters survive for years.

Trade-offs and when not to split

  • Small team, one product: two clusters is usually the ceiling. More is overhead.
  • Multi-region: do it for a stated resilience or latency target, not by default. Active-active adds data consistency problems that Kubernetes does not solve.
  • Strict compliance: separate clusters often simplify audits, because scope is easier to draw.
  • Shared tooling: a separate management cluster for the GitOps controller can help or hurt, depending on how much you trust a single control point.

Common failure modes

  • Staging running a different ingress or policy set, so network issues appear only in production.
  • Hand-applied hotfixes that exist in one cluster only.
  • No retirement process, leaving orphaned clusters that still cost money and still need patching.
  • Production credentials reachable from non-production clusters.

Delivery and how to tell it works

We hand over a written topology with the reasoning, Terraform and GitOps structure for every cluster, and rules for adding or removing one. Signs it is working: staging failures predict production behaviour, an upgrade is rehearsed before it reaches production, and you can name the owner and purpose of every cluster. To talk through your layout, book a consultation or see how managed operations can keep several clusters consistent.

References

How we deliver it

  1. 01

    Map risks and boundaries

    We list teams, data sensitivity, compliance scope, release cadence and what an outage costs in each area.

  2. 02

    Choose the cluster topology

    We propose a layout (for example prod, non-prod, and a separate sandbox) and record what was rejected and why.

  3. 03

    Define environment parity

    We decide what must be identical across environments and what may be scaled down.

  4. 04

    Build the promotion path

    Changes flow from dev to staging to production through pipelines or GitOps, with approvals where needed.

  5. 05

    Set quotas and cost guardrails

    Namespaces get resource quotas and the non-production clusters get scheduled scale-down.

  6. 06

    Document and rehearse

    We write the rules for adding or retiring a cluster, and test a disaster scenario against the layout.

Tools and technologies

TerraformArgo CDFluxHelmKustomizeCluster APIKarpenterkubectlResourceQuotaLimitRange

Frequently asked questions

Do we need a separate cluster for each environment?
Not always. A common, sensible baseline is one production cluster and one shared non-production cluster, with dev and staging separated by namespace and node pool. Separate staging clusters make sense when you need to rehearse cluster-level changes such as upgrades, which namespaces cannot test.
Are namespaces enough to isolate environments?
Namespaces separate names and let you attach quotas, RBAC and network policy, but pods still share nodes, the control plane and cluster-wide resources like CRDs. That is fine for trusted teams and low-risk workloads. For production versus experiments, or regulated data, use separate clusters.
How many clusters is too many?
When your team spends more time maintaining clusters than shipping, you have too many. Each cluster needs upgrades, add-on patching, monitoring and access control. Automation through Terraform and GitOps lowers that cost, but it never reaches zero, so we justify every cluster in writing.
Should staging match production exactly?
Match the shape, not the size. Same Kubernetes version, add-ons, ingress, policies and deployment method, but fewer or smaller nodes. The more staging differs in configuration, the less it tells you about production. Data volume and traffic are the usual differences, and you can test those separately.
Can one GitOps repo manage several clusters?
Yes. Both Argo CD and Flux can deploy to many clusters from one repository, using directory per environment or overlays. The design question is whether one controller manages all clusters or each runs its own. We weigh central visibility against the risk of one control point.

Talk to an engineer about multi-cluster kubernetes strategy

Book a free 30-minute call. We review your current setup and tell you honestly whether and how we can help.

Written by Saddique Khan, DevOps / SRE / Cloud Consultant Engineer. Last updated 2026-10-08.