Managing a cluster with raw kubectl means typing the same long commands hundreds of times a day. The k9s Kubernetes TUI fixes that. It puts your entire cluster into a terminal dashboard where pods, logs, deployments, and secrets are one or two keystrokes away. I switched to it two years ago and my kubectl usage dropped by about 80 percent. The commands are still there when I need them, but for day-to-day work, k9s is faster in every way that matters.
It runs anywhere a terminal runs. SSH into a jump host, type k9s, and you have a full cluster view without installing a web dashboard or opening a single port.
1. Install the k9s Kubernetes Client
The project ships single static binaries, so installation takes under a minute. On Debian and Ubuntu, grab the .deb from the releases page:
wget https://github.com/derailed/k9s/releases/latest/download/k9s_linux_amd64.deb
sudo apt install ./k9s_linux_amd64.deb
Arch users get it from the official repos with pacman -S k9s, and Homebrew handles Mac and Linux with brew install derailed/k9s/k9s. The source and all release assets live in the k9s GitHub repository.
k9s reads the same ~/.kube/config file kubectl uses. If kubectl get nodes works on your machine, k9s works too. No extra setup.
2. Learn the Core Navigation Keys
Everything in k9s starts with the command prompt. Press : and type a resource name:
:pods(or:po): list pods in the current namespace:deploy: deployments:svc: services:ns: namespaces, hit Enter on one to switch into it:ctx: switch between cluster contexts
Inside any list, / filters rows as you type, Esc goes back one level, and ? shows every keybinding for the current view. Those four keys cover most of what you do in the k9s Kubernetes interface all day. Muscle memory builds within a week.
3. Read Logs Without Typing Pod Names
This is the feature that sold me. In the pod list, highlight a pod and press l. Logs stream instantly. Press 0 to tail everything, 1 through 5 for time ranges, w to toggle line wrap, and s to pause the stream while you read.
Compare that to the kubectl version, where you copy a pod name like api-gateway-7d94f6b8c9-x2vlp, paste it into kubectl logs -f, and repeat the whole dance after every redeploy because the hash changed. The k9s Kubernetes interface tracks pod churn for you. The highlighted row is always current.
4. Shell Into Containers with One Key
Press s on a running pod and k9s drops you into a shell inside the container. If the pod has multiple containers, it asks which one. Behind the scenes it runs the same kubectl exec -it you would have typed, minus the typing.
I use this constantly when debugging DNS problems: shell in, run nslookup against the service name, and you know within seconds whether the issue is inside the cluster or outside it. For distroless images without a shell, k9s falls back gracefully and tells you instead of hanging.
5. Edit and Delete Resources in Place
Press e on any resource and it opens in your $EDITOR as YAML. Save and quit, and k9s applies the change. Press Ctrl-d to delete a resource, with a confirmation prompt before anything happens. Press d for describe output, the same text kubectl describe prints, scrollable in place.
One warning from experience: k9s is a live tool, not a dry-run tool. An edit applies to the cluster the moment you save. On production contexts I set readOnly: true in the config so a stray keystroke cannot delete a deployment.
6. Watch Resource Usage with Pulses and XRay
Type :pulse for a cluster-wide activity graph showing deployments, events, and pod restarts over time. Type :xray deploy to get a tree view that connects deployments to their replica sets, pods, and containers. When a rollout hangs, xray shows exactly which pod in the chain is stuck, which beats scanning three separate kubectl outputs.
If a metrics server is installed in the cluster, the k9s Kubernetes pod and node lists also show live CPU and memory columns, sortable by pressing the column shortcut keys. Sorting pods by memory is the fastest way I know to spot a leaking container.
7. Use Skins and Plugins to Make k9s Yours
Configuration lives in ~/.config/k9s/. Skins change colors per cluster, which sounds cosmetic but is a real safety feature: my production context is bright red, staging is yellow. There is no mistaking which cluster I am about to touch.
Plugins map custom commands to keys. A popular one wires Ctrl-l to stern for multi-pod log tailing. The official k9s documentation lists the plugin format and a library of community examples, from cert-manager checks to node drains.
8. Combine the k9s Kubernetes Workflow with Other Terminal Tools
k9s covers the cluster, but the rest of the container pipeline has equally good terminal tools. I inspect image layers with dive before pushing anything, scan images for CVEs with Trivy in CI, and manage the Git side with lazygit. All four follow the same philosophy: a fast TUI over a verbose CLI.
9. Know When kubectl Still Wins
The k9s Kubernetes dashboard is an interactive tool, and some jobs are not interactive. Scripts, CI pipelines, and anything you want to pipe into other commands still belong to kubectl and its -o json output. Complex one-off queries with custom columns or JSONPath are also easier typed than clicked. The kubectl reference remains worth knowing well, because k9s is a layer over it, not a replacement for it.
My rule: humans use k9s, machines use kubectl.
Why the k9s Kubernetes TUI Belongs in Your Toolbox
The tool has over 30,000 GitHub stars and a release cadence of roughly one update a month, so it tracks new Kubernetes versions closely. It costs nothing, installs in a minute, and reads the kubeconfig you already have.
Try this today: install it, type :pods, press l on something noisy, and watch the logs stream. That thirty-second test converts most people. It converted me, and the k9s Kubernetes workflow has been my default way into every cluster since.