Sealos is an open-source cloud operating system that turns a bare Kubernetes cluster into a consumer-grade private cloud platform: web-based desktop, per-tenant resource isolation, an app store, serverless functions, MinIO object storage, and managed databases — all on infrastructure you control. It's the self-hosted alternative to AWS or GCP for teams that want cloud-platform productivity without public cloud dependency. But that richness means many critical components: the cloud controller manager, the desktop frontend, MinIO, database operators, ingress, cert-manager, and per-tenant namespace health all need to be watched. Vigilmon gives you a single pane of glass across every layer of the Sealos stack.
What You'll Set Up
- Sealos cloud controller manager health monitor
- Kubernetes API server availability check
- Sealos desktop UI uptime monitor (the web-based cloud desktop)
- Per-tenant namespace resource quota alerting
- MinIO object storage health check
- Database operator pod health monitors (PostgreSQL, MySQL)
- Ingress controller health monitor
- Cert-Manager health and certificate expiry alerts
- Cluster-wide resource utilization alerting (>85% CPU/memory)
- Internal OCI registry health check
Prerequisites
- A running Sealos installation (self-hosted on a Kubernetes cluster)
kubectlaccess to the cluster- Sealos desktop accessible over HTTPS
- A free Vigilmon account
Why Monitoring Sealos Is Multi-Layered
Sealos sits on top of Kubernetes, not beside it. A failure at any layer cascades upward:
- Kubernetes control plane failure → Sealos controller cannot reconcile tenants → all tenant operations fail
- Sealos controller failure → Tenant lifecycle management breaks → users can't create/delete workloads
- MinIO failure → Object storage unavailable → any app using cloud storage breaks
- Ingress failure → All tenant HTTP traffic drops → every deployed application becomes unreachable
- Cert-Manager failure → TLS certificates stop renewing → HTTPS errors across all tenant apps
Each layer needs its own monitor, and alert escalation should reflect the blast radius.
Step 1: Monitor the Kubernetes API Server
Sealos cannot function without a healthy Kubernetes API server. This is the foundation check.
Add a Vigilmon HTTP monitor for the Kubernetes API health endpoint:
- Log in to vigilmon.online and click Add Monitor.
- Set Type to
HTTP / HTTPS. - Enter your Kubernetes API health URL:
https://<k8s-api-server>:6443/healthz - Set Check interval to
1 minute. - Set Expected HTTP status to
200. - Under Alert thresholds, set Failure threshold to
1(any failure should alert immediately). - Click Save.
If your cluster's API server is behind a load balancer, use the load balancer endpoint. For internal clusters, use a monitoring host inside the cluster network.
Alert rule: critical immediately — Kubernetes API server unavailability makes all Sealos operations impossible.
Step 2: Monitor the Sealos Cloud Controller Manager
The sealos-cloud-controller-manager is the Sealos-specific Kubernetes operator that manages tenant lifecycle: namespace creation, resource quota enforcement, billing, and user management. If it crashes, no new tenants can be created and existing tenant configurations cannot be updated.
Check controller health:
# Check the controller deployment
kubectl get deployment sealos-cloud-controller-manager \
-n sealos-system -o jsonpath='{.status.availableReplicas}'
# View recent logs for errors
kubectl logs -n sealos-system \
-l app=sealos-cloud-controller-manager --tail=50
Expose a health check endpoint via a simple HTTP probe:
# Add this to a monitoring script that Vigilmon calls
kubectl get deployment sealos-cloud-controller-manager \
-n sealos-system -o jsonpath='{.status.availableReplicas}' | grep -q "^[1-9]" \
&& curl -s "$VIGILMON_CONTROLLER_HEARTBEAT_URL"
Or use a Kubernetes-native approach with a ClusterIP service and a readiness probe:
# Check the controller pod's readiness
kubectl get pods -n sealos-system \
-l app=sealos-cloud-controller-manager \
-o jsonpath='{.items[0].status.containerStatuses[0].ready}'
Add a Vigilmon Heartbeat monitor named sealos-controller-health with a 2-minute expected interval.
Alert rule: critical if the controller has 0 available replicas — tenant lifecycle operations are completely blocked.
Step 3: Monitor the Sealos Desktop UI
The Sealos desktop is the web interface users interact with. If the frontend is down, users cannot access their cloud desktop, deploy applications, or manage their resources.
Add a Vigilmon HTTP monitor:
- Click Add Monitor → HTTP / HTTPS.
- Enter your Sealos desktop URL:
https://cloud.yourdomain.com(or your self-hosted Sealos domain). - Set Check interval to
1 minute. - Set Expected HTTP status to
200. - Under Keyword matching, add
Sealosor any string that appears on the desktop login page to confirm real content is served. - Click Save.
Also monitor the Sealos API backend directly:
- Add another HTTP monitor for the API endpoint:
https://cloud.yourdomain.com/api/auth/session - Set Expected HTTP status to
200or401(unauthenticated is still a healthy API response).
Alert rule: critical if the desktop UI returns non-200 or keyword not found — users have lost access to their entire cloud environment.
Step 4: Monitor Per-Tenant Namespace Resource Quotas
In Sealos, each tenant gets a Kubernetes namespace with resource quotas. When a tenant hits their quota, their pods can't be scheduled and their workloads fail silently. Monitor quota usage across all tenant namespaces:
# List all tenant namespaces with quota usage
kubectl get resourcequota -A \
-o custom-columns="NAMESPACE:.metadata.namespace,\
CPU_USED:.status.used.cpu,CPU_LIMIT:.status.hard.cpu,\
MEM_USED:.status.used.memory,MEM_LIMIT:.status.hard.memory"
Set up a monitoring script that counts namespaces near quota limits:
#!/usr/bin/env python3
import subprocess, json, os, requests
result = subprocess.run(
["kubectl", "get", "resourcequota", "-A", "-o", "json"],
capture_output=True, text=True
)
quotas = json.loads(result.stdout)["items"]
near_limit = []
for q in quotas:
used = q["status"].get("used", {})
hard = q["status"].get("hard", {})
ns = q["metadata"]["namespace"]
# Check CPU quota usage
cpu_used = float(used.get("cpu", "0").rstrip("m")) / 1000
cpu_limit = float(hard.get("cpu", "999").rstrip("m")) / 1000
if cpu_limit > 0 and cpu_used / cpu_limit > 0.85:
near_limit.append(f"{ns}: CPU {cpu_used/cpu_limit*100:.0f}%")
if not near_limit:
requests.get(os.environ["VIGILMON_QUOTA_HEARTBEAT_URL"])
else:
print(f"Namespaces near quota: {near_limit}")
Alert rule: warning if any tenant namespace is above 85% of its resource quota; critical if a namespace is at 100% (pods will fail to schedule).
Step 5: Monitor MinIO Object Storage
Sealos uses MinIO for object storage. MinIO failure breaks any Sealos feature that stores files, container images, backups, or user uploads.
Check MinIO health:
# MinIO health endpoint
curl -s http://minio.sealos-system.svc.cluster.local:9000/minio/health/live
# MinIO readiness endpoint
curl -s http://minio.sealos-system.svc.cluster.local:9000/minio/health/ready
Add a Vigilmon HTTP monitor for MinIO:
- Click Add Monitor → HTTP / HTTPS.
- Enter your MinIO health URL (internal or load-balanced):
http://<minio-endpoint>:9000/minio/health/live - Set Check interval to
1 minute. - Set Expected HTTP status to
200. - Click Save.
Also monitor MinIO storage capacity:
# Check total MinIO storage usage via mc (MinIO client)
mc admin info minio --json | python3 -c "
import sys, json
info = json.load(sys.stdin)
for server in info.get('servers', []):
for disk in server.get('drives', []):
used_pct = disk['usedSpace'] / disk['totalSpace'] * 100
if used_pct > 80:
print(f'DISK_FULL: {disk[\"endpoint\"]} {used_pct:.1f}%')
exit(1)
"
[ $? -eq 0 ] && curl -s "$VIGILMON_MINIO_CAPACITY_HEARTBEAT_URL"
Alert rules:
criticalif MinIO health endpoint returns non-200warningat MinIO storage >80% capacitycriticalat MinIO storage >90% capacity
Step 6: Monitor Database Operator Health
Sealos provides managed databases via Kubernetes operators (typically CloudNativePG for PostgreSQL and similar for MySQL). If the operator crashes, users cannot provision new databases and existing database operations may fail.
Check operator pod health:
# Check CloudNativePG operator
kubectl get deployment -n cnpg-system cnpg-controller-manager \
-o jsonpath='{.status.availableReplicas}'
# Check for database cluster errors
kubectl get clusters.postgresql.cnpg.io -A \
-o custom-columns="NAMESPACE:.metadata.namespace,NAME:.metadata.name,STATUS:.status.phase"
Add Vigilmon heartbeat monitors for each database operator:
#!/bin/bash
# PostgreSQL operator health check
PG_REPLICAS=$(kubectl get deployment -n cnpg-system \
cnpg-controller-manager \
-o jsonpath='{.status.availableReplicas}' 2>/dev/null || echo "0")
if [ "$PG_REPLICAS" -gt 0 ]; then
curl -s "$VIGILMON_PG_OPERATOR_HEARTBEAT_URL"
fi
Alert rule: critical if the database operator has 0 available replicas — database provisioning for all tenants is blocked.
Step 7: Monitor Ingress Controller Health
The ingress controller routes HTTP traffic to all tenant applications. An ingress crash drops all tenant application traffic simultaneously.
Check ingress controller health:
# Check nginx ingress controller (or whichever ingress Sealos uses)
kubectl get deployment -n ingress-nginx ingress-nginx-controller \
-o jsonpath='{.status.availableReplicas}'
Add a Vigilmon HTTP monitor that hits the ingress controller's own status endpoint:
- Click Add Monitor → HTTP / HTTPS.
- Enter the ingress controller metrics endpoint:
http://<ingress-controller-ip>:10254/healthz - Set Check interval to
1 minute. - Set Expected HTTP status to
200.
Or use a real tenant application URL as a proxy health check:
- Pick a stable, low-traffic tenant application URL.
- Add it as an HTTP monitor with the expected response.
- If this URL goes down, the ingress controller or that specific app is down.
Alert rule: critical immediately — ingress failure drops all tenant application traffic.
Step 8: Monitor Cert-Manager and Certificate Expiry
Cert-Manager automates TLS certificate issuance and renewal for all tenant applications. A cert-manager failure means certificates stop renewing and HTTPS errors will cascade across all tenant apps.
Check cert-manager health:
# Check cert-manager deployment
kubectl get deployment -n cert-manager cert-manager \
-o jsonpath='{.status.availableReplicas}'
# Check for certificates expiring soon (<14 days)
kubectl get certificates -A \
-o custom-columns="NAMESPACE:.metadata.namespace,NAME:.metadata.name,\
READY:.status.conditions[0].status,EXPIRY:.status.notAfter" \
| grep -v "True"
Add a Vigilmon SSL certificate monitor for your Sealos domain:
- Click Add Monitor → SSL Certificate.
- Enter your Sealos domain:
cloud.yourdomain.com - Set Alert threshold to
14 days before expiry. - Set Check interval to
1 day. - Click Save.
Add a heartbeat for the cert-manager controller itself:
#!/bin/bash
CM_REPLICAS=$(kubectl get deployment -n cert-manager cert-manager \
-o jsonpath='{.status.availableReplicas}' 2>/dev/null || echo "0")
if [ "$CM_REPLICAS" -gt 0 ]; then
curl -s "$VIGILMON_CERTMANAGER_HEARTBEAT_URL"
fi
Alert rules:
criticalif cert-manager controller is downwarningif any certificate expires within 14 dayscriticalif any certificate expires within 3 days
Step 9: Monitor Cluster-Wide Resource Utilization
Monitor aggregate resource usage across all tenant namespaces to prevent scheduling failures:
# Aggregate CPU/memory usage across cluster
kubectl top nodes --no-headers | awk '
{
gsub(/%/, "", $3); cpu_total += $3;
gsub(/%/, "", $5); mem_total += $5;
count++
}
END {
print "avg_cpu=" cpu_total/count
print "avg_mem=" mem_total/count
}'
Set up a Vigilmon heartbeat that alerts when cluster utilization approaches limits:
#!/bin/bash
AVG_CPU=$(kubectl top nodes --no-headers | \
awk '{gsub(/%/,"",$3); sum+=$3; n++} END {print sum/n}')
AVG_MEM=$(kubectl top nodes --no-headers | \
awk '{gsub(/%/,"",$5); sum+=$5; n++} END {print sum/n}')
if (( $(echo "$AVG_CPU < 85" | bc -l) )) && \
(( $(echo "$AVG_MEM < 85" | bc -l) )); then
curl -s "$VIGILMON_CLUSTER_RESOURCE_HEARTBEAT_URL"
fi
Alert rules:
warningat cluster-wide CPU or memory > 75%criticalat > 85% — new pods will fail to schedule, tenant operations will fail
Step 10: Monitor the Internal OCI Registry
Sealos uses an internal OCI image registry for app deployments. If the registry is unhealthy, application deployments and updates will fail for all tenants.
# Registry health check
curl -s http://registry.sealos-system.svc.cluster.local:5000/v2/ \
-o /dev/null -w "%{http_code}"
Add a Vigilmon HTTP monitor:
- Click Add Monitor → HTTP / HTTPS.
- Enter the registry health URL:
http://<registry-endpoint>:5000/v2/ - Set Expected HTTP status to
200. - Set Check interval to
2 minutes.
Alert rule: critical if the registry returns non-200 — all application deployments across all tenants are blocked.
Summary: Sealos Monitoring Checklist
| Component | Monitor Type | Alert Level | Interval | |---|---|---|---| | Kubernetes API server | HTTP | Critical | 1 min | | Sealos cloud controller | Heartbeat | Critical | 2 min | | Sealos desktop UI | HTTP | Critical | 1 min | | Tenant namespace quotas | Heartbeat | Warning/Critical | 5 min | | MinIO object storage | HTTP + Heartbeat | Critical | 1 min | | Database operator (PG/MySQL) | Heartbeat | Critical | 2 min | | Ingress controller | HTTP | Critical | 1 min | | Cert-Manager | Heartbeat | Critical | 5 min | | SSL certificate expiry | SSL | Warning/Critical | 1 day | | Cluster resource utilization | Heartbeat | Warning/Critical | 5 min | | Internal OCI registry | HTTP | Critical | 2 min |
Sealos gives your team the productivity of a public cloud platform on infrastructure you own — but that ownership means you're responsible for the entire stack. With Vigilmon watching every layer from the Kubernetes API server to per-tenant quota usage, you get the operational confidence to run a reliable private cloud for your organization.
Get started free at Vigilmon.