Kubernetes triage · local · read-only

See what's broken, not a wall of events.

KubeHealth is one binary you point at your kubeconfig. It groups warnings into one row per broken workload, ranks them by how new they are, and, if you want, asks a small model running on your laptop what to check first.

Nothing installed in the cluster Only reads AI optional, offline with the bundled model
0:00 / 0:00
How it works

Thousands of events in, a short ranked list out.

KubeHealth reads your cluster's warning events and turns them into one row per broken workload, newest first.

kubectl get events -Awhat Kubernetes gives you
  • Warning BackOff pod/orders-worker-657b5…-wksdm ×64
  • Warning BackOff pod/orders-worker-657b5…-h8zg7 ×58
  • Warning FailedScheduling pod/orders-db-0 ×20
  • Warning ProvisioningFailed pvc/data-orders-db-0 ×82
  • Warning BackOff pod/search-indexer-7f7b7…-26p9t ×30
  • Warning Unhealthy pod/storefront-7654d…-q8w2d ×16934
  • Warning Failed pod/checkout-api-5c4bc…-xfk9f ×117
  • Normal Pulled pod/orders-worker-657b5…-wksdm ×9
  • … and hundreds more, across every namespace
KubeHealth overviewone row per broken workload
  1. new
    search-indexerDeployment · searchBackOff ×30 · ran out of memory · 1 pod
  2. ongoing
    orders-workerDeployment · ordersBackOff ×122 · 3 pods · failing for 5 h
  3. chronic
    storefrontDeployment · frontendreadiness probe failing ×16,934 · for 2 days
Grouped by ownerPods, ReplicaSets and Jobs roll up to their Deployment, CronJob or StatefulSet: fifty failing pods are one row.
Ranked by ageNew (under 2 h) first, then ongoing, then chronic, so an old failure never hides a fresh one.
Merged across namespacesThe same failure in several namespaces at once becomes a single row.
Easy on the clusterRead-only: one list call every 2 seconds, everything else from its cache.
What you get

Triage first, details one click away.

The namespace list never leaves the screen. Pick a namespace for its live status, pick an object for its ownership chain and full timeline, ask for logs or a root cause without changing pages.

Run it

Download a build from the releases page, then:

Regular build macOS, Linux, Windows
tar -xzf kubehealth_*_darwin_arm64.tar.gz
cd kubehealth_*_darwin_arm64
xattr -d com.apple.quarantine kubehealth  # macOS
./kubehealth                    # localhost:8080
Embed build model bundled, AI offline
tar -xzf kubehealth-embed_*_darwin_arm64.tar.gz
cd kubehealth-embed_*_darwin_arm64
xattr -d com.apple.quarantine kubehealth-embed
./kubehealth-embed              # + local model
KubeHealth-Bench

Scorecard

Each model diagnoses 54 incidents recorded from real clusters, through KubeHealth's own prompts and tools; the table shows how often its answer names the real cause and the right fix.

Every case

Inspect all the incidents.

Each case is one object in a recorded cluster, what is really wrong with it, and the words a right answer has to contain. Open one to see exactly what KubeHealth puts in front of the model.

Failure coverage

cause in the object's own evidencecause in another object

The snapshots

A snapshot is a cluster saved to files at one moment. The bench runs on these files instead of a live cluster, so every model sees exactly the same evidence, and anyone can run it again without a cluster.

  1. 1
    Recordkubehealth bench record reads a live cluster once, read-only: every object KubeHealth looks at, the events, and the last 150 lines of each container's log (and of its previous run).
  2. 2
    Replaykubehealth bench run loads the files as a stand-in cluster, with the clock stopped at the recording time: "first seen 8 min ago" reads the same on every run, and the model's tool calls are answered from the files.
  3. 3
    ScoreEach case above points at one object in a snapshot and lists the words a right answer has to contain; the answers are checked against them.

Never stored: Secret and ConfigMap values (only their key names), literal environment values, last-applied annotations, and the system namespaces.

Open a snapshot to see what KubeHealth's overview showed for that cluster at the recording time, row by row, in the order it ranked them:

  • newfirst seen under 2 h before
  • ongoing2 to 24 h
  • chroniclonger
  • casea fault case on that row
  • casea healthy control

A row without a case is a real problem that isn't scored on its own, often the dependency behind another case's symptom.