For platform builders

Run many customers on one control plane

If you host applications for other people — as a hosting provider, an MSP, or an agency that keeps its clients' systems running — you need the thing Kubernetes namespaces are documented not to be: a tenant boundary you can put in a contract. This page is about what that boundary is made of here, and it cites the code for every claim, the same way the rest of this site does.

The build-versus-buy arithmetic, shown rather than asserted

Every platform company reaches the same fork: build the orchestration layer, or integrate one. We are not going to quote you an industry study we cannot show you. Here is the one figure that is ours, and where it comes from.

Our own pricing analysis puts a Kubernetes-focused DevOps engineer at $150,000 a year — that is the number we use internally when we compare our tiers against the alternative, and it is an estimate we made, not a salary survey we ran. The arithmetic from there is yours to do with your own numbers:

1
Engineer, at our own $150,000 estimate, before you have a single customer on the platform
0
Orchestration engineers required to put a customer on Odysseus
6
Tenancy primitives below, each one a thing you would otherwise build

We publish no partner price on this page, and that is deliberate: we would rather tell you we have not set one than invent a number to fill the space. What a reselling arrangement costs depends on how many nodes you run and how you want to be billed, and that is a conversation.

Tenancy, primitive by primitive

Six things you would otherwise build. Each one is a link to where it lives in the source, so you can check rather than believe.

A tenant hierarchy, with sub-organisations

A tenant can have a parent. That is one field — ParentTenantID — and the whole hierarchy hangs off it: creating a sub-organisation under a parent, listing a parent's children, walking up the chain to find the root, and refusing an operation that would cross a branch it should not. If you resell to companies that themselves have departments, subsidiaries or client accounts, the shape already exists.

Consolidated or separate billing, per sub-organisation

Each sub-organisation is created either consolidated, where the parent is billed for it, or separate, where it is billed in its own right. It is a validated field on the tenant, not a convention in a spreadsheet, and consolidated is the default when the caller does not say. That is the difference between reselling under your own invoice and introducing customers who pay directly — and you can do both, in the same estate, at the same time.

Quotas that are enforced, not advertised

A tenant carries limits on how many deployments, how many containers, and how many replicas per deployment it may have. They are validated on the way in: a negative limit is a rejection, and a container ceiling below the deployment ceiling is a rejection too, because it describes an estate that cannot exist. A free tier you cannot enforce is a free tier that costs you money.

A Docker network per tenant

Tenant networks are named from the tenant's own identifier, and a tenant gets a default one whether or not it asks. Two customers on the same node do not share a network segment by accident, because there is no code path in which they share one at all.

Row-level security in the database, failing closed

Tenant separation in the audit store is enforced by Postgres itself, not by a WHERE clause somebody has to remember to write. The policy is fail-closed — a connection with no tenant set sees nothing rather than everything — and there is a dedicated test suite that exists to try to read across the boundary and fail to.

A WireGuard mesh per tenant, in three topologies

Each tenant's nodes are joined by their own encrypted mesh, configured as full mesh, partial, or hub-and-spoke. Hub-and-spoke requires you to name the hub — a hub-and-spoke mesh with no hub is refused rather than silently degraded to something else. For a provider with a central site and many customer edges, that third topology is the one that matters.

Why this is a boundary and a namespace is not

Kubernetes documents its own namespaces as not being a security boundary. That is not our characterisation of someone else's product; it is theirs, and it is the reason a platform built on namespaces ends up carrying a second isolation layer that somebody has to build and keep working.

Here the boundary is the tenant, and it is made of the six things above at once: separate networks, separate Vault paths, separate key-value space, database policies that fail closed, and a mesh per tenant. What we can offer as evidence is our own: nine dedicated isolation test suites whose purpose is to attempt cross-tenant access and be refused, and a security audit whose 184 findings and their remediation are published in full rather than summarised.

The proof, not the promise

Four pages on this site exist so that the claims above can be checked rather than taken:

Where your customers' data lives

Nodes belong to the tenant. Your customers' workloads, their volumes and their data sit on servers you or they control, in whatever jurisdiction those servers are in — the control plane holds orchestration state, not application data. For a provider selling into a market with residency requirements, that is the useful arrangement: the answer to “where is my data” is “where you put it,” and it does not depend on where we are.

Geographic placement enforcement — pinning a workload to a country or region within your own fleet — is available and off by default. We would rather say that than imply it is switched on.

Talk to us

If you are building a platform on top of this, the next step is a conversation about node counts, billing shape and what your customers will ask you to prove. Write to sales@delta-telematics.ca.

How these claims can be checked

  1. Tenant hierarchy and sub-organisations.

    The field is ParentTenantID in internal/types/types.go:100. Creation under a parent, listing a parent's children, walking to the root and the cross-branch refusals are in pkg/api/tenant_api.go at lines 800, 881, 931–935, 959 and 1018–1027.

  2. Consolidated or separate billing.

    BillingMode and its two values are defined at internal/types/types.go:74–78; the field is accepted, validated and defaulted to consolidated in pkg/api/tenant_api.go:717 and 780–801.

  3. Quotas.

    The validation that rejects a negative limit, and the one that rejects a container ceiling below the deployment ceiling, are at internal/types/validation.go:296 and :329. The defaults a tenant starts with are asserted in internal/types/tenant_quota_test.go:20.

  4. Per-tenant Docker networks.

    buildTenantNetworkName at pkg/docker/client.go:1647 derives the name from the tenant identifier; GetDefaultTenantNetworkName at :1698 is why a tenant has one without asking.

  5. Row-level security.

    The policies are in audit-postgres/init/05-row-level-security.sql. The suite that tries to read across the boundary and expects to fail is pkg/audit/postgres_rls_test.go.

  6. The WireGuard mesh and its three topologies.

    The modes, the refusal of a hub-and-spoke configuration with no hub named, and the mesh construction are in pkg/wireguard/mesh.go at lines 41–54 and 221–276.

  7. The $150,000 engineer.

    That figure is from our own document, marketing/Odysseus_Pricing_Strategy_v2.md §10.6, where it is used to compare our tiers against hiring. It is our estimate, not a survey, and it is presented here as one because that is what it is. We have deliberately not published the wider industry ranges quoted in our internal positioning work: that document is not in the repository this site is built from, so we cannot show you the source, and a number on this page whose source we cannot show would be the weakest thing on it.

  8. What is not claimed.

    There is no partner price on this page because no partner price has been set. The multi-cloud sentence says two clouds because two is what was tested and verified — a third was checked for in code and not found, and the multi-cloud page says so in the same words. Geographic placement enforcement is described as available and off by default because that is its state.

  9. The Kubernetes namespace statement.

    That is Kubernetes' own documentation of its own namespaces, not our characterisation of someone else's product. The isolation test suites and the 184-finding audit referenced beside it are ours, and the audit is published in full on the security audit page.

  10. All code references were verified against this repository on 24 August 2026. Line numbers move; the identifiers do not, and every one of them is greppable.