Cheatsheet - k9s
Start k9s
# Use default kubeconfig
$ k9s
# Use non-default kubeconfig
$ k9s --kubeconfig /path/to/kubeconfig
# Use non-default context
$ k9s --context fooctx
# Readonly
$ k9s --readonly
# Check info (locations for configuration, logs, screen dumps)
$ k9s info
Using k9s
List Resources
List a specific resource:
:<resource>: list Resources, e.g.:podto list all pods.:<resource> <namespace>: list Resources in a given namespace.
List all available resources / apis:
:aliasesorCtrl-a: list all available aliases and resources.:crd: list all CRDs.:apiservices: list all API Services
Filter
/<filter>: regex filter./!<filter>: inverse regex filter./-l <label>: filter by labels./-f <filter>: fuzzy match.
Choose namespace
Type :namespace, select the desired namespace by up or down key, press Enter to select.
Choose context
:ctx: list ctx, then select from the list.:ctx <context>: swtich to the specified context.
Show Decrypted Secrets
Type :secrets to list the secrets, then
xto decrypt the secret.Escto leave the decrypted display.
Key mappingg
- move up and down without moving your right hand:
j: down.k: up.h: leftl: right
SPACE: select multiple lines (e.g. thenCtrl-dto delete)y: yaml.d: describe.v: view.e: edit.l: logs.w: wrap.r: auto-refresh.s:Deploymentscreen: scale the number of replicas.PodorContainersscreen: shell
x: decode aSecret.f: fullscreen. Tip: enter fullscreen mode before copying, to avoid|in copied text.Ctrl-d: delete.Ctrl-k: kill (no confirmation).Ctrl-w: toggle wide columns. (Equivalent tokubectl ... -o wide)Ctrl-z: toggle error stateCtrl-e: hide header.Ctrl-s: save output (e.g. the YAML) to disk.Ctrl-l: rollback.
Sort by Column
Shift-c: sorts by CPU.Shift-m: sorts by MEMORY.Shift-s: sorts by STATUS.Shift-p: sorts by namespace.Shift-n: sorts by name.Shift-o: sorts by node.Shift-i: sorts by IP address.Shift-a: sorts by container age.Shift-t: sorts by number of restarts.Shift-r: sorts by pod readiness.
Helm
:helm: show helm releases.:helm NAMESPACE: show releases in a specific namespace.
User
There's no "user" object but in k9s you can see all the users by :users. Press Enter to see a list of Policies.
XRay View
:xray RESOURCE, e.g.:xray deploy.
Pulse View
:pulse: displays general information about the Kubernetes cluster.
Popeye View
:popeyeorpop: checks all resources for conformity with the correctness criteria and displays the resulting "rating" with explanations. https://popeyecli.io
Show Disk Files
:dir /path
E.g. :dir /tmp will show your /tmp folder on local disk. One common use case: Ctrl-s to save a yaml, then find it in :dir /tmp/k9s-screens-root, find the file, press e to edit and a to apply.
Quit
Esc: Bails out of view/command/filter mode.:qorCtrl-c: quit k9s.
Meaning of the Header
Most of the headers are easy to understand; some of the special ones:
%CPU/R: Percentage of requested CPU%CPU/L: Percentage of limited CPU%MEM/R: Percentage of requested memory%MEM/L: Percentage of limited memoryCPU/A: allocatable CPU
Pods:
pf: PortForward
Containers:
PROBES(L:R): Liveness and Readiness probes
FAQ
How to change among clusters?
Add all kubeconfig paths to $KUBECONFIG, then start k9s:
$ export KUBECONFIG=/path/to/kubeconfig1:/path/to/kubeconfig2:~/.kube/config:$KUBECONFIG
$ k9s
Inside k9s, type :ctx, then select the context to change to a different cluster.
How to scale up or scale down a deployment?
Go to the Deployments page, and press s, then enter a number for the desired num of ReplicaSet.
How to force delete a pod?
Ctrl-d, move cursor to Force, press space to select, click OK.
What is the plus (+) next to the namespace?
In k9s, some namespace foo may appear as foo+, the + denotes a favorite namespace, i.e. it will appear on the header with a number to quickly select the namespace, e.g. 0 to select all namespaces.
To add + to the namespace: select namespace in the list, press u (for "Use").
The * indicate the default namespace.
How to monitor resource usage?
Check CPU and MEM usage on the top left cornor of the screen;
Check usage in Node and Pod page;
This is equivalent to:
$ kubectl top nodes
$ kubectl top pods
$ kubectl top node <node_name>
Where are the k9s config files?
Note that all YAML files in the .k9s directory must have the .yml extension (.yaml doesn’t work).
$HOME/.k9s/views.yml: customize the column view for resource lists.$HOME/.k9s/plugin.yml: manage plugins.$XDG_CONFIG_HOME/k9s/config.yml: k9s config.$XDG_CONFIG_HOME/k9s/alias.yml: define your own alias.$XDG_CONFIG_HOME/k9s/hotkey.yml: define your own hotkeys.$XDG_CONFIG_HOME/k9s/plugin.yml: manage plugins.
How to Check Objects with the Same Name in Different API Groups
e.g. Cluster may be found in different api groups, like cluster.x-k8s.io or clusterregistry.k8s.io or baremetal.cluster.gke.io.
apiVersion: cluster.x-k8s.io/v1alpha3
kind: Cluster
apiVersion: clusterregistry.k8s.io/v1alpha1
kind: Cluster
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
Use apiVersion/kind (i.e. Group/Version/kind) instead of just kind to check the API of a specific group.
:cluster.x-k8s.io/v1alpha3/clusters:clusterregistry.k8s.io/v1alpha1/clusters:baremetal.cluster.gke.io/v1/clusters
Or go to the CRDs page (:crd), move to the correct row, press enter.
How to change log setting
Change ~/.config/k9s/config.yml:
logger:
tail: 500
buffer: 5000
sinceSeconds: -1
How to monitor what's going on:
:event(or:ev): see the stream of events.:pod: see the list of podsShift-ato sort by age.:job: see the list of jobs, ordered by time by default.
What if editing a yaml in k9s is reverted back?
Find the controller that manages the CR, scale it down for deletion.
# Scale down the controllers:
$ kubectl scale --replicas=0 deployment/CONTROLLER_MANAGER_NAME -n NAMESPACE
# Edit the manifest, e.g. changing a field `foo` to true
$ kubectl patch KIND NAME -n NAMESPACE --type=json -p="[{'op': 'replace', 'path': '/spec/foo', 'value': true}]"
# Scale up the controllers:
$ kubectl scale --replicas=1 deployment/CONTROLLER_MANAGER_NAME -n NAMESPACE
Where to find k9s logs?
$ k9s info | grep Logs
Logs: /root/.local/state/k9s/k9s.log
Benchmark
k9s includes a basic HTTP load generator.
To enable it, you have to configure port forwarding in the pod. Select the pod and press SHIFT + f, go to the port-forward menu (using the pf alias).
After selecting the port and hitting CTRL + b, the benchmark would start. Its results are saved in /tmp for subsequent analysis.
To change the configuration of the benchmark, create the $HOME/.k9s/bench-<my_context>.yml file (unique for each cluster).
Plugins
https://github.com/derailed/k9s/tree/master/plugins
Install
# Go
$ go install github.com/derailed/k9s@latest
# Homebrew / LinuxBrew
$ brew install derailed/k9s/k9s
# MacPort
sudo port install k9s
# Snap
sudo snap install k9s
# PacMan
pacman -S k9s
# Windows: scoop
scoop install k9s
# Windows: chocolatey
choco install k9s