Skip to main content
RunBook Academy

CephLI · Host PreparationHost Preparation

The container runtime under cephadm

Advanced⏱ ~17 minpodmansystemctl

What you'll learn

  • Verify the container runtime meets cephadm's needs
  • Explain how cephadm runs daemons as containers
  • Diagnose container-level failures
  • Manage images and registry access

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

Ceph daemons are containers managed by systemd units cephadm generates. When a daemon will not start, the cause is as likely to be in the runtime or the image as in Ceph — and the diagnostics are different.

Requirements

podman version
podman info | grep -E 'graphDriver|runRoot|graphRoot'
systemctl status podman.socket

Check the Ceph release’s documented minimum podman version. Storage driver matters less than having adequate space in the graph root — images are several gigabytes and every daemon on the host shares them.

df -h /var/lib/containers

How daemons run

# Cluster FSID from `ceph fsid`; substitute your own:
FSID=3e0b2c14-9f3a-4d21-8a77-1c9f0e2b5d64

systemctl list-units 'ceph-*'
systemctl cat "ceph-$FSID@osd.12.service"

Each daemon is a systemd unit that runs a container with the host’s network namespace, the daemon’s data directory bind-mounted, and the appropriate device access.

# Cluster FSID from `ceph fsid`; substitute your own:
FSID=3e0b2c14-9f3a-4d21-8a77-1c9f0e2b5d64

ls "/var/lib/ceph/$FSID/osd.12/"
podman ps --filter name=ceph
podman logs "ceph-$FSID-osd-12"

The daemon’s persistent state — keyring, configuration, and for OSDs the device mapping — lives on the host, not in the container. That is what makes a container replacement transparent.

Diagnosing failures

# Cluster FSID from `ceph fsid`; substitute your own:
FSID=3e0b2c14-9f3a-4d21-8a77-1c9f0e2b5d64

# systemd's view
systemctl status "ceph-$FSID@osd.12.service"
journalctl -u "ceph-$FSID@osd.12.service" --since '30 min ago'

# the container's own output
podman logs --tail 100 "ceph-$FSID-osd-12"

# cephadm's view
ceph orch ps --daemon-type osd
ceph log last cephadm
SymptomLikely cause
Unit fails immediatelyimage missing or pull failed
Container starts and exitsdaemon-level error — read podman logs
Unit not foundorchestrator has not deployed it
Image pull failsregistry unreachable or credentials
Permission denied on devicesSELinux, or device access in the unit

Images and registries

ceph config get mgr container_image
podman images | grep ceph
ceph orch upgrade start --image quay.io/ceph/ceph:v19.2.1

For air-gapped environments, mirror the images locally:

ceph config set mgr mgr/cephadm/container_image_base registry.internal/ceph/ceph
ceph config set global container_image registry.internal/ceph/ceph:v19.2.1

Every host must be able to pull, so a host with a registry access problem fails to deploy daemons while everything else works.

Cleaning up

podman image prune -a
podman system df

Old images accumulate after upgrades and consume the graph root. A full graph root prevents new daemons starting, which presents as a deployment failure rather than a disk-space one.

Quiz

Knowledge check · 4 questions

  1. Q1. New daemons fail to deploy on one host while existing daemons run normally. What should you check?

  2. Q2. A Ceph daemon's keyring and configuration live inside its container.

  3. Q3. Diagnose a daemon that will not start after an upgrade.

    Following a Ceph upgrade, one OSD on one host will not start. `ceph orch ps` shows it in error state. Other OSDs on the same host upgraded successfully.

  4. Q4. Why does cephadm bind-mount a per-daemon directory from the host?

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

Production discipline

Monitor /var/lib/containers as a distinct filesystem and prune images after upgrades; a full graph root blocks daemon deployment and is reported as a deployment failure with no mention of disk space. Read podman logs for daemon-level errors — the orchestrator and systemd both summarise them away.

Cross-course references

  • Kubernetes: node disk pressure from image accumulation causes the same deployment failures
  • Linux: container runtime storage management is ordinary host administration with real consequences here