tutorial

How to Monitor Kube-VIP with Vigilmon (VIP Reachability, Leader Election, Failover Alerts)

Kube-VIP gives bare-metal and on-premises Kubernetes clusters the same LoadBalancer VIP experience that cloud providers deliver automatically. It runs as a D...

Kube-VIP gives bare-metal and on-premises Kubernetes clusters the same LoadBalancer VIP experience that cloud providers deliver automatically. It runs as a DaemonSet or static pod on your control plane nodes, elects a leader via ARP or BGP, and assigns a virtual IP that floats between nodes when failures occur.

That floating VIP is both Kube-VIP's greatest strength and its most critical failure point. When the leader election breaks, when ARP announcements stop reaching switches, or when the VIP stops responding during a failover — your entire cluster's external access can vanish in seconds. In this tutorial you'll set up comprehensive monitoring for Kube-VIP using Vigilmon, catching every category of failure before users notice.


Why Kube-VIP needs external monitoring

Kube-VIP is typically monitored through Prometheus metrics scraped from inside the cluster. But internal metrics have a fundamental blind spot: if the VIP itself is unreachable, the monitoring stack may be unreachable too.

External monitoring fills the gaps Prometheus can't:

  • VIP unreachable after failover — a node goes down, Kube-VIP re-elects a leader on a different node, but ARP propagation fails and switches still send traffic to the dead node's MAC address. Pods show healthy; VIP doesn't respond.
  • Leader election stalls — the RAFT or ARP-based leader election enters a split-brain state. No node believes it's the leader. The VIP address exists in DNS but is unbound.
  • Gratuitous ARP blocked — a switch ACL or VLAN configuration change starts dropping the gratuitous ARP packets Kube-VIP sends on leader change. The VIP migrates logically but not physically.
  • API server VIP drifts — Kube-VIP managing the control plane VIP loses the election while the API server is healthy on individual nodes. kubectl works from inside the cluster; external access is broken.

Each of these scenarios produces the same observable symptom from outside: the VIP stops responding. Vigilmon catches all of them with a single HTTP or TCP check.


What you'll need

  • A Kubernetes cluster running Kube-VIP (v0.5+ recommended)
  • Kube-VIP configured in ARP or BGP mode with a VIP assigned
  • A free Vigilmon account

Step 1: Verify your Kube-VIP health endpoint

Kube-VIP exposes a Prometheus-compatible metrics and health endpoint. By default it listens on port 2112:

# From a node that can reach the VIP
curl http://<kube-vip-VIP>:2112/metrics | head -20

# Or check the health path if your version exposes it
curl http://<kube-vip-node-ip>:2112/metrics

To confirm Kube-VIP is serving on its assigned VIP, check the DaemonSet status:

kubectl get daemonset kube-vip-ds -n kube-system
kubectl get pods -n kube-system -l app.kubernetes.io/name=kube-vip -o wide

Identify the current leader — it will be the pod with the VIP bound:

# The leader node will have the VIP assigned on its network interface
# Run this on each control plane node to find it
ip addr show | grep <your-vip-address>

Make note of your VIP address and the port your services use (commonly 6443 for the API server VIP, or 80/443 for service LoadBalancer VIPs).


Step 2: Monitor VIP reachability with Vigilmon HTTP check

The most critical check is whether the VIP responds at all. If Kube-VIP is managing your Kubernetes API server VIP, monitor it directly:

  1. Log in to vigilmon.online and go to Monitors → New Monitor
  2. Choose HTTP / HTTPS
  3. Set the URL: https://<your-vip>:6443/healthz (for API server VIP) or http://<your-vip>/health (for service VIP)
  4. Set check interval: 30 seconds — VIP failovers should be caught fast
  5. Under Expected response, set status code 200
  6. Save as "Kube-VIP API Server VIP"

For the API server's /healthz endpoint, the expected response body should contain ok. Add a body check:

Response body contains: ok

Vigilmon probes this from multiple geographic regions. A failed probe from one region but not others may indicate a routing asymmetry; consensus failure across all regions confirms the VIP is truly unreachable.


Step 3: Add a TCP reachability check

HTTP checks confirm the application layer responds. TCP checks confirm the VIP port is reachable at the network layer — this catches cases where the VIP is bound but the application process has crashed or its port is not listening:

  1. Go to Monitors → New Monitor
  2. Choose TCP Port
  3. Enter your VIP address and the port: <your-vip> / 6443
  4. Set check interval: 30 seconds
  5. Save as "Kube-VIP TCP Port 6443"

If you manage multiple LoadBalancer services through Kube-VIP, add one TCP monitor per exposed port:

