Running Rook-Ceph in your Kubernetes cluster gives you cloud-native, self-healing block storage, object storage, and shared filesystems — without depending on a managed cloud provider. But Ceph's distributed architecture introduces failure modes that kubectl get pods simply cannot surface: degraded OSDs, split-brain monitors, placement group inconsistencies, and RADOS gateway outages that silently corrupt writes.
In this tutorial you'll set up external uptime monitoring for your Rook-Ceph storage cluster using Vigilmon — catching failures at the HTTP and TCP layer before they cascade into data unavailability.
Why Rook-Ceph needs external monitoring
Rook-Ceph exposes a rich set of internal metrics through Prometheus, and the Ceph dashboard gives you a real-time view of cluster health. But internal tooling has a fundamental blind spot: it only works when the control plane is reachable.
External monitoring catches what internal tooling misses:
- Rook operator crashes — the operator pod exits; Kubernetes eventually restarts it, but OSD and MON reconciliation stops for minutes or longer
- Ceph MGR dashboard goes unreachable — the active Manager process restarts mid-failover; the dashboard URL returns 503 while the cluster appears healthy to internal Prometheus
- RADOS Gateway (RGW) outage — object storage API returns 500 for all PUT/GET requests; S3-compatible workloads silently fail
- MON quorum loss — if two of three MON pods crash simultaneously, the cluster enters a read-only state; external checks immediately reflect this, internal tooling hangs
- Ingress to dashboard breaks — a Traefik or Nginx Ingress update breaks routing to the Ceph dashboard; you lose visibility right when you need it
External monitoring from Vigilmon confirms reachability from outside the cluster — the view your applications and users actually have.
What you'll need
- A Kubernetes cluster running Rook-Ceph (v1.12 or later recommended)
- Ceph dashboard accessible via a LoadBalancer or Ingress (port 8443 by default)
- RADOS Gateway (RGW) deployed if you use object storage
- A free Vigilmon account — no credit card required
Step 1: Verify your Rook-Ceph endpoints
Before adding monitors, confirm which endpoints are externally reachable.
Ceph dashboard:
# Find the dashboard service
kubectl get svc -n rook-ceph | grep dashboard
# Example output:
# rook-ceph-mgr-dashboard LoadBalancer 10.96.50.10 203.0.113.10 8443:31443/TCP 3d
Test the dashboard is responding:
curl -k https://203.0.113.10:8443/
# Should return the Ceph dashboard login page HTML
RADOS Gateway (RGW) health endpoint:
kubectl get svc -n rook-ceph | grep rgw
# rook-ceph-rgw-my-store LoadBalancer 10.96.50.20 203.0.113.20 80:32080/TCP 3d
RGW exposes a health check at the root path — a GET / returns a simple XML response:
curl http://203.0.113.20/
# <?xml version="1.0" encoding="UTF-8"?>
# <ListAllMyBucketsResult>...
Rook operator webhook (if exposed):
kubectl get svc -n rook-ceph | grep webhook
Step 2: Monitor the Ceph dashboard with Vigilmon
The Ceph dashboard is the primary health signal for your storage cluster. If it's unreachable, the MGR process has failed or the network path is broken.
- Log in to vigilmon.online and go to Monitors → New Monitor
- Choose HTTP / HTTPS as the type
- Set the URL to your dashboard endpoint, e.g.
https://203.0.113.10:8443/ - If your dashboard uses a self-signed certificate, enable Allow invalid SSL (or install a valid cert via cert-manager)
- Set the check interval to 1 minute
- Under Expected response, set:
- Status code:
200or301(the dashboard redirects unauthenticated requests)
- Status code:
- Save the monitor
Vigilmon will probe the dashboard from multiple geographic regions. A timeout or connection refused immediately triggers an incident — even if all Ceph pods show Running in kubectl.
Step 3: Monitor the RADOS Gateway HTTP API
Object storage failures are often silent at the Kubernetes layer. A pod can be Running while the RGW process inside has crashed or is stuck in a restart loop.
- Go to Monitors → New Monitor
- Choose HTTP / HTTPS
- Set the URL to
http://your-rgw-endpoint/(or the S3-compatible endpoint your apps use) - Set the expected status code to
200or403— RGW returns403 AccessDeniedfor unauthenticated requests to the root path, which confirms the process is alive - Set check interval to 1 minute
- Save the monitor
For a more precise check, create a public bucket and monitor a known object:
# Create a test object using the AWS CLI with your RGW credentials
aws s3 cp /dev/null s3://monitoring-probe/healthcheck \
--endpoint-url http://203.0.113.20
Then monitor http://203.0.113.20/monitoring-probe/healthcheck for a 200 response — this confirms the full read path works.
Step 4: TCP port checks for MON and OSD availability
Ceph monitors listen on TCP port 6789 (v1 protocol) or ports in the 6800–7300 range (msgr2). A TCP check confirms the MON processes are accepting connections even when the HTTP dashboard is temporarily unavailable.
# Find MON service ports
kubectl get svc -n rook-ceph | grep mon
In Vigilmon:
- Go to Monitors → New Monitor
- Choose TCP Port
- Enter the external IP and port of your MON service (or a NodePort if using NodePort services)
- Save the monitor
Repeat for each MON if you want per-MON visibility. At minimum, monitor one MON per availability zone.
Step 5: Monitor the Rook operator health endpoint
The Rook operator (v1.11+) exposes a /healthz HTTP endpoint for liveness probing. If you've exposed this externally, add it to Vigilmon:
kubectl get svc -n rook-ceph | grep operator
If the operator service is not externally exposed, set up a NodePort service:
apiVersion: v1
kind: Service
metadata:
name: rook-ceph-operator-health
namespace: rook-ceph
spec:
type: NodePort
selector:
app: rook-ceph-operator
ports:
- port: 9443
targetPort: 9443
nodePort: 30943
Then monitor http://node-ip:30943/healthz in Vigilmon with expected status 200.
Step 6: Configure storage-cluster alerts
Storage failures require immediate response — a degraded cluster that reaches HEALTH_ERR state can halt all writes to PersistentVolumes across your entire Kubernetes workload.
Email alerts
- In Vigilmon, go to Alert Channels → Add Channel → Email
- Enter your storage on-call address
- Assign the channel to all Rook-Ceph monitors
Webhook alerts for incident escalation
{
"monitor_name": "Rook-Ceph RGW",
"status": "down",
"url": "http://203.0.113.20/",
"started_at": "2024-01-15T10:23:00Z",
"duration_seconds": 60
}
Route this to your on-call rotation via PagerDuty or Opsgenie. For Slack, create a dedicated #storage-alerts channel so storage incidents don't get buried in general notifications.
Correlating Vigilmon alerts with Ceph health
When an alert fires, run these commands to triage:
# Overall cluster health
kubectl exec -n rook-ceph -it $(kubectl get pod -n rook-ceph -l app=rook-ceph-tools -o name) -- ceph status
# OSD status
kubectl exec -n rook-ceph -it $(kubectl get pod -n rook-ceph -l app=rook-ceph-tools -o name) -- ceph osd status
# MON quorum
kubectl exec -n rook-ceph -it $(kubectl get pod -n rook-ceph -l app=rook-ceph-tools -o name) -- ceph mon stat
# Check for HEALTH_WARN or HEALTH_ERR
kubectl exec -n rook-ceph -it $(kubectl get pod -n rook-ceph -l app=rook-ceph-tools -o name) -- ceph health detail
If Vigilmon shows the RGW as down but ceph status shows HEALTH_OK, the issue is likely network routing to the RGW service — not the storage cluster itself.
Recommended monitor set for Rook-Ceph
| Monitor | Type | What it catches |
|---------|------|-----------------|
| https://ceph-dashboard:8443/ | HTTP | MGR failure, dashboard ingress routing |
| http://rgw-endpoint/ | HTTP | RGW process crash, object storage unavailability |
| http://rgw-endpoint/monitoring-probe/healthcheck | HTTP | Full read path validation |
| mon-node:6789 | TCP | MON process crash, quorum at risk |
| http://operator:30943/healthz | HTTP | Rook operator reconciliation stopped |
What's next
- Heartbeat monitors — if you run Rook-Ceph backup CronJobs, use Vigilmon's heartbeat monitoring to alert when scheduled backups stop completing
- SSL certificate monitoring — if your dashboard uses a cert-manager-issued certificate, Vigilmon will alert you before the cert expires and breaks dashboard access
- Status page — create a Vigilmon status page for your storage infrastructure so platform teams have visibility into Ceph health without needing
kubectlaccess
Get started free at vigilmon.online — no credit card, monitors running in under a minute.