Skip to content
KubeCell logoKubeCell

Use cases

Shared bare metal, private Kubernetes

KubeCell is for teams whose hardware is too expensive to duplicate and whose workloads are too real for namespaces alone. Here are five patterns we designed for.
Research and ML platform teams
01

Accelerator sandboxes for AI teams

Every researcher gets a full Kubernetes API with two dedicated 910B cards — no partitioning tricks, no shared queue.

The situation

Your lab runs one or two powerful ARM64 hosts with eight accelerators each. Today, jobs land in a shared namespace: one runaway workload can starve everyone, and nobody can install an operator or a CRD without stepping on another team's cluster.

With KubeCell

Publish a quota tier with two whole cards, then hand out clusters. Each one is a real K3s control plane, so teams install whatever operators they need inside their own API server while the host still enforces the quota.

What you get

  • Each cluster gets whole cards; two clusters never share one accelerator.
  • Capacity shown in status is what the hardware actually reports, not what was requested.
  • Quota usage is measured on the host, so the limits you set are the limits that apply.
  • Works with any accelerator your cluster advertises, NVIDIA or Ascend alike.
class-ascend-910b-small.yaml
apiVersion: kubecell.io/v1alpha1kind: VirtualNodeClassmetadata:  name: ascend-910b-smallspec:  entitlement:    workloadHard:      requests.cpu: "4"      limits.cpu: "4"      requests.memory: 8Gi      limits.memory: 8Gi      requests.huawei.com/Ascend910: "2"      limits.huawei.com/Ascend910: "2"  storageClassName: topolvm-provisioner
Teams with heavy integration tests
02

Ephemeral environments per pull request

Spin a child cluster for an integration run, hand over a kubeconfig, then delete it and let the finalizer clean the host.

The situation

Integration tests need cluster-scoped objects: CRDs, webhooks, storage classes, and a control plane that can be restarted. A shared namespace cannot provide that, and provisioning a whole managed cluster per test is too slow and too expensive.

With KubeCell

A cluster is created in seconds once images are warm, and deletion is complete: KubeCell removes the cluster, its credentials, and everything it created on the host. The kubeconfig is always published to one Secret, so CI can pick it up with a single command.

What you get

  • One cluster per branch: apply a manifest, wait for Ready, run tests, delete.
  • An admin kubeconfig is published every time — no manual hand-off.
  • Predictable cleanup, including PVCs, with Retain as the storage safety net.
  • Dry-run checks let CI fail fast when the host is out of capacity instead of hanging.
ci-virtualcluster.yaml
apiVersion: kubecell.io/v1alpha1kind: VirtualClusterPlanmetadata:  name: pr-1842-plan  namespace: kubecell-systemspec:  cellRef: {name: cell1}  classRef: {name: ci-medium}---# CI waits for status.decision, then creates the real VirtualClusterapiVersion: kubecell.io/v1alpha1kind: VirtualClustermetadata:  name: pr-1842  namespace: kubecell-systemspec:  cellRef: {name: cell1}  classRef: {name: ci-medium}
Training providers and universities
03

Workshops and training labs

Forty students, one host, forty clusters. Quota keeps the class fair and no one can break another student's control plane.

The situation

Students need admin rights to learn Kubernetes: install operators, break things, and fix them. Namespace-only classrooms cannot teach cluster-scoped concepts, and per-student VMs are expensive and slow to prepare.

With KubeCell

Create one small quota tier and issue a cluster per student. Each cluster shows a single node, so every kubectl tutorial works verbatim, and the host keeps a misbehaving cluster from affecting the rest of the class.

What you get

  • Admin kubeconfigs without giving anyone access to the host.
  • Hard CPU and memory caps per student, enforced by Kubernetes, not by convention.
  • Students cannot break the host: privileged Pods and hostPath volumes are rejected.
  • Teardown is one delete per student cluster.
classroom.sh
# Create the whole class from a small loopfor student in $(seq1 40); do    cat<<EOF | kubectl apply -f -apiVersion: kubecell.io/v1alpha1kind: VirtualClustermetadata:    name: student-$student    namespace: kubecell-systemspec:    cellRef: {name: lab-cell}    classRef: {name: workshop-small}EOFdone
Ops teams running remote sites
04

Edge and field labs

Hardware lives where the hardware is. Hosts connect outbound to one management plane — no inbound tunnel per site.

The situation

Your accelerators and data live at a remote site behind NAT. You still need one place to declare changes, watch capacity, and hand out developer clusters — without opening inbound management paths to every machine.

With KubeCell

Hosts connect outbound to the management cluster. Every change is applied through that one channel and every observation comes back the same way, so there is no inbound tunnel to maintain and no agent to babysit.

What you get

  • One management plane for many sites, with each site isolated on its own hosts.
  • No inbound SSH or API access to hosts required for day-to-day operation.
  • Sites that stop reporting are visible immediately, before anyone tries to create a cluster.
  • Endpoints are discovered and republished, so kubeconfigs keep working after address changes.
fleet-status.sh
kubectl-n kubecell-system get cells -o custom-columns=\NAME:.metadata.name,PHASE:.status.phase,JOINED:.status.managedCluster.joined,\LEASE:.status.managedCluster.leaseFresh,NODES:.status.nodes[*].name
Internal platform teams
05

Landlord mode for platform teams

Declare Cells and quota tiers once; product teams self-serve child clusters inside the envelope you defined.

The situation

Requests for clusters arrive faster than your team can provision hardware. You need the platform to own capacity and guardrails while product teams self-serve inside them — without negotiating every request in chat.

With KubeCell

The platform publishes hosts with their observed capacity and a small set of quota tiers. Teams check a request with a dry run, then create the cluster. Every step is visible as a Kubernetes resource with status, so capacity conversations happen against real data.

What you get

  • Dry runs before commitment: accepted, rejected with reasons, or unknown.
  • Capacity accounting per host: requested, pending, and available estimates.
  • Bindings are immutable, so capacity cannot silently move between hosts.
  • The same tested versions everywhere, upgraded through releases.
capacity.sh
# Tenants can inspect headroom before asking for anythingkubectl-n kubecell-system get cell cell1 \  -o jsonpath='{range .status.inventory[*]}{.resource}{"\t"}{.availableEstimate}{"\n"}{end}'

Do not see your scenario?

If it needs a real Kubernetes API on hardware you already own, it is probably a fit. Read the technical design or open an issue with your constraints.