Skip to main content

Stop Letting One Team Hog Your Expensive GPUs: Why There's No Single Right Answer for Kubernetes Accelerator Sharing

Why GPU Design Must Start From "Sharing," Not "Owning"

Of all the workloads running on a Kubernetes cluster, none is less forgiving of being monopolized by a single team than the GPU. If you run short on CPU or memory, you just add another node — but GPUs live on a completely different plane when it comes to price and supply. AWS raised its on-demand H200 pricing by 15% in January 2026, reportedly its first GPU price hike in nearly two years (cast.ai's analysis). H100-class instances still run roughly $12–13 per hour on AWS and Azure.

Despite that price tag, the reality is even more sobering. A survey covering more than 23,000 Kubernetes clusters found average GPU utilization sitting at just around 5%, pushing the effective cost to nearly 20 times the published hourly rate (reporting from winbuzzer). While one team lets a GPU node sit idle after claiming it, the team next door is stuck waiting in line for capacity. That dynamic is exactly what turns GPU multi-tenancy design in Kubernetes from a "nice to have" into a "the platform doesn't work without it" requirement.

That's why sharing a single cluster's GPUs across multiple teams and workloads — true multi-tenant design — becomes the starting point for any AI platform operation. The first fork in the road is whether to divide logically by namespace or physically by node. If you're running Kubo, a lightweight K3s-based Kubernetes distribution, you can build these GPU node pools at a lower cost than with a cloud provider's managed K8s offering.

Namespace Isolation — A Logical Wall With Real Limits

section01

The simplest multi-tenancy strategy is splitting teams into namespaces and capping GPU counts with a ResourceQuota. Since Kubernetes v1.10, extended resources like GPUs have been quota-able, so a setting like requests.nvidia.com/gpu: "4" can enforce a per-namespace ceiling (Kubernetes official docs: Resource Quotas). GPU allocation itself can only be specified in the limits section of a Pod manifest, built on top of vendor-supplied device plugins (such as NVIDIA's) registering an extended resource named nvidia.com/gpu with the kubelet (Kubernetes official docs: Schedule GPUs).

Time-division sharing of a single GPU across multiple workloads — "time-slicing" — is also an option here. NVIDIA GPU Operator's time-slicing feature lets you define multiple replicas against one physical GPU, each assignable to a separate Pod independently (NVIDIA official docs: Time-Slicing GPUs in Kubernetes).

That said, namespace isolation has limits that can't be ignored. A Kubernetes namespace only scopes API objects — it isn't a mechanism for isolating GPU memory (VRAM) itself. There are documented risks of one tenant's model weights lingering in GPU memory and being handed off to the next tenant (vcluster's explainer on GPU multi-tenancy). AWS's own EKS best practices guide frames namespace/RBAC/NetworkPolicy-based "soft multi-tenancy" as suitable for trusted internal teams, but notes that external customers or strict regulatory requirements call for stronger isolation (AWS EKS Best Practices: Multi-tenancy).

In short, namespace isolation is the choice of "low cost, thin walls."

Dedicated Nodes — A Solid Wall With a Rising Cost Ceiling

section02

The opposite extreme is dedicating GPU nodes entirely to a single team or workload. Kubernetes taints and tolerations control Pod scheduling: a node with a given taint will only accept Pods carrying the matching toleration (phoenixnap's explainer: Kubernetes Taints and Tolerations). Since GPU nodes cost far more than ordinary CPU nodes, it's common practice to apply a NoSchedule effect taint to keep general-purpose workloads out, letting through only the Pods that genuinely need a GPU.

The upside of this approach is isolation strength. Because no other team's processes ever run on the same node, both security boundaries and resource contention (the "noisy neighbor" problem) are eliminated outright. The downside is just as clear: a dedicated node stays reserved for that team or workload at all times, so for any workload with uneven usage patterns, idle time accumulates directly as cost. One driver of the "5% average GPU utilization" problem mentioned earlier is precisely this accumulation of "reserve it just in case" design decisions.

Dedicated nodes are the choice of "strong isolation, high cost ceiling."

A Hybrid Multi-Tenant Design Combining Namespace Isolation and Dedicated Nodes

section03

There's no need to commit fully to either namespace isolation or dedicated nodes. In practice, the realistic answer is a hybrid design that combines both based on the nature of the workload.

Concretely: production inference workloads with high sensitivity or strict SLAs get strongly isolated on dedicated nodes with taints, while experimental or R&D workloads share nodes via namespace isolation plus ResourceQuota. Mirantis's multi-tenancy explainer likewise notes that for AI workloads, namespace-level GPU quotas alone aren't sufficient — combining them with Priority Classes or MIG (Multi-Instance GPU) partitioning is recommended (Mirantis: Kubernetes Multi-Tenancy Best Practices). A two-layer design — using MIG to split a GPU into up to seven independent instances and then further allocating those within a dedicated node — is also a practical option.

The essence of this hybrid design is the idea of balancing cost and isolation level within a single cluster. There is no single right answer for a multi-tenant GPU platform; you have to weigh each workload's risk tolerance against its cost tolerance and re-choose the architecture each time.

Building a GPU Multi-Tenant Platform in Practice With Kubo

section04

None of the three designs covered here — namespace isolation, dedicated nodes, or hybrid — are especially complex at the YAML level. But the operational burden of deciding which workload goes where, and continuously maintaining consistency across ResourceQuota, taints, and tolerations, is far from trivial.

Kubo is a lightweight K3s-based Kubernetes distribution that can still build a full-spec Kubernetes cluster, including GPU node pools. Its AI-Driven Deployment mechanism means you can simply describe a requirement in natural language — "dedicate GPU nodes to production inference, but share development workloads via namespace isolation" — and have the AI auto-generate the matching combination of taints/tolerations and ResourceQuotas. It resolves the complex configuration management unique to multi-tenant GPU platforms with a No Ops approach.

On the cost side, Kubo runs comparably-specced clusters at roughly half the price of EKS/AKS. The more expensive the resource — and GPUs are about as expensive as it gets — the more a difference in baseline cluster operating cost affects your total bill. Driving up GPU utilization (via namespace isolation or time-slicing) and driving down the cost of running the cluster itself (by adopting Kubo) are two efforts worth pursuing together.

Conclusion

When allocating GPUs and other AI accelerators to multiple teams on a Kubernetes cluster, there's a structural trade-off: namespace isolation is low-cost but weakly isolated, while dedicated nodes are strongly isolated but expensive. In practice, the realistic answer is a hybrid design that combines both based on workload importance and sensitivity. Rather than searching for a single right answer, the real essence of operating a multi-tenant GPU platform is the willingness to re-choose your architecture each time, based on your own workload characteristics.

If you're unsure which GPU multi-tenancy design fits your AI workloads, Kubo offers architecture consultations through Contact Us. If you're also looking ahead to an AI agent platform, it's worth considering Captain.AI, which runs on top of Kubo.

Related articles

← Back to all posts