How to remove a host from a Ceph cluster

Retiring a Ceph host removes it from cephadm scheduling, daemon placement, and the cluster host inventory after data and services have moved elsewhere. A storage node should leave the cluster only after OSD data evacuation and daemon drain checks finish, because forced removal can discard data that was still assigned to that host.

Cephadm handles normal host decommissioning through ceph orch host drain and ceph orch host rm. Draining applies special labels that prevent new daemon placement, schedules all OSD daemons on the host for removal, and waits for managed daemons to disappear before the host record is removed.

Use an administration host with a working cluster config, a keyring with orchestrator permissions, and enough remaining capacity to absorb the host's data. Replace ceph-node2 with the host being retired, and avoid offline force removal while the host can still be drained because that mode force-purges OSD records for unrecoverable hosts.

Steps to remove a host from a cephadm-managed Ceph cluster:

  1. Check cluster health before changing host placement.
    $ ceph -s
      cluster:
        id:     11111111-2222-3333-4444-555555555555
        health: HEALTH_OK
    
      services:
        mon: 3 daemons, quorum ceph-admin,ceph-node1,ceph-node3 (age 2h)
        mgr: ceph-admin.abc123(active, since 2h)
        osd: 6 osds: 6 up, 6 in
    
      data:
        pools:   4 pools, 256 pgs
        objects: 3.42M objects, 8.1 TiB
        usage:   24 TiB used, 76 TiB / 100 TiB avail
        pgs:     256 active+clean

    Start with a named health state so the drain is not hiding an unrelated recovery or placement-group issue.
    Related: How to check Ceph cluster health

  2. List the daemons currently assigned to the retiring host.
    $ ceph orch ps --hostname ceph-node2 --refresh
    NAME     HOST        PORTS  STATUS   REFRESHED  AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID
    osd.12   ceph-node2         running  5s ago     30d     2.0G        -  20.2.0   1a2b3c4d5e6f  aa11bb22cc33
    osd.13   ceph-node2         running  5s ago     30d     2.1G        -  20.2.0   1a2b3c4d5e6f  bb22cc33dd44

    --refresh asks cephadm to update cached daemon state before printing the table.

  3. Drain the host through cephadm.
    $ ceph orch host drain ceph-node2

    ceph orch host drain applies _no_schedule and _no_conf_keyring and schedules OSD removal for the host. Add --zap-osd-devices only when the disks should be wiped as part of decommissioning.

  4. Monitor any OSD removals started by the drain.
    $ ceph orch osd rm status
    OSD_ID  HOST        STATE                    PG_COUNT  REPLACE  FORCE  STARTED_AT
    12      ceph-node2  draining                 64        False    False  2026-06-29 08:20:31.123456
    13      ceph-node2  done, waiting for purge  0         False    False  2026-06-29 08:20:31.123456

    Wait for the retiring host's OSD rows to finish before removing the host. If an OSD is not safe to destroy, stop and complete the dedicated OSD removal path first.
    Related: How to safely remove a Ceph OSD

  5. Confirm that no managed daemons remain on the host.
    $ ceph orch ps --hostname ceph-node2 --refresh --format json
    []

    An empty list means cephadm no longer reports daemons assigned to ceph-node2.

  6. Remove the host and its CRUSH host bucket.
    $ ceph orch host rm ceph-node2 --rm-crush-entry

    Use ceph orch host rm ceph-node2 --offline --force only when the host cannot be recovered. Offline removal can force-purge OSD records and service specs that still name the host must be updated manually.

  7. Verify that the host no longer appears in the cephadm host inventory.
    $ ceph orch host ls
    HOST        ADDR          LABELS  STATUS
    ceph-admin  192.0.2.10    _admin
    ceph-node1  192.0.2.11
    ceph-node3  192.0.2.13
  8. Confirm that the retired host bucket is absent from the CRUSH tree.
    $ ceph osd tree
    ID  CLASS  WEIGHT    TYPE NAME             STATUS  REWEIGHT  PRI-AFF
    -1         24.00000  root default
    -3         12.00000      host ceph-node1
     4    hdd   6.00000          osd.4             up   1.00000  1.00000
     5    hdd   6.00000          osd.5             up   1.00000  1.00000
    -7         12.00000      host ceph-node3
    20    hdd   6.00000          osd.20            up   1.00000  1.00000
    21    hdd   6.00000          osd.21            up   1.00000  1.00000

    The --rm-crush-entry removal fails while OSD entries still belong to that host, so this check also confirms the host bucket cleanup.

  9. Check final cluster health after the removal settles.
    $ ceph -s
      cluster:
        id:     11111111-2222-3333-4444-555555555555
        health: HEALTH_OK
    
      services:
        mon: 3 daemons, quorum ceph-node1,ceph-node3,ceph-admin (age 5m)
        mgr: ceph-admin.abc123(active, since 2h)
        osd: 4 osds: 4 up, 4 in
    
      data:
        pools:   4 pools, 256 pgs
        objects: 3.42M objects, 8.1 TiB
        usage:   24 TiB used, 52 TiB / 76 TiB avail
        pgs:     256 active+clean

    If the cluster reports HEALTH_WARN or HEALTH_ERR after removal, use the named health codes before retiring the hardware.