Skip to main content
RunBook Academy

Proxmox VEXXVII · Multi-Cluster and Multi-TenancySharing one cluster

Pools, delegation and the limits of tenant boundaries

Advanced⏱ ~32 minpveumpvesh

What you'll learn

  • Describe what a resource pool is: a grouping of guests and storages that carries an ACL path
  • State that PVE has no per-pool resource limits, and design around that honestly
  • Build a delegated tenant with a group, a purpose-built role and pool-scoped ACLs
  • Enumerate what pools do not isolate: CPU and memory contention, storage capacity, network reachability and node access
  • Decide between a pool, a separate cluster, and a separate node group for a given tenant

Prerequisites

Verified against Proxmox VE 9.2.4 · Proxmox Backup Server 4.2.5 · Ceph Squid / Tentacle · Debian 13 (Trixie) · Linux kernel 7.0 (PVE 9.2 default) · 2026-08-12

Not yet marked complete on this device.

Splitting into more clusters is one answer to “several groups of people share this platform”. The other is to share one cluster properly, which is cheaper and is the right answer far more often than the cluster-per-tenant instinct suggests.

Proxmox VE’s tool for that is the resource pool. It is genuinely useful and it is routinely oversold, so this lesson does two things: builds a delegation that works, and then states plainly what pools do not do.

What a pool is

The documentation is precise and short. A pool is “a set of virtual machines, containers, and storage devices” that exists to simplify permission handling: rather than setting permissions on each resource, you set them on /pool/{poolid}, and they are inherited by all pool members.

That is the whole feature. A pool is:

  • A membership list of guests and storages.
  • An ACL path/pool/<name> — that permissions can attach to.
  • A GUI grouping, so a tenant’s view is a folder rather than a search.

Building a delegated tenant

The working pattern is a group, a role, a pool, and ACLs on the pool path plus the storages the tenant is allowed to consume.

Configuration changecreate the pool and its group
POOL="tenant-blue"

pveum pool add "$POOL" --comment "Blue team: delegated self-service"
pveum group add "$POOL-admins" --comment "Administrators for the blue tenant"
Configuration changea purpose-built tenant role
pveum role add TenantSelfService --privs "VM.Allocate VM.Audit VM.Clone VM.Config.CDROM VM.Config.Cloudinit VM.Config.CPU VM.Config.Disk VM.Config.Memory VM.Config.Network VM.Config.Options VM.Console VM.PowerMgmt VM.Snapshot VM.Snapshot.Rollback VM.Backup Datastore.Audit Datastore.AllocateSpace Pool.Audit SDN.Use"
Configuration changegrant the role on the pool, and only the storages the tenant may use
POOL="tenant-blue"
TENANT_STORAGE="blue-rbd"

pveum acl modify "/pool/$POOL" --groups "$POOL-admins" --roles TenantSelfService
pveum acl modify "/storage/$TENANT_STORAGE" --groups "$POOL-admins" --roles TenantSelfService

pveum acl list
Configuration changeput resources into the pool
POOL="tenant-blue"

pveum pool modify "$POOL" --vms 141,142,205 --storage blue-rbd

pveum pool list --poolid "$POOL"
Read-only / Safe
$ pveum pool list --poolid tenant-blue
┌──────────┬───────┬─────────┬──────────┬─────────┐
│ type     │ vmid  │ node    │ storage  │ status  │
╞══════════╪═══════╪═════════╪══════════╪═════════╡
│ qemu     │   141 │ pve-a2  │          │ running │
│ qemu     │   142 │ pve-a1  │          │ running │
│ lxc      │   205 │ pve-a3  │          │ running │
│ storage  │       │ pve-a1  │ blue-rbd │         │
└──────────┴───────┴─────────┴──────────┴─────────┘

The allow-move question

pveum pool modify takes --allow-move, defaulting to 0. It governs whether a resource already belonging to another pool may be moved into this one by the same call.

Leaving it at the default is the safer choice and it is worth understanding why. A guest silently changing pools changes which ACLs apply to it. With --allow-move enabled and a scripted pool assignment, a mistake in a VMID list does not error — it moves somebody else’s guest into your tenant’s pool, and with it, access.

