Kubernetes Cluster Topology
How many clusters, split by what, which node pools exist and what isolates one tenant from another.
flowchart TB
subgraph prod["Cluster: prod-eu (regional, 3 AZ)"]
direction TB
cp["Control plane<br/><i>managed · private endpoint</i>"]
subgraph pools["Node pools"]
direction LR
np1["system<br/><i>taint: CriticalAddonsOnly</i>"]
np2["general<br/><i>3–30 nodes · spot 40%</i>"]
np3["memory<br/><i>taint: workload=memory</i>"]
np4["gpu<br/><i>taint: workload=gpu</i>"]
end
subgraph ns["Namespaces"]
direction LR
n1["team-orders<br/><i>quota · NetworkPolicy<br/>default-deny</i>"]
n2["team-pricing<br/><i>quota · NetworkPolicy</i>"]
n3["platform<br/><i>mesh · ingress · logging</i>"]
end
cp --- pools
pools --- ns
end
subgraph nonprod["Cluster: nonprod-eu"]
direction TB
x1["shared node pool<br/><i>spot 90%</i>"]
end
reg[("Image registry<br/><i>signed images only</i>")] --> prod
reg --> nonprod
gitops["GitOps reconciler"] -.->|"applies desired state"| prodWhat it is
The cluster estate: how many clusters and on what axis they are split, what node pools exist and what each is reserved for, and how tenants are separated inside a shared cluster. The split decision is the architecture — per environment, per region, per tenant, per compliance boundary — and every option trades blast radius against cost and operational load.
When you produce it
Before the second cluster exists, because cluster sprawl is easy to start and expensive to reverse. Revisit whenever a workload arrives with an isolation requirement the current split cannot express.
Who reads it
Platform engineers who run it. Application teams, who need to know what they get and what they are sharing. Security, who care whether namespace isolation is sufficient for the data involved.
What good looks like
- The split axis is stated and justified. "One per environment per region" is a decision; forty clusters that grew is not.
- Taints and tolerations are shown, so it is clear what can land where.
- Namespace isolation is explicit: quotas, network policy default-deny, and whether that is considered a hard boundary.
- Autoscaling ranges and spot proportion are noted — they drive both cost and eviction behaviour.
- Non-production is a separate cluster where the risk warrants it, and the diagram says why.
Common mistakes
- Treating a namespace as a security boundary for genuinely hostile multi-tenancy. It is not; that needs separate clusters or sandboxed runtimes.
- One giant cluster, so an upgrade is a company-wide event.
- A cluster per team, so the platform team operates forty control planes.
- No default-deny network policy, making every namespace reachable from every other.