KV*

Harvester · SUSE Virtualization · OpenShift Virtualization · KubeVirt

Day-2 tools for people who run VMs on Kubernetes.

A week after a VMware exit, someone asks for the RVTools export. On KubeVirt there isn't one, and there's no esxtop or vSphere network view either. Here are three read-only command-line tools for it: an inventory, live load per VM and the OVN network map. KVTop and KVOvn-topo also run as MCP servers, so your favorite agent can use them.

KVTools

Inventory and health audit · coulof/kvtools · MIT

If you have ever sized a migration from an RVTools export, you know the format. KVTools produces the same kind of workbook for a KubeVirt cluster: one tab per concern, one row per VM, disk or NIC. The tabs are named after their RVTools counterparts, so vInfo becomes kvInfo.

It also runs a health audit. The rules are the things that hurt during a VMware exit: an RWO volume on a VM that should live-migrate, a HostDisk pinning a VM to one node, a guest agent that never connected, snapshots nobody cleaned up.

$ brew install coulof/tap/kvtools
# whole cluster to Excel
$ kvtools
# just the audit, in the terminal
$ kvtools health
# merge exports from several clusters
$ kvtools merge c1.xlsx c2.xlsx -o all.xlsx

13 sheets

  • kvInfo
  • kvCPU
  • kvMemory
  • kvDisk
  • kvPartition
  • kvNetwork
  • kvCD
  • kvSnapshot
  • kvGuestAgent
  • kvNode
  • kvStoragePool
  • kvHardware
  • kvHealth

A few of the health rules

  • HLTH-001 live migration configured on an RWO PVC
  • HLTH-005 zombie PVC whose owner VM no longer exists
  • HLTH-008 VM snapshots older than 14 days
  • HLTH-011 node vCPU overcommit above 8:1
KVTools export open on the kvInfo sheet, one row per VM with power state, host, IP address and guest OS
The kvInfo sheet: one row per VM, with host, IP address, guest OS and firmware.
Terminal output of kvtools health: a table of findings HLTH-009 and HLTH-012 with severity, category, resource, issue summary and remediation
kvtools health prints each finding with its rule ID, severity, resource and remediation.

Tab-by-tab mapping from RVTools to KVTools →

KVTop

Live VM monitor and MCP server · coulof/kvtop · v0.2.0 · MIT

Harvester ships with monitoring turned off, so a busy host often has no dashboard to check. KVTop scrapes virt-handler on every node through the API server proxy, using only your kubeconfig. Nothing gets installed in the cluster.

Select a VM and it streams virsh domstats: per-vCPU wait time, per-NIC throughput, per-disk IOPS. Live migrations show up as they happen.

The same core outputs JSON (kvtop top, vm, nodes, diagnose) and runs as an MCP server, so you can ask your coding agent which VM is the noisy neighbour.

$ brew install coulof/tap/kvtop
$ kvtop
$ kvtop --sort mem --namespace prod
# OpenShift / upstream
$ kvtop --virt-handler-namespace openshift-cnv
# for agents
$ kvtop diagnose -o json -q
$ claude mcp add kvtop -- kvtop mcp

KVOvn-topo

OVN topology explorer · coulof/kvovn-topo · v0.1.0 pre-release

kubectl ko nbctl show gives you every row and no picture. KVOvn-topo reads the Northbound and Southbound databases, joins them, and shows the result as a k9s-style tree: VPC, router, switch, port, and the pod or VM behind it. Press Enter on a relation to follow it.

With --diag it runs ovn-trace, tcpdump or conntrack for the selected object, on the node that hosts it. Without it, nothing is executed anywhere.

It supports Kube-OVN on RKE2 and Harvester. On OpenShift it reads ovn-kubernetes one node at a time. If you want the long version, read Following a Packet Through OVN.

  • Read-only, enforced by a lint in CI
  • No exposed endpoint: reached through the API server service proxy
  • Push updates: OVSDB monitors in, SSE out
  • Air-gap: static binaries, distroless image, Hauler manifest
$ helm install kvovn-topo \
    oci://ghcr.io/coulof/charts/kvovn-topo \
    -n kube-system
$ brew install coulof/tap/kvovn-topo
$ kvovn-topo
Recorded from the repo's test fixtures with vhs.

What they have in common

Read-only

None of them change your cluster. KVOvn-topo's exec-based diagnostics are opt-in behind a flag.

One binary, your kubeconfig

KVTools and KVTop install nothing in the cluster. KVOvn-topo runs one small daemon.

Try it without a cluster

From a clone of the repo, kvtop --replay testdata/ and kvovn-topo --fixture run on recorded data.

Air-gapped sites

Static binaries, no call-home. Built for networks where nothing reaches the internet.

Usable by agents

KVTop and KVOvn-topo ship MCP servers and stable JSON output.

Any KubeVirt

Tested mostly on Harvester, so bug reports from OpenShift Virtualization help the most.