CephXCI · Adding Storage NodesAdding Storage Nodes
Executing the node addition
What you'll learn
- Execute a node addition end to end
- Verify each step before proceeding
- Handle a failure partway
- Confirm the result
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
The pre-checks establish readiness; the execution is a short sequence where each step is verified before the next.
The sequence
# 1. cluster is ready
ceph -s | grep HEALTH_OK || { echo "not ready"; exit 1; }
# 2. throttles set
ceph config set osd osd_max_backfills 2
ceph config set osd osd_mclock_profile high_client_ops
# 3. hold the movement
ceph osd set norebalance
# 4. add the host
ceph orch host add ceph-07 10.0.2.27 --labels osd
ceph orch host ls | grep ceph-07
# 5. place it in the hierarchy
ceph osd crush move ceph-07 rack=rack4
ceph osd crush tree | grep -A2 rack4
# 6. verify devices
ceph orch device ls ceph-07 --wide
# 7. add the OSDs, all together
ceph orch apply -i osd-spec-ceph-07.yaml
# 8. verify they are up and in with the right class
ceph osd tree | grep -A15 ceph-07
# 9. release the movement
ceph osd unset norebalance
# 10. monitor
watch -n 60 'ceph -s | grep -E "misplaced|health"'
Verification at each step
| Step | Verify |
|---|---|
| Host added | appears in ceph orch host ls and is reachable |
| Host placed | appears under the correct bucket in ceph osd crush tree |
| Devices | listed as available with no reject reasons |
| OSDs created | up and in, correct device class, correct host |
| Movement released | misplaced count begins falling |
ID=12
ceph osd tree | awk '/ceph-07/,/^host|^rack/' | head -20
ceph osd crush get-device-class osd.${ID}
Handling a failure partway
| Failure | Recovery |
|---|---|
| Host will not add | SSH key or connectivity; nothing committed |
| Host adds but shows offline | check cephadm check-host from the cluster |
| Devices not available | zap them, or resolve the reject reason |
| OSD creation fails | remove any partial OSD, resolve, retry |
| OSD comes up with the wrong class | correct with crush set-device-class |
| Movement does not start | check flags, check norebalance was cleared |
# a partially created OSD
# ID is the numeric OSD id from `ceph osd tree`; substitute your own:
ID=12
ceph orch osd rm "$ID" --force
ceph orch device zap ceph-07 /dev/sdX --force
With norebalance set throughout, nothing has committed data and any step
can be undone.
Confirming the result
# capacity increased
ceph df
# the new OSDs are receiving data
ceph osd df | grep -A15 ceph-07
# the spread is narrowing
ceph osd df | awk 'NR>1 {if($17+0>m)m=$17+0; if(mn==""||$17+0<mn)mn=$17+0}
END {printf "spread %.1f\n", m-mn}'
# and the cluster returns to health
ceph -s
# restore the throttles when complete
ceph config set osd osd_max_backfills 1
ceph config set osd osd_mclock_profile balanced
Quiz
Knowledge check · 4 questions
Q1. Why hold `norebalance` throughout a node addition?
Q2. Changing an OSD device class moves data, because the class is what decides which CRUSH rules select that OSD.
Q3. Execute a node addition.
All pre-checks have passed for a new node with twelve HDDs. The cluster is healthy and the maintenance window is open.
Q4. What should be verified about newly created OSDs before releasing the movement?
Passing score: 75%. Answers are checked in this browser.
Production discipline
Hold norebalance from before the host is added until every OSD is
verified — device class, CRUSH position, and count are all correctable at
no cost while nothing has moved. Clearing the flag is the single
irreversible step and belongs last.
Cross-course references
- Kubernetes: cordoning a new node until it is verified follows the same pattern
- Linux: staging a change and committing once verified is standard practice