CephXCIX · Upgrade PlanningUpgrade Planning
Planning and communicating the upgrade window
What you'll learn
- Estimate the upgrade duration
- Define abort and go criteria
- Communicate accurately to stakeholders
- Staff the window appropriately
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
An upgrade window that runs long without a plan for that turns a routine operation into an incident.
Estimating duration
cephadm upgrades daemons serially, waiting for health between each.
Duration ≈ daemon count × (restart time + health settle time)
ceph orch ps --format json | python3 -c '
import sys,json,collections
c = collections.Counter(d["daemon_type"] for d in json.load(sys.stdin))
total = sum(c.values())
for k, v in sorted(c.items()): print("%-8s %3d" % (k, v))
print("total %3d" % total)
print()
for per in (60, 120, 180):
print("at %3ds/daemon: %5.1f hours" % (per, total*per/3600))'
| Daemon | Typical per-daemon time |
|---|---|
| mgr | fast; a failover occurs |
| mon | moderate; quorum re-forms |
| osd | the bulk; restart plus peering plus health settle |
| mds | moderate; rank reassignment |
| rgw | fast |
The OSD count dominates. A 300-OSD cluster at two minutes per OSD is
ten hours before anything goes wrong.
Go and abort criteria
Go criteria, checked immediately before starting:
every pre-upgrade check passes
the window duration exceeds the estimate with margin
staffing covers the whole window
the test cluster upgrade succeeded
Abort criteria, agreed before starting:
what conditions stop the upgrade
who decides
what "stop" means, given there is no rollback
| Condition | Action |
|---|---|
| A daemon fails on the new version | pause, investigate, decide |
| Data unavailability | pause immediately, escalate |
| Health gate stalling repeatedly | pause, resolve the underlying condition |
| The window is expiring, upgrade partway | continue — mixed-version is worse than finishing |
| A regression affecting performance | continue, address afterwards |
Note that most conditions do not abort. Because there is no rollback,
"abort" mostly means "pause and investigate", and continuing is usually
the right resolution.
Communicating
What stakeholders need:
the window, with an honest estimate and a stated margin
what they will experience — brief latency variation, not an outage
what would change that
who to contact
how they will know it is done
| Framing | Accuracy |
|---|---|
| “Storage will be unavailable” | wrong for a healthy cluster |
| “Brief latency variation as daemons restart” | accurate |
| “No impact expected” | overpromises |
| “We will notify when complete” | necessary |
Overpromising is the failure mode. An upgrade on a healthy cluster is
usually transparent, and saying so without the caveat makes the
exception look like a broken promise.
Staffing
For the whole window:
someone watching the upgrade
someone reachable who can decide
the runbook and the baseline capture accessible
a channel where progress is posted
Quiz
Knowledge check · 4 questions
Q1. What dominates the duration estimate for a Ceph upgrade?
Q2. Standard abort criteria for a Ceph upgrade mean reverting to the previous version.
Q3. Plan and communicate an upgrade window.
A 240-OSD cluster needs an upgrade. Stakeholders ask how long it will take and what they will experience.
Q4. Why is "no impact expected" a poor way to communicate an upgrade window?
Passing score: 75%. Answers are checked in this browser.
Production discipline
Size the window from the OSD count at a conservative per-daemon time, then add margin — an upgrade running past its stated window is what turns a routine operation into an escalation. Communicate brief latency variation rather than either an outage or no impact.
Cross-course references
- Kubernetes: node-by-node upgrades scale with node count the same way
- Linux: honest maintenance-window communication survives the exception