Skip to main content
RunBook Academy

CephXCI · Adding Storage NodesAdding Storage Nodes

Pre-check: failure domain placement

Intermediate⏱ ~16 minceph

What you'll learn

  • Determine the node's physical failure domain
  • Verify the hierarchy can express it
  • Plan the CRUSH placement before adding
  • Recognise when the topology needs extending

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 node’s CRUSH placement determines what failures it shares with other nodes, and correcting it after the OSDs hold data costs a full rebalance.

Establishing the physical position

Questions to answer before adding:
  which rack is it in?
  which power feed?
  which top-of-rack switch?
  which room or row, if the hierarchy has those levels?

The answers must come from the physical installation, not from an assumption about where it was supposed to go.

# what the hierarchy currently expresses
ceph osd tree
ceph osd crush tree

Verifying the hierarchy can express it

ceph osd crush tree --format json | python3 -c '
import sys, json
def walk(n, d=0):
    print("  "*d + n["type"] + " " + n["name"])
    for c in n.get("children", []):
        if isinstance(c, dict): walk(c, d+1)
for r in json.load(sys.stdin)["nodes"][:1]: walk(r)'
SituationAction
The rack exists in the hierarchymove the host into it
The rack does not existcreate the bucket first
The hierarchy has no rack leveldecide whether to introduce one
The node is in a new room or rowextend the hierarchy
# creating a bucket that does not exist
ceph osd crush add-bucket rack4 rack
ceph osd crush move rack4 root=default

Planning the placement

# the intended position, verified before the host exists
ceph osd crush tree | grep -A5 rack4
The plan states:
  hostname → bucket → parent bucket → root
  ceph-07 → rack4 → default

Writing it down before adding means the move is a single known command rather than a decision made after the host appears in the wrong place.

When the topology needs extending

Adding the fourth rack to a three-rack cluster:
  the failure domain may now support a wider rule
  size=3 across 4 racks tolerates a rack failure with a spare
  or size=4 becomes possible
# Substitute your own value before running:
POOL=rbd-vms

ceph osd tree | grep -c 'rack '
ceph osd pool get "$POOL" size
ceph osd pool get "$POOL" crush_rule

Extending the topology is an opportunity to reconsider the rules, and doing so before the new capacity holds data avoids moving it twice.

Quiz

Knowledge check · 4 questions

  1. Q1. Why must a node's physical position be confirmed rather than assumed from the plan?

  2. Q2. Extending the CRUSH hierarchy is best done after the new node's OSDs are populated.

  3. Q3. Plan CRUSH placement for a new node.

    A fourth rack is being added to a three-rack cluster with a rack-level failure domain and size=3. A new node will be installed there.

  4. Q4. What should the placement plan state before a node is added?

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

Production discipline

Confirm the node’s rack physically rather than from the plan — a hierarchy describing a layout that does not exist passes every check and fails only when that rack loses power. Extend the hierarchy and reconsider the rules while the new capacity is empty; both changes then share one rebalance.

Cross-course references

  • Kubernetes: zone labels assumed rather than verified produce the same silent misplacement
  • Linux: topology descriptions must be confirmed against the physical installation