kubeside

When things are missing

Most of what follows is not an error. A developer's day is full of these, and each one has a wrong behaviour that looks like a right one.

A cluster shows a state instead of apps

unreachable · dial tcp 10.0.0.1:443: i/o timeout

VPN, DNS, or the cluster is down. kubeside shows no apps for it rather than an empty list, because an empty list is a claim about the cluster's contents.

One cluster failing never affects another. Every context has its own connection and its own state.

A cluster says unauthorized

unauthorized · the server has asked for the client to provide credentials

Your session expired. Re-run whatever authenticates you (aws sso login, gcloud auth login) and reconnect. This is deliberately a different state from unreachable, because the next action is different.

The scope says one namespace

scope: namespace team-a · listing namespaces was refused

Your role is namespace-scoped, which is normal. No Kubernetes API enumerates the namespaces a user may access, so a refused cluster-scoped list is an answer, not a failure. To see more, name them in the config:

defaults:
  namespaces: [team-a, team-b]

A kind is named as partial

partial: CronJob

That kind could not be listed. A row might be missing. This is named precisely so you do not conclude the cluster has no CronJobs.

Metrics columns are gone

metrics: unavailable · metrics-server is not installed

Install metrics-server, or read the rest without them. A zero is never shown for a reading nobody took. metrics: prometheus is accepted in the config file and not implemented, so it reports unavailable rather than pretending.

A usage number ends in an asterisk

Fewer of the app's pods reported than it has. Hover for the count. The usual cause is a replica that is not running: a crash-looping or pending pod reports nothing, so the total covers the replicas still up. It is a real number about part of the app, not the app's usage.

The timeline starts recently

The cluster is the archive, and it prunes. revisionHistoryLimit removes old ReplicaSets, and the apiserver expires events after roughly an hour. The horizon marks exactly where the reconstruction ends. Anything earlier is genuinely gone from the cluster, and no tool without a database can show it.

A control is disabled

It names the verb it needs. That sentence is the request to send to whoever manages your RBAC. See permissions.

Logs stop

Look for the edge. ended means the container exited, gone means the pod was deleted, error carries the reason. A log view that simply went quiet would be the failure worth worrying about.

Is there a TUI, like k9s?

No, and this is a decision, not an oversight. Asked on the same Show HN thread that raised the Argo CD question.

The four questions kubeside answers are layout problems before they are anything else. A timeline needs a horizontal axis with markers on it. A side-by-side config diff needs two columns a reader can scan against each other. A promotion matrix needs a grid with color and drift indicators. A monospace grid renders none of them well, and forcing them into one would mean designing worse versions of screens that already work in a browser.

k9s also already owns the terminal, and it does that job well. Competing with it on keyboard speed would be a fight against a tool people already like, over ground kubeside does not need.

If your kubeconfig is not local, for example a shared cluster with no kubectl access from your machine, --serve mode is the answer. It runs the same binary and the same screens against the cluster directly, over OIDC. It is listed under Beyond v1 in the roadmap and has not shipped yet.