Red Hat OpenShift is an enterprise Kubernetes platform that layers a rich set of additional components on top of upstream Kubernetes: an OAuth authentication server, a built-in container image registry, an HAProxy-based Router that replaces the standard Nginx Ingress controller, cluster operators that reconcile platform components, and etcd as the authoritative state store. Because OpenShift manages its own control-plane services as cluster operators, failures often cascade in ways that are invisible inside the cluster — a degraded OAuth server still reports Running pods while every oc login and kubectl call silently fails. External monitoring is the only reliable way to catch these outages before your users do.
Why OpenShift deployments need external monitoring
- OAuth server outage blocks all cluster access: OpenShift's built-in OAuth server handles every
oc loginand token refresh. When it goes down, developers losekubectl/ocaccess entirely, CI/CD pipelines fail to authenticate, and operators cannot respond to incidents — even if the workloads themselves are still running. - HAProxy Router crash drops all Route traffic: OpenShift uses Routes (not Kubernetes Ingress) as the primary external-access mechanism. A crashed or misconfigured HAProxy Router pod in the
openshift-ingressnamespace silently drops all incoming HTTP/HTTPS traffic to every application in the cluster, with no in-cluster alert firing. - Image registry unavailability breaks new pod startup: New deployments, rolling updates, and CronJob pods all pull images from the built-in registry. Registry downtime causes
ImagePullBackOfferrors across every namespace simultaneously, stalling all rollouts without any obvious single point of failure. - Cluster operator degraded state cascades silently: OpenShift's cluster operators (network, storage, console, DNS, etc.) manage platform infrastructure. An operator stuck in
Degradedstate can block upgrades, prevent new node joins, and degrade routing — yet the workload pods themselves keep running, masking the problem. - etcd quorum loss halts all cluster state changes: Losing a majority of etcd members causes the API server to return errors on all write operations. Pods already running continue, but no new deployments, config maps, or secrets can be applied, bringing CI/CD and incident response to a standstill.
What you'll need
- An OpenShift cluster (OCP 4.x) with
cluster-adminaccess and theocCLI installed - A Vigilmon account (free tier includes HTTP, TCP, and status pages)
- Network reachability from the public internet (or a Vigilmon probe on your network) to your cluster's router IP and API endpoint
Step 1: Expose a health endpoint for monitoring
OpenShift's HAProxy Router already exposes a stats and health port on every router pod. Expose it via a Service and a Route so Vigilmon can reach it externally.
Check the current router deployment:
oc -n openshift-ingress get pods -l ingresscontroller.operator.openshift.io/deployment-ingresscontroller=default
oc -n openshift-ingress get service router-internal-default
Create a dedicated health-check Service and Route:
# openshift-router-healthcheck.yaml
apiVersion: v1
kind: Service
metadata:
name: router-health
namespace: openshift-ingress
spec:
selector:
ingresscontroller.operator.openshift.io/deployment-ingresscontroller: default
ports:
- name: healthz
port: 1936
targetPort: 1936
type: ClusterIP
---
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: router-health
namespace: openshift-ingress
spec:
host: router-health.apps.cluster.example.com
port:
targetPort: healthz
to:
kind: Service
name: router-health
tls:
termination: edge
insecureEdgeTerminationPolicy: Redirect
oc apply -f openshift-router-healthcheck.yaml
oc -n openshift-ingress get route router-health
Also expose a lightweight health endpoint for your own application using a Route:
# app-health-route.yaml
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: app-health
namespace: my-app
spec:
host: my-app.apps.cluster.example.com
path: /healthz
port:
targetPort: http
to:
kind: Service
name: my-app
tls:
termination: edge
insecureEdgeTerminationPolicy: Redirect
oc apply -f app-health-route.yaml
curl -f https://my-app.apps.cluster.example.com/healthz
Step 2: Set up HTTP monitoring in Vigilmon
- Log in to vigilmon.online and open the Monitors tab.
- Click Add Monitor and select HTTP(S).
- Enter the router health URL:
https://router-health.apps.cluster.example.com/healthz. - Set the Check interval to 60 seconds and the Timeout to 10 seconds.
- Under Expected status code, enter
200. Optionally add a Keyword check for the stringaliveto verify the HAProxy stats page content. - Click Save Monitor. Vigilmon begins issuing checks from external probes immediately.
Repeat steps 2–6 for the OpenShift console URL:
- URL:
https://console-openshift-console.apps.cluster.example.com - Expected status:
200 - Keyword check:
OpenShift
And for your application Route:
- URL:
https://my-app.apps.cluster.example.com/healthz - Expected status:
200
Why external monitoring catches what Kubernetes misses
OpenShift's internal probes — liveness, readiness, and cluster operator health checks — run inside the cluster network. They cannot detect a BGP route withdrawal that makes your router IP unreachable from the internet, a TLS certificate expiry that causes browsers to refuse the connection, or a DNS misconfiguration that points your Route hostname to a dead IP. Vigilmon's probes hit your endpoints from the public internet the same way your users and pipelines do, catching the full class of external-facing failures.
Step 3: Monitor TCP ports and the OpenShift health endpoint
Add TCP monitors for the Kubernetes API server and the OAuth server, which do not serve HTTP on their primary ports:
In Vigilmon, click Add Monitor and select TCP:
- Kubernetes API server: Host
api.cluster.example.com, Port6443 - OAuth server: Host
oauth-openshift.apps.cluster.example.com, Port443 - etcd peer port (if reachable from your probe): Host
203.0.113.50, Port2380
Check the OAuth server's /healthz endpoint directly via HTTP:
# oauth-health-route.yaml
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: oauth-health
namespace: openshift-authentication
spec:
host: oauth-health.apps.cluster.example.com
port:
targetPort: 6443
to:
kind: Service
name: oauth-openshift
tls:
termination: reencrypt
insecureEdgeTerminationPolicy: Redirect
oc apply -f oauth-health-route.yaml
curl -k https://oauth-openshift.apps.cluster.example.com/healthz
Add this as a Vigilmon HTTP monitor:
- URL:
https://oauth-openshift.apps.cluster.example.com/healthz - Expected status:
200 - Keyword check:
ok
Also add the image registry health endpoint:
oc -n openshift-image-registry get route default-route
- URL:
https://default-route-openshift-image-registry.apps.cluster.example.com/healthz - Expected status:
200
Step 4: Configure alert channels
Email alerts:
- In Vigilmon, go to Alert Channels and click Add Channel.
- Select Email and enter your operations team address (e.g.
ops@example.com). - Set Alert on: Down, Recovered, Certificate expiry (30 days).
- Click Save, then click Send test alert to confirm delivery.
- Assign this channel to all four monitors created above under each monitor's Alerts tab.
Webhook alerts (for Slack, PagerDuty, or custom runbooks):
- In Vigilmon, click Add Channel and select Webhook.
- Enter your endpoint URL (e.g.
https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK). - Vigilmon sends a POST request with a JSON payload on every state change:
{
"monitor": "OpenShift HAProxy Router",
"status": "down",
"url": "https://router-health.apps.cluster.example.com/healthz",
"checked_at": "2026-07-11T08:23:01Z",
"response_code": 0,
"response_time_ms": null,
"message": "Connection timed out"
}
- Use this payload in a PagerDuty Events API integration or a custom webhook receiver that pages on-call engineers.
- Assign the webhook channel to all monitors.
Run these commands to diagnose router alerts when they fire:
# Check router pod status
oc -n openshift-ingress get pods -l ingresscontroller.operator.openshift.io/deployment-ingresscontroller=default
# Check cluster operators for degraded state
oc get clusteroperators | grep -v "True.*False.*False"
# Check OAuth server pods
oc -n openshift-authentication get pods
# Check image registry operator
oc -n openshift-image-registry get pods
# Verify etcd member health
oc -n openshift-etcd get pods -l app=etcd
oc rsh -n openshift-etcd etcd-master-0 etcdctl member list --write-out=table
# Check recent router events
oc -n openshift-ingress get events --sort-by='.lastTimestamp' | tail -20
# Pull router logs
oc -n openshift-ingress logs -l ingresscontroller.operator.openshift.io/deployment-ingresscontroller=default --tail=50
Step 5: Create a public status page
- In Vigilmon, go to Status Pages and click New Status Page.
- Name it
OpenShift Cluster Statusand choose a subdomain such asstatus.cluster.example.com. - Add the following monitors to the page:
- OpenShift HAProxy Router (HTTP)
- OpenShift Console (HTTP)
- Kubernetes API Server (TCP)
- OAuth Server /healthz (HTTP)
- Image Registry (HTTP)
- Application Health (HTTP)
- Enable 90-day uptime history bars and incident history.
- Click Publish. Share the URL with your development teams and stakeholders so they can self-serve during incidents rather than filing support tickets.
Putting it all together
| Monitor | Type | What it catches |
|---|---|---|
| HAProxy Router /healthz | HTTP | Router pod crash, HAProxy config reload failure, Route traffic blackhole |
| OpenShift Console | HTTP | Console operator degraded, ingress misconfiguration, TLS cert expiry |
| Kubernetes API Server | TCP | API server pod down, etcd quorum loss, network partition to control plane |
| OAuth Server /healthz | HTTP | OAuth server crash, OIDC provider misconfiguration, all oc login failures |
| Image Registry | HTTP | Registry pod down, storage backend failure, new pod startup stalls |
| Application Route | HTTP | App-specific failures visible from outside the cluster |
# Quick OpenShift cluster health snapshot
echo "=== Cluster Operators ==="
oc get clusteroperators
echo "=== Router Pods ==="
oc -n openshift-ingress get pods
echo "=== OAuth Pods ==="
oc -n openshift-authentication get pods
echo "=== Image Registry Pods ==="
oc -n openshift-image-registry get pods
echo "=== etcd Pods ==="
oc -n openshift-etcd get pods -l app=etcd
echo "=== Node Status ==="
oc get nodes
echo "=== Recent Cluster Events ==="
oc get events -A --sort-by='.lastTimestamp' | grep -i "warning\|error\|failed" | tail -30
echo "=== Router External IP ==="
oc -n openshift-ingress get service router-external-default -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
What's next
- Add a certificate expiry monitor in Vigilmon for your cluster's wildcard certificate (
*.apps.cluster.example.com) and the API server certificate (api.cluster.example.com) to get 30-day advance warnings before TLS outages. - Configure response-time alerting on the HAProxy Router health check — a spike from under 100 ms to over 2 seconds reliably predicts imminent router overload before requests start dropping.
- Extend monitoring to individual application namespaces by adding HTTP monitors for each team's Route, and group them under a single status page per team so cluster operations and application teams have separate visibility.
Get started free at vigilmon.online — no credit card, monitors start running in under a minute.