CephLIII · Cluster HealthCluster Health
What HEALTH_OK does not tell you
What you'll learn
- Enumerate what HEALTH_OK does not cover
- Identify risks invisible to health checks
- Build monitoring that covers the gaps
- Verify cluster health beyond the health output
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
Why this matters in production
HEALTH_OK means no check is firing. Every serious cluster problem passes
through a period where nothing is firing yet, and several important risks
never fire a check at all.
What it does not cover
| Risk | Why no check fires |
|---|---|
| Capacity filling steadily | no check until nearfull |
| Latency degrading | no health check measures latency |
| One OSD an order of magnitude slower | performance is not a health check |
A pool with min_size 1 | configuration is not evaluated |
| A CRUSH rule that does not match the physical topology | Ceph cannot know the topology |
| Only three hosts for a size-3 pool | placement is satisfied |
| No off-cluster backups | outside Ceph’s knowledge |
| A bond running on one member | below Ceph’s layer |
| Monitors all in one rack | Ceph does not model racks it was not told about |
Every row is a real risk and none produces a warning.
The gaps that matter most
Capacity trajectory. HEALTH_OK at 78% full and rising 2% a week is
three weeks from a warning and five from an incident.
ceph df
ceph osd df | awk '{print $17}' | sort -n | tail -3
Latency outliers. An OSD at ten times the median makes the cluster feel broken and fires no check.
ceph osd perf | sort -k2 -n | tail -5
Configuration risk.
ceph osd pool ls detail | grep -E 'min_size 1|size 2'
ceph osd crush rule dump | jq -r '.[] | "\(.rule_name) \(.steps[1].type // "?")"'
ceph osd tree | grep -c host
Redundancy that has never been tested. A cluster that has never lost a host does not know whether it survives losing one.
Building the gap coverage
# capacity trajectory — record and trend
ceph df --format json | jq -r '.stats.total_used_raw_ratio'
# latency distribution
ceph osd perf --format json | \
jq -r '.osdstats.osd_perf_infos[] | "\(.id) \(.perf_stats.commit_latency_ms)"'
# configuration audit
ceph osd pool ls detail
ceph config dump | grep -v '^WHO'
ceph auth ls | grep -B2 'allow \*'
These belong on a schedule, not in the health output — Ceph does not consider them health questions and it is right not to.
Quiz
Knowledge check · 4 questions
Q1. A cluster reports HEALTH_OK at 82% capacity with one OSD at ten times the median latency. Why is nothing firing?
Q2. A pool configured with min_size 1 is a deliberate and correct choice for some workloads.
Q3. Build monitoring that covers what health checks do not.
A cluster has reported HEALTH_OK continuously for six months. A capacity review finds it at 84% and rising, with one OSD at fifteen times the median latency and two pools configured with size 2.
Q4. Why is the absence of configuration warnings in Ceph intentional rather than a gap?
Passing score: 75%. Answers are checked in this browser.
Production discipline
Treat HEALTH_OK as one input rather than as an answer; capacity
trajectory, latency distribution, and configuration risk are all invisible
to it and all real. Schedule the configuration audit rather than relying on
periodic reviews, since the conditions it covers do not announce
themselves.
Cross-course references
- Kubernetes: all pods Running says nothing about resource headroom or configuration risk
- Linux: a green status page and a healthy system are related but distinct claims