| Monitor Name | Host | Port | |---|---|---| | Kube-VIP API Server | <api-vip> | 6443 | | Kube-VIP HTTPS Services | <lb-vip> | 443 | | Kube-VIP HTTP Services | <lb-vip> | 80 |


Step 4: Monitor the metrics endpoint on each control plane node

Kube-VIP's metrics endpoint exposes leader election state and ARP/BGP status. Monitor it on each control plane node individually — not just the VIP — so you can detect when a node's Kube-VIP pod is unhealthy even if another node holds the VIP:

# Get node IPs
kubectl get nodes -o wide | grep control-plane

For each control plane node, add a monitor:

  1. Go to Monitors → New Monitor
  2. Choose HTTP / HTTPS
  3. URL: http://<control-plane-node-ip>:2112/metrics
  4. Check interval: 1 minute
  5. Expected status code: 200
  6. Save as "Kube-VIP Node 1 Metrics", "Kube-VIP Node 2 Metrics", etc.

If any node's metrics endpoint stops responding, its Kube-VIP pod has crashed — even if the VIP is currently held by a different node, you've lost redundancy and the next failure will cause a leader election with a reduced node pool.


Step 5: Configure failover alerting

Kube-VIP failovers are expected events — they happen when nodes are rebooted for maintenance or fail unexpectedly. The goal is to distinguish between:

  1. Clean failover — VIP moves to another node and comes back up within seconds (normal maintenance)
  2. Stuck failover — VIP goes unreachable and stays unreachable for more than 30–60 seconds (incident)

Configure Vigilmon's confirmation threshold to avoid alerting on clean failovers:

  1. Open your "Kube-VIP API Server VIP" monitor settings
  2. Under Confirmation, set Confirm outage after: 2 consecutive failures
  3. With a 30-second check interval, this means you alert after ~60 seconds of unreachability

This window is long enough to skip a clean Kube-VIP failover (typically 5–15 seconds) but short enough to catch stuck elections.

Alert channels

Configure alert escalation for VIP failures, which can take down your entire cluster's external access:

  1. Go to Alert Channels → Add Channel → Email
  2. Add your on-call team email
  3. Go to Alert Channels → Add Channel → Webhook
  4. Add your PagerDuty or Opsgenie webhook URL

Assign both channels to all Kube-VIP monitors. For the API server VIP, treat any confirmed outage as P1 — your cluster is externally unreachable.


Step 6: Correlate Vigilmon alerts with Kube-VIP state

When a Vigilmon alert fires for a Kube-VIP monitor, here's the runbook:

# 1. Check which node currently holds the leader role
kubectl get pods -n kube-system -l app.kubernetes.io/name=kube-vip -o wide

# 2. Check Kube-VIP logs on each node
kubectl logs -n kube-system -l app.kubernetes.io/name=kube-vip --since=5m

# 3. Check if the VIP is bound on any node
# Run on each control plane node:
ip addr show | grep <your-vip>

# 4. Verify ARP tables on nodes
arp -n | grep <your-vip>

# 5. Check recent Kubernetes events for Kube-VIP
kubectl get events -n kube-system --field-selector reason=LeaderElection --sort-by=.lastTimestamp

If the VIP is bound on a node but still unreachable from external networks, the problem is likely ARP propagation. Force a gratuitous ARP announcement:

# SSH into the leader node and send a gratuitous ARP
arping -U -I <interface> <your-vip> -c 3

Monitoring summary

| Monitor | Type | Interval | What it catches | |---|---|---|---| | Kube-VIP API Server VIP /healthz | HTTP | 30s | VIP unreachable, API server down | | Kube-VIP VIP TCP 6443 | TCP | 30s | Port-level reachability loss | | Kube-VIP Node 1 Metrics | HTTP | 60s | Pod crash on node 1 | | Kube-VIP Node 2 Metrics | HTTP | 60s | Pod crash on node 2 | | Kube-VIP Node 3 Metrics | HTTP | 60s | Pod crash on node 3 |


What's next

  • SSL certificate monitoring — if your Kube-VIP API server VIP uses TLS, Vigilmon monitors certificate expiry and alerts you before your cluster becomes inaccessible due to a lapsed cert
  • Status page — publish a Vigilmon status page for your cluster so that platform engineering teams can check cluster availability without needing kubectl access
  • Heartbeat monitoring — if you run automated Kube-VIP configuration scripts or leader health scripts as CronJobs, Vigilmon's heartbeat feature alerts you when they stop checking in

Start monitoring your Kube-VIP infrastructure for free at vigilmon.online — setup takes under two minutes.

Monitor your app with Vigilmon

Free plan — 5 monitors, no credit card required. Up and running in 60 seconds.

Start free →