Enable it deliberately, for a specific reorganisation, and turn it off again.

What pools do not isolate

This is the section to read to a stakeholder before agreeing to a multi-tenant design. A pool is an authorisation boundary. It is not any of the following.

Not isolatedWhat actually happensWhere the real control lives
CPUTenant A’s guests compete with tenant B’s for host coresPer-guest cores, cpulimit and cpuunits; node placement (Part XVII)
MemoryOvercommit and ballooning are node-wide; one tenant’s pressure is everyone’sPer-guest memory, no overcommit for shared clusters, node separation
Storage capacityA shared storage is filled by whoever gets there firstSeparate storages per tenant, monitored per storage
Storage IOPSA noisy tenant degrades the shared backendPer-disk mbps/iops limits, separate backends
NetworkGuests on the same bridge/VLAN can reach each other regardless of poolSDN zones and firewall — the next lesson
The nodeA tenant with Sys.Console or node-level access sees everything on that nodeDo not grant node-level privileges to tenants
Cluster visibility/cluster/resources filtered by permission still reveals node names and structureAccept it, or use separate clusters
BackupsA cluster backup job is cluster configuration, not tenant configurationPer-pool backup jobs exist as a job selection mode; retention is still yours
The blast radiusA pmxcfs, quorum or upgrade event hits every tenant at onceSeparate clusters — Part XXVII lesson 1

Choosing the boundary for a tenant

Tenant looks likeRight boundaryBecause
A team inside your organisation, cooperative, shared change windowPool + SDN zone on a shared clusterCheapest to run; one upgrade, one backup regime, one on-call
A team that needs guaranteed capacityPool + dedicated storage, and node placement or HA groups for computeCapacity is enforceable at the storage layer; compute is enforceable by placement
A customer with a contract, a change freeze, or a compliance boundarySeparate clusterThe upgrade unit and the blast radius are contractual, and neither is delegable inside a cluster
Tenants who must not be able to reach each other’s control plane at allSeparate clusterA cluster’s nodes trust each other; there is no partial trust
A cost centre or a projectTags, not poolsPools are exclusive; a guest has one tenant but many attributes

Key takeaways

  • A pool is a membership list of guests and storages plus an ACL path /pool/<name>. Permissions set there are inherited by all members.
  • Proxmox VE does not support per-pool resource limits or quotas. Pools are exclusively a permission grouping mechanism. Any quota you have promised is enforced outside PVE or by dedicated storage.
  • Build the tenant role explicitly rather than reusing PVEVMAdmin, and grant it on /pool/<name> plus only the storages the tenant may consume.
  • pveum pool modify --vms --storage manages membership; --delete removes the listed members; --allow-move (default 0) should stay off except during a deliberate reorganisation.
  • A guest belongs to at most one pool. Use tags — with registered-tags and user-tag-access in datacenter.cfg — for cost centre, environment and application.
  • Pools do not isolate CPU, memory, storage capacity, IOPS, network reachability, node access or blast radius. Each of those has a different control, and two of them only have one: separate storage, and separate clusters.
  • Choose pool plus SDN zone for cooperative internal teams; pool plus dedicated storage where capacity is promised; a separate cluster where the contract, the change freeze or the trust boundary is real.

Knowledge check

Knowledge check · 5 questions

  1. Q1. A customer is sold a "2 TB" tier and the implementation puts their guests in a resource pool on a shared Ceph storage. What is wrong?

  2. Q2. Two tenants share one cluster, each with their own pool. Which of these does the pool boundary genuinely NOT isolate? Select all that apply.

  3. Q3. Why is --allow-move on pveum pool modify left at its default of 0 in most estates?

  4. Q4. A guest can belong to several pools at once, which makes pools a good mechanism for tracking cost centre and environment alongside tenancy.

  5. Q5. A prospective tenant has a contractual change freeze during their financial year end and a compliance requirement that no other customer administrator can reach their control plane. Pool, or separate cluster?

Passing score: 75%. Answers are checked in this browser.