# The old way — just to debug ONE crashing pod
-weight: 500;">kubectl get pods -n production
-weight: 500;">kubectl describe pod api-gateway-7d9f8b-xkp2q -n production
-weight: 500;">kubectl logs api-gateway-7d9f8b-xkp2q -n production --previous
-weight: 500;">kubectl exec -it api-gateway-7d9f8b-xkp2q -n production -- /bin/sh
-weight: 500;">kubectl port-forward api-gateway-7d9f8b-xkp2q 8080:80 -n production
# The old way — just to debug ONE crashing pod
-weight: 500;">kubectl get pods -n production
-weight: 500;">kubectl describe pod api-gateway-7d9f8b-xkp2q -n production
-weight: 500;">kubectl logs api-gateway-7d9f8b-xkp2q -n production --previous
-weight: 500;">kubectl exec -it api-gateway-7d9f8b-xkp2q -n production -- /bin/sh
-weight: 500;">kubectl port-forward api-gateway-7d9f8b-xkp2q 8080:80 -n production
# The old way — just to debug ONE crashing pod
-weight: 500;">kubectl get pods -n production
-weight: 500;">kubectl describe pod api-gateway-7d9f8b-xkp2q -n production
-weight: 500;">kubectl logs api-gateway-7d9f8b-xkp2q -n production --previous
-weight: 500;">kubectl exec -it api-gateway-7d9f8b-xkp2q -n production -- /bin/sh
-weight: 500;">kubectl port-forward api-gateway-7d9f8b-xkp2q 8080:80 -n production
____ __.________
| |/ _/ __ \______
| < \____ / ___/
| | \ / /\___ \
|____|__ \ /____//____ > \/ \/ K9s — Kubernetes CLI To Manage Your Clusters In Style!
____ __.________
| |/ _/ __ \______
| < \____ / ___/
| | \ / /\___ \
|____|__ \ /____//____ > \/ \/ K9s — Kubernetes CLI To Manage Your Clusters In Style!
____ __.________
| |/ _/ __ \______
| < \____ / ___/
| | \ / /\___ \
|____|__ \ /____//____ > \/ \/ K9s — Kubernetes CLI To Manage Your Clusters In Style!
-weight: 500;">brew -weight: 500;">install derailed/k9s/k9s
-weight: 500;">brew -weight: 500;">install derailed/k9s/k9s
-weight: 500;">brew -weight: 500;">install derailed/k9s/k9s
# Via webinstall
-weight: 500;">curl -sS https://webinstall.dev/k9s | bash # Via Snap
-weight: 600;">sudo snap -weight: 500;">install k9s # Via -weight: 500;">apt (Ubuntu/Debian)
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install k9s # Via binary — download from GitHub releases
-weight: 500;">wget https://github.com/derailed/k9s/releases/latest/download/k9s_Linux_amd64.tar.gz
tar -xzf k9s_Linux_amd64.tar.gz
-weight: 600;">sudo mv k9s /usr/local/bin/
# Via webinstall
-weight: 500;">curl -sS https://webinstall.dev/k9s | bash # Via Snap
-weight: 600;">sudo snap -weight: 500;">install k9s # Via -weight: 500;">apt (Ubuntu/Debian)
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install k9s # Via binary — download from GitHub releases
-weight: 500;">wget https://github.com/derailed/k9s/releases/latest/download/k9s_Linux_amd64.tar.gz
tar -xzf k9s_Linux_amd64.tar.gz
-weight: 600;">sudo mv k9s /usr/local/bin/
# Via webinstall
-weight: 500;">curl -sS https://webinstall.dev/k9s | bash # Via Snap
-weight: 600;">sudo snap -weight: 500;">install k9s # Via -weight: 500;">apt (Ubuntu/Debian)
-weight: 600;">sudo -weight: 500;">apt -weight: 500;">install k9s # Via binary — download from GitHub releases
-weight: 500;">wget https://github.com/derailed/k9s/releases/latest/download/k9s_Linux_amd64.tar.gz
tar -xzf k9s_Linux_amd64.tar.gz
-weight: 600;">sudo mv k9s /usr/local/bin/
# Chocolatey
choco -weight: 500;">install k9s # Scoop
scoop -weight: 500;">install k9s
# Chocolatey
choco -weight: 500;">install k9s # Scoop
scoop -weight: 500;">install k9s
# Chocolatey
choco -weight: 500;">install k9s # Scoop
scoop -weight: 500;">install k9s
-weight: 500;">docker run --rm -it \ -v ~/.kube/config:/root/.kube/config \ quay.io/derailed/k9s
-weight: 500;">docker run --rm -it \ -v ~/.kube/config:/root/.kube/config \ quay.io/derailed/k9s
-weight: 500;">docker run --rm -it \ -v ~/.kube/config:/root/.kube/config \ quay.io/derailed/k9s
k9s version
k9s # Launch!
k9s version
k9s # Launch!
k9s version
k9s # Launch!
1. :pod → open pod view
2. /api-gateway → filter by name
3. l → stream current logs
4. p → view previous container logs (before crash)
5. d → describe pod, check Events section
6. s → shell in if the pod is running
1. :pod → open pod view
2. /api-gateway → filter by name
3. l → stream current logs
4. p → view previous container logs (before crash)
5. d → describe pod, check Events section
6. s → shell in if the pod is running
1. :pod → open pod view
2. /api-gateway → filter by name
3. l → stream current logs
4. p → view previous container logs (before crash)
5. d → describe pod, check Events section
6. s → shell in if the pod is running
1. Ctrl+P → open the pulse metrics panel
2. :pod → go to pod view
3. Shift+M → sort by memory usage (highest first)
4. Select offender → Enter → select container
5. s → shell in and run `top` or `ps aux`
1. Ctrl+P → open the pulse metrics panel
2. :pod → go to pod view
3. Shift+M → sort by memory usage (highest first)
4. Select offender → Enter → select container
5. s → shell in and run `top` or `ps aux`
1. Ctrl+P → open the pulse metrics panel
2. :pod → go to pod view
3. Shift+M → sort by memory usage (highest first)
4. Select offender → Enter → select container
5. s → shell in and run `top` or `ps aux`
1. :deploy → open deployments view
2. Navigate to deployment
3. Ctrl+L → triggers rolling -weight: 500;">restart instantly
4. Enter → drill into pods and watch new ones come up live
1. :deploy → open deployments view
2. Navigate to deployment
3. Ctrl+L → triggers rolling -weight: 500;">restart instantly
4. Enter → drill into pods and watch new ones come up live
1. :deploy → open deployments view
2. Navigate to deployment
3. Ctrl+L → triggers rolling -weight: 500;">restart instantly
4. Enter → drill into pods and watch new ones come up live
1. :svc → open services view
2. Select -weight: 500;">service
3. Shift+F → port-forward dialog opens
4. Enter local port (e.g., 8080)
5. Access at localhost:8080 in your browser
6. :pf → manage or -weight: 500;">stop active port-forwards anytime
1. :svc → open services view
2. Select -weight: 500;">service
3. Shift+F → port-forward dialog opens
4. Enter local port (e.g., 8080)
5. Access at localhost:8080 in your browser
6. :pf → manage or -weight: 500;">stop active port-forwards anytime
1. :svc → open services view
2. Select -weight: 500;">service
3. Shift+F → port-forward dialog opens
4. Enter local port (e.g., 8080)
5. Access at localhost:8080 in your browser
6. :pf → manage or -weight: 500;">stop active port-forwards anytime
1. :node → open nodes view
2. Select the node to maintain
3. Ctrl+U → cordon it (no new pods scheduled)
4. Watch pods reschedule to other nodes in real time
5. Ctrl+D → drain the node (evict remaining pods)
6. Do your maintenance work
7. Ctrl+N → uncordon to bring it back
1. :node → open nodes view
2. Select the node to maintain
3. Ctrl+U → cordon it (no new pods scheduled)
4. Watch pods reschedule to other nodes in real time
5. Ctrl+D → drain the node (evict remaining pods)
6. Do your maintenance work
7. Ctrl+N → uncordon to bring it back
1. :node → open nodes view
2. Select the node to maintain
3. Ctrl+U → cordon it (no new pods scheduled)
4. Watch pods reschedule to other nodes in real time
5. Ctrl+D → drain the node (evict remaining pods)
6. Do your maintenance work
7. Ctrl+N → uncordon to bring it back
plugin: stern: shortCut: Shift-S description: "Stern multi-pod tail" scopes: - pods command: stern background: false args: - $NAME - -n - $NAMESPACE
plugin: stern: shortCut: Shift-S description: "Stern multi-pod tail" scopes: - pods command: stern background: false args: - $NAME - -n - $NAMESPACE
plugin: stern: shortCut: Shift-S description: "Stern multi-pod tail" scopes: - pods command: stern background: false args: - $NAME - -n - $NAMESPACE
plugin: vscode: shortCut: Shift-V description: "Open YAML in VSCode" scopes: - all command: bash background: false args: - -c - "-weight: 500;">kubectl get $RESOURCE_NAME $NAME -n $NAMESPACE -o yaml | code -"
plugin: vscode: shortCut: Shift-V description: "Open YAML in VSCode" scopes: - all command: bash background: false args: - -c - "-weight: 500;">kubectl get $RESOURCE_NAME $NAME -n $NAMESPACE -o yaml | code -"
plugin: vscode: shortCut: Shift-V description: "Open YAML in VSCode" scopes: - all command: bash background: false args: - -c - "-weight: 500;">kubectl get $RESOURCE_NAME $NAME -n $NAMESPACE -o yaml | code -"
:xray deploy default
:xray deploy default
:xray deploy default
Deployment/api-gateway └── ReplicaSet/api-gateway-7d9f8b ├── Pod/api-gateway-7d9f8b-xkp2q │ ├── Container/api-gateway (Running) │ └── Container/sidecar (Running) └── Pod/api-gateway-7d9f8b-r9pmk └── Container/api-gateway (Running)
Deployment/api-gateway └── ReplicaSet/api-gateway-7d9f8b ├── Pod/api-gateway-7d9f8b-xkp2q │ ├── Container/api-gateway (Running) │ └── Container/sidecar (Running) └── Pod/api-gateway-7d9f8b-r9pmk └── Container/api-gateway (Running)
Deployment/api-gateway └── ReplicaSet/api-gateway-7d9f8b ├── Pod/api-gateway-7d9f8b-xkp2q │ ├── Container/api-gateway (Running) │ └── Container/sidecar (Running) └── Pod/api-gateway-7d9f8b-r9pmk └── Container/api-gateway (Running)
k9s: refreshRate: 2 # seconds between refreshes maxConnRetry: 5 readOnly: false # set true to make read-only globally noExitOnCtrlC: false ui: enableMouse: false headless: false logoless: false crumbsless: false reactive: false noIcons: false skipLatestRevCheck: false disablePodCounting: false shellPod: image: busybox namespace: default limits: cpu: 100m memory: 100Mi
k9s: refreshRate: 2 # seconds between refreshes maxConnRetry: 5 readOnly: false # set true to make read-only globally noExitOnCtrlC: false ui: enableMouse: false headless: false logoless: false crumbsless: false reactive: false noIcons: false skipLatestRevCheck: false disablePodCounting: false shellPod: image: busybox namespace: default limits: cpu: 100m memory: 100Mi
k9s: refreshRate: 2 # seconds between refreshes maxConnRetry: 5 readOnly: false # set true to make read-only globally noExitOnCtrlC: false ui: enableMouse: false headless: false logoless: false crumbsless: false reactive: false noIcons: false skipLatestRevCheck: false disablePodCounting: false shellPod: image: busybox namespace: default limits: cpu: 100m memory: 100Mi
aliases: dp: deployments ing: ingresses sts: statefulsets pp: v1/pods crds: apiextensions.k8s.io/v1/customresourcedefinitions
aliases: dp: deployments ing: ingresses sts: statefulsets pp: v1/pods crds: apiextensions.k8s.io/v1/customresourcedefinitions
aliases: dp: deployments ing: ingresses sts: statefulsets pp: v1/pods crds: apiextensions.k8s.io/v1/customresourcedefinitions
-weight: 500;">brew -weight: 500;">install derailed/k9s/k9s && k9s
-weight: 500;">brew -weight: 500;">install derailed/k9s/k9s && k9s
-weight: 500;">brew -weight: 500;">install derailed/k9s/k9s && k9s - Why -weight: 500;">kubectl Alone Isn't Enough
- What is K9s?
- Installation
- Core Features
- Complete Shortcut Reference Global Navigation
Pod Management
Log Viewer
Services & Networking
Deployments, ReplicaSets & StatefulSets
Nodes & Cluster Management
ConfigMaps, Secrets & Storage
RBAC & Access Control
Jobs & CronJobs
Custom Resources (CRDs)
- Global Navigation
- Pod Management
- Services & Networking
- Deployments, ReplicaSets & StatefulSets
- Nodes & Cluster Management
- ConfigMaps, Secrets & Storage
- RBAC & Access Control
- Jobs & CronJobs
- Custom Resources (CRDs)
- All Resource Commands at a Glance
- 5 Workflows That Will Save You Hours
- Pro Tips & Power User Tricks - Global Navigation
- Pod Management
- Services & Networking
- Deployments, ReplicaSets & StatefulSets
- Nodes & Cluster Management
- ConfigMaps, Secrets & Storage
- RBAC & Access Control
- Jobs & CronJobs
- Custom Resources (CRDs) - ⭐ 30,000+ GitHub stars
- 🐕 Named after the "canine" unit — it "watches" your cluster
- 🔄 Real-time polling — no manual refresh needed
- 🔐 Fully RBAC-aware — respects your cluster permissions
- 🧩 Supports every Kubernetes resource including CRDs - Dracula — dark purple theme
- Tokyo Night — muted dark blues
- Catppuccin — soft pastel palette
- Monokai — classic terminal colors - 🔴 Misconfigured resources
- 🟡 Over-provisioned CPU/memory requests
- 🟠 Deprecated API versions in use
- 🔵 Missing resource limits
- 🔐 Security risks (privileged containers, host mounts) - ⚡ Speed — keyboard shortcuts beat -weight: 500;">kubectl commands every time
- 👁️ Visibility — real-time view of your entire cluster in one screen
- 🔍 Debugging — logs, shell, describe, events — all in two keystrokes
- 🛡️ Safety — --readonly mode for production, RBAC-aware by default
- 🧩 Extensible — plugins, skins, aliases, custom shortcuts
- 🆓 Free & Open Source — Apache 2.0 license, actively maintained - 🌐 K9s Official Website
- ⭐ K9s GitHub Repository
- 🎨 Community Skins
- 🔌 Community Plugins
- 📖 K9s Documentation