CephXCIX · Upgrade PlanningUpgrade Planning
Building a test cluster that predicts production
What you'll learn
- Identify what a test cluster must match
- Identify what may differ
- Run a representative upgrade test
- Interpret what the test does and does not prove
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
Why this matters in production
There is no upgrade rollback, so the test cluster is the only place a problem can be discovered cheaply — but only if it resembles production in the ways that matter.
What must match
| Attribute | Why |
|---|---|
| Current Ceph version | the upgrade path is the thing being tested |
| Deployment method | cephadm and Rook upgrade differently |
| Enabled mgr modules | modules are a common source of upgrade failures |
| Pool types and EC profiles | EC and replicated behave differently |
| Service types deployed | RGW, CephFS, and RBD each have their own path |
| Client versions in use | compatibility is version-specific |
| OS and container runtime | the host environment affects daemon startup |
# capture what production runs, to replicate
ceph versions
ceph mgr module ls --format json | python3 -c '
import sys,json; print(json.load(sys.stdin)["enabled_modules"])'
ceph osd pool ls detail | grep -E '^pool'
ceph orch ls
ceph features
What may differ
| Attribute | Safe to differ |
|---|---|
| Cluster size | yes — three hosts can test what thirty will do |
| Disk capacity | yes |
| Disk type | mostly; the upgrade is not I/O bound |
| Data volume | yes, with one caveat below |
| Network speed | yes |
| CRUSH topology depth | mostly |
The caveat: an upgrade on an empty cluster does not exercise PG peering
and recovery on daemon restart. A small but non-zero data set is worth
having.
# put some data in the test cluster
rados bench -p testpool 60 write --no-cleanup
Running a representative test
# 1. bring the test cluster to production's version
TARGET=19.2.1
ceph version
# 2. replicate the production config that matters
ceph config dump # compare against the production capture
# 3. apply representative load during the upgrade
fio --name=load --ioengine=rbd --pool=testpool --rbdname=testimg \
--rw=randrw --bs=4k --iodepth=32 --numjobs=2 --time_based \
--runtime=3600 --direct=1 &
# 4. run the upgrade
ceph orch upgrade start --ceph-version ${TARGET}
# 5. observe
watch -n 30 'ceph orch upgrade status; ceph -s | head -20'
Running load during the upgrade is what distinguishes a test from a
demonstration. An upgrade on an idle cluster proves the daemons restart;
an upgrade under load proves clients survive it.
What the test proves and does not
| Proves | Does not prove |
|---|---|
| The upgrade path completes | it completes at production scale |
| The daemons start on the new version | production’s specific hardware works |
| Enabled modules survive | production’s data volume backfills in time |
| Clients keep working under load | production’s client mix keeps working |
| The procedure and its timings | the wall-clock duration at production size |
Duration is the attribute that scales: a three-host test says nothing
about how long thirty hosts take. Estimate from the daemon count.
Quiz
Knowledge check · 4 questions
Q1. What matters more in a test cluster than matching production hardware?
Q2. Running even a modest fio job against an RBD image during a test upgrade is what turns the exercise into evidence.
Q3. Design a test cluster for an upgrade.
A production cluster has 30 hosts, 300 OSDs, RBD and CephFS, and several mgr modules enabled. Budget allows three test hosts.
Q4. Why should a test cluster hold some data rather than being empty?
Passing score: 75%. Answers are checked in this browser.
Production discipline
Match the test cluster’s configuration — Ceph version, deployment method, enabled mgr modules, pool types, service types — rather than its hardware, and run client load throughout the test upgrade. Estimate production duration from daemon count; the test’s wall clock does not scale.
Cross-course references
- Kubernetes: staging clusters predict upgrades only when the addon set matches
- Linux: a test that does not exercise the workload proves only that services start