Skip to main content
RunBook Academy

CephXCI · Adding Storage NodesAdding Storage Nodes

Executing the node addition

Intermediate⏱ ~17 mincephcephadm

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

Not yet marked complete on this device.

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

StepVerify
Host addedappears in ceph orch host ls and is reachable
Host placedappears under the correct bucket in ceph osd crush tree
Deviceslisted as available with no reject reasons
OSDs createdup and in, correct device class, correct host
Movement releasedmisplaced 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

FailureRecovery
Host will not addSSH key or connectivity; nothing committed
Host adds but shows offlinecheck cephadm check-host from the cluster
Devices not availablezap them, or resolve the reject reason
OSD creation failsremove any partial OSD, resolve, retry
OSD comes up with the wrong classcorrect with crush set-device-class
Movement does not startcheck 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

  1. Q1. Why hold `norebalance` throughout a node addition?

  2. Q2. Changing an OSD device class moves data, because the class is what decides which CRUSH rules select that OSD.

  3. 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.

  4. 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