Skip to main content
RunBook Academy

CephLXXXIV · Proxmox Failure ScenariosProxmox Failure Scenarios

Coordinating Proxmox and Ceph maintenance

Advanced⏱ ~17 mincephha-managerqm

What you'll learn

  • Plan maintenance touching both layers
  • Order operations to avoid compounding
  • Verify readiness at each step
  • Handle the case where maintenance overruns

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

Work touching both layers has an ordering that matters, and the failure modes of getting it wrong are self-inflicted incidents during planned work.

The ordering rules

1. Never begin from anything other than HEALTH_OK
2. Move compute off before touching storage on a node
3. One node at a time
4. Wait for health between nodes, not just between steps
5. Return compute only after storage is healthy
6. Have a stop condition and use it

Rule 4 is the one most often skipped: proceeding to the next node when the previous one’s OSDs are still catching up compounds the reduction.

A worked sequence

# readiness
ceph -s | grep -E 'health|pgs:'
pvecm status
ha-manager status
# per node
NODE=pve-02

# 1. compute off
for v in $(qm list | awk 'NR>1 && $3=="running" {print $1}'); do
  qm migrate "$v" pve-03 --online
done

# 2. verify empty
qm list | awk 'NR>1 && $3=="running"' | wc -l

# 3. storage into maintenance
ceph orch host maintenance enter "$NODE"

# 4. do the work

# 5. storage back
ceph orch host maintenance exit "$NODE"

# 6. wait for health — not just for the daemons to start
while ! ceph health | grep -q HEALTH_OK; do sleep 30; done

# 7. compute back

Verifying readiness at each step

StepVerification
Before startingHEALTH_OK, all PGs active+clean
After migrating VMsno running VMs on the node
After maintenance enterthe node’s OSDs are down and flagged
After maintenance exitOSDs up, and health returns
Before the next nodeHEALTH_OK again
# a guard that prevents proceeding early
ceph health | grep -q HEALTH_OK || { echo "NOT READY"; exit 1; }

Scripting the guard is what makes the rule effective rather than aspirational.

When maintenance overruns

Planned: 30 minutes. Actual: approaching 2 hours.
  the OSDs have been down long enough to be marked out
  recovery has started and is moving that node's data
  returning the node now means backfilling it back
# check what happened
ceph -s | grep -E 'misplaced|degraded'
ceph osd tree | grep -A3 pve-02
SituationAction
Recovery has not startedcomplete the work; nothing changed
Recovery has started, partially completelet it finish, then return the node
Recovery completereturn the node; expect a backfill back
Work cannot completedrain the node properly rather than leaving it

The mistake is returning a node mid-recovery, which produces movement in both directions simultaneously.

Quiz

Knowledge check · 4 questions

  1. Q1. Why should maintenance wait for HEALTH_OK between nodes rather than just for daemons to start?

  2. Q2. Returning a node mid-recovery is the fastest way to resolve an overrun maintenance window.

  3. Q3. Handle an overrunning maintenance window.

    A planned 30-minute node maintenance has reached 90 minutes. The OSDs have been marked out and recovery is roughly 40% complete. The hardware work is nearly finished.

  4. Q4. What are the six ordering rules for maintenance touching both layers?

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

Production discipline

Script the HEALTH_OK guard between nodes rather than relying on judgement — proceeding while the previous node’s OSDs are still catching up compounds the reduction. If a window overruns past the down-out interval, let the recovery finish before returning the node; a partial reversal moves far more data.

Cross-course references

  • Kubernetes: rolling updates wait for readiness between nodes for the same reason
  • Linux: sequential maintenance on redundant systems always requires a health gate