Skip to main content
RunBook Academy

CephLXXXIII · Dedicated Ceph ClusterDedicated Ceph Cluster

Serving multiple consumers from one cluster

Advanced⏱ ~18 minceph

What you'll learn

  • Isolate consumers appropriately
  • Attribute usage and load per consumer
  • Prevent one consumer affecting another
  • Onboard a new consumer safely

Prerequisites

None — start here.

Verified against Ceph Tentacle 20.2.x · Ceph Squid 19.2.x (supported previous) · cephadm matches the verified Ceph release · podman 4.x · csi-rbd and csi-cephfs current · RBD / CephFS / RGW current (matches Ceph release) · Linux kernel 5.15+ (5.10 minimum) · Ubuntu 24.04 LTS (Ceph host baseline) · Debian 12 (Bookworm) (Ceph host baseline) · Rocky Linux / RHEL / AlmaLinux 9.x (Ceph host baseline) · Proxmox VE 9.x (cross-course integration) · Kubernetes 1.31+ (cross-course integration) · 2026-08-18

Not yet marked complete on this device.

Why this matters in production

One cluster serving several teams is efficient and creates the possibility of one consumer harming another. The isolation mechanisms are specific.

The isolation layers

LayerMechanismIsolation provided
Authenticationseparate cephx usersaccess control
Authorisationper-pool capabilitiesa consumer sees only their pools
Capacityper-pool quotasone cannot consume the cluster
NamespaceRBD namespaces, CephFS subvolumeswithin a shared pool
Performanceseparate device classes or CRUSH rootsgenuine isolation
RateRBD QoS limitsbounds a noisy consumer
# a consumer's user, scoped to their pools
ceph auth get-or-create client.team-a \
  mon 'profile rbd' \
  osd 'profile rbd pool=team-a-vms' \
  mgr 'profile rbd pool=team-a-vms'

The capability restricts the user to that pool; a key scoped correctly cannot read or write another team’s data.

Capacity attribution and limits

ceph osd pool set-quota team-a-vms max_bytes 50T
ceph osd pool get-quota team-a-vms
ceph df detail
# per-consumer usage, for chargeback or reporting
sum by (name) (ceph_pool_stored)
  * on(pool_id) group_left(name) ceph_pool_metadata

Quotas do two things: they prevent one consumer consuming the cluster, and they make the consumer’s own limit visible to them rather than the cluster’s.

Performance isolation

# separate device classes give genuine isolation
ceph osd crush rule create-replicated team-a-rule default host nvme
ceph osd pool set team-a-vms crush_rule team-a-rule
# rate limiting bounds a noisy consumer without separate hardware
rbd config pool set team-b-vms rbd_qos_iops_limit 20000
rbd config pool set team-b-vms rbd_qos_bps_limit 2147483648

Only separate devices provide a guarantee; rate limiting is best-effort and depends on clients honouring it.

Onboarding a consumer

1. capacity requirement gathered and checked against available
2. pool created with an appropriate CRUSH rule and durability policy
3. quota set to the stated requirement plus margin
4. cephx user created, scoped to that pool
5. rate limits applied if the pool shares devices
6. monitoring and alerting configured, routed to the consumer
7. service commitments stated
8. consumer-facing dashboard created
9. the consumer connects and verifies
# the mechanical part
ceph osd pool create team-c-vms 128 128 replicated team-c-rule
ceph osd pool application enable team-c-vms rbd
rbd pool init team-c-vms
ceph osd pool set-quota team-c-vms max_bytes 30T
ceph auth get-or-create client.team-c \
  mon 'profile rbd' osd 'profile rbd pool=team-c-vms' mgr 'profile rbd pool=team-c-vms'

Preventing cross-consumer harm

RiskMitigation
One consumer fills the clusterquotas on every pool
One consumer saturates I/Orate limits, or separate device classes
One consumer’s recovery affects othersrecovery throttles, priority per pool
A consumer accessing another’s datascoped cephx capabilities
A consumer’s misconfigurationthey cannot change cluster settings
# verify a consumer's key cannot exceed its scope
ceph auth get client.team-a

Quiz

Knowledge check · 4 questions

  1. Q1. Why does a per-pool quota change what a consumer sees as available capacity?

  2. Q2. RBD QoS rate limits provide a guarantee of performance isolation between consumers.

  3. Q3. Onboard a second consumer onto a single-consumer cluster.

    A dedicated Ceph cluster has served one Proxmox environment for two years with no quota on its pool. A second team is being onboarded.

  4. Q4. Which isolation mechanisms provide a guarantee and which are best-effort?

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

Production discipline

Set a quota on every consumer pool including the first — the unquotaed pool consumes whatever the others leave, and it is usually the oldest and largest. Give any consumer with a latency commitment its own device class; rate limits shape behaviour but do not guarantee it.

Cross-course references

  • Kubernetes: namespace quotas and network policies serve the same multi-tenant role
  • Linux: shared services need per-consumer limits from the first consumer onward