K9s 完整指南:Kubernetes 终端 UI、快捷键大全、多集群切换与高级玩法
Kubernetes 的对象很多,kubectl get、kubectl describe、kubectl logs、kubectl exec、kubectl port-forward 足够强,但当你每天都要在 Pod、Deployment、Service、ConfigMap、Secret、Node、Namespace、CRD 之间来回跳转时,纯命令行会变成大量重复输入。
K9s 解决的正是这个问题:它把 Kubernetes API 变成一个可搜索、可过滤、可跳转、可执行操作的终端 UI。你仍然使用 kubeconfig、context、namespace 和 RBAC;K9s 只是把这些能力组织成更高效的交互界面。
截至 2026-06-26,K9s GitHub 最新 release 是 v0.51.0,发布时间是 2026-06-06。本文按当前官方文档、README 与 v0.51.x 系列行为整理。

一、K9s 适合解决什么问题
K9s 不是 kubectl 的替代品,而是一个更适合高频浏览和排障的操作层。
| 场景 | 直接用 kubectl | 用 K9s |
|---|---|---|
| 临时脚本、CI、自动化 | 更合适,可复制、可审计 | 不适合自动化 |
| 查看大量资源 | 需要反复输入 get/describe/logs | 直接搜索、过滤、排序、跳转 |
| Pod 排障 | 多条命令串联 | d、l、p、s、y 连续操作 |
| 多 namespace 巡检 | 反复加 -n 或 -A | :ns、all、过滤器 |
| 多集群切换 | kubectl config use-context | :ctx 或 k9s --context |
| 生产只读观察 | 依赖 RBAC 或习惯 | --readonly 加 context 配置双保险 |
我的建议是:
kubectl = 精确命令、脚本、GitOps、审计、可复现操作
K9s = 日常浏览、快速排障、交互式观察、临时操作
如果你正在学习 Kubernetes,K9s 还能帮你建立资源之间的连接感:Deployment 管 ReplicaSet,ReplicaSet 管 Pod,Service 指向 Endpoints,Pod 跑在 Node 上,ConfigMap/Secret 被谁引用。用图形化 Dashboard 也能做到,但 K9s 的优势是它仍然在终端里,和你的 shell、SSH、tmux、Neovim、日志工具天然贴合。
二、安装与启动
macOS 推荐使用 Homebrew:
brew install derailed/k9s/k9s
k9s version
Linux 可以按发行版选择:
# Arch Linux
sudo pacman -S k9s
# Fedora 42+
sudo dnf install k9s
# Ubuntu/Debian 可直接安装最新 deb 包
wget https://github.com/derailed/k9s/releases/latest/download/k9s_linux_amd64.deb
sudo apt install ./k9s_linux_amd64.deb
rm k9s_linux_amd64.deb
Windows 常用方式:
winget install k9s
# 或
scoop install k9s
# 或
choco install k9s
如果你不想在本机安装,也可以用容器方式运行,关键是把 kubeconfig 挂进去:
docker run --rm -it \
-v ~/.kube/config:/root/.kube/config \
derailed/k9s
启动前建议检查三件事:
# 1. 终端颜色能力,Linux/Unix 上尤其重要
export TERM=xterm-256color
# 2. 确认 kubectl 能访问集群
kubectl config current-context
kubectl get ns
# 3. 如果要在 K9s 里编辑资源,设置编辑器
export KUBE_EDITOR=nvim
# 或
export EDITOR=nvim
常用启动命令:
# 默认使用当前 kubeconfig context
k9s
# 查看 K9s 版本
k9s version
# 查看配置、日志、插件、hotkeys、skins 等路径
k9s info
# 打开指定 namespace
k9s -n kube-system
# 启动后直接进入 Pod 视图
k9s -c pod
# 打开指定 kubeconfig context
k9s --context prod-us-east
# 只读模式,禁用 delete/kill/edit 等修改动作
k9s --readonly
# 排查 K9s 自身问题时开启 debug 日志
k9s -l debug
三、先理解 K9s 的交互模型
K9s 的界面可以理解为四层:
| 层级 | 作用 |
|---|---|
| Context | 当前连接哪个 Kubernetes 集群和用户 |
| Namespace | 当前关注哪个命名空间,也可以看 all |
| View | 当前资源视图,例如 Pods、Deployments、Services |
| Action | 对选中资源执行 describe、logs、edit、delete、shell、port-forward 等动作 |
使用时最重要的三个入口是:
| 入口 | 用法 |
|---|---|
| 命令模式 | 按 :,输入资源名、别名或命令 |
| 过滤模式 | 按 /,输入正则、标签选择器或 fuzzy 条件 |
| 帮助面板 | 按 ?,查看当前视图可用快捷键 |
一个典型排障流程像这样:
:po 进入 Pod 视图
/checkout 过滤名字包含 checkout 的 Pod
d describe 当前 Pod
l 查看当前 Pod 日志
p 查看 previous logs
s shell 进入容器
y 查看 YAML
esc 返回上一层
K9s 的核心不是记住所有键,而是形成一个反射:先进入资源视图,再过滤,再对选中资源执行动作。
四、命令模式:用 : 跳到任何资源
按 : 后输入命令,回车执行。K9s 支持 Kubernetes 资源的单数、复数、short name,也支持 K9s 自己的别名。
常用资源入口:
| 命令 | 说明 |
|---|---|
:po / :pod / :pods | Pod |
:deploy / :dp | Deployment |
:sts | StatefulSet |
:ds | DaemonSet |
:rs | ReplicaSet |
:svc | Service |
:ep | Endpoints |
:ing | Ingress |
:cm | ConfigMap |
:secret | Secret |
:sa | ServiceAccount |
:role / :rolebinding | Namespace 级 RBAC |
:clusterrole / :clusterrolebinding | 集群级 RBAC |
:no / :node | Node |
:ns | Namespace |
:pvc / :pv | PersistentVolumeClaim / PersistentVolume |
:job / :cj | Job / CronJob |
:crd | CustomResourceDefinition |
:ctx | Context 列表与切换 |
命令模式还支持直接带条件:
:pod kube-system
:pod /coredns
:pod app=checkout,env=prod
:pod @prod-us-east
:xray deploy
:pulses
:screendump
这些写法分别表示:
| 写法 | 作用 |
|---|---|
:pod kube-system | 查看指定 namespace 的 Pod |
:pod /coredns | 进入 Pod 视图并按名称过滤 |
:pod app=checkout,env=prod | 按 label selector 查看 Pod |
:pod @prod-us-east | 查看某个 context 的 Pod,并切换当前 context |
:xray deploy | 打开 Deployment 资源关系视图 |
:pulses / :pu | 打开集群脉冲视图 |
:screendump / :sd | 查看保存的资源快照 |
不确定资源名时,按 ctrl-a 可以查看可用资源 alias;在命令模式里也可以使用自动建议,按方向键选择,按 Tab、ctrl-f 或右方向键接受建议。
五、过滤、排序与资源浏览
进入某个资源视图后,最常用的是过滤和排序。
| 动作 | 快捷键 / 写法 | 说明 |
|---|---|---|
| 普通过滤 | /checkout | 用正则过滤当前表格 |
| 反向过滤 | /!checkout | 保留不匹配的资源 |
| 标签过滤 | /-l app=checkout | 使用 label selector |
| Fuzzy 查找 | /-f checkout | 模糊查找 |
| 退出过滤/命令模式 | Esc | 返回表格视图 |
| 刷新视图 | ctrl-r | 重新加载当前视图 |
| 切换 wide columns | ctrl-w | 展示更宽的列 |
| 切换 header | ctrl-e | 显示/隐藏头部 |
| 切换 breadcrumbs | ctrl-g | 显示/隐藏导航面包屑 |
| 切换错误展示 | ctrl-z | 展示/隐藏故障类资源 |
排序相关:
| 排序 | 快捷键 |
|---|---|
| 按当前列排序 | shift-o |
| 按名称排序 | shift-n |
| 按 Age 排序 | shift-a |
| 按 Namespace 排序 | shift-p |
| 按 Status 排序 | shift-s |
| 选中列左移 | shift-left arrow |
| 选中列右移 | shift-right arrow |
资源复制和标记:
| 动作 | 快捷键 |
|---|---|
| 复制资源名 | c |
| 复制 namespace | n |
| 标记资源 | space |
| 标记一段资源 | ctrl-space |
| 清空标记 | Ctrl+Backslash |
| 保存资源到文件 | ctrl-s |
标记资源适合批量操作前先确认目标,例如批量删除前先标记资源。但生产环境里更建议少做批量交互式修改,能走 GitOps 就走 GitOps。
六、资源动作快捷键大全
不同资源视图的快捷键会不一样,所以永远以 ? 中显示的当前视图菜单为准。下面是日常最常用的一组。
6.1 全局导航
| 动作 | 快捷键 |
|---|---|
| 帮助 | ? |
| 资源 alias 列表 | ctrl-a |
| 进入命令模式 | : |
| 进入过滤模式 | / |
| 退出命令/过滤/当前层 | Esc |
| 退出 K9s | :q / :quit / ctrl-c |
| 回到上一个有效命令 | - |
| 命令历史后退 | [ |
| 命令历史前进 | ] |
6.2 通用资源动作
| 动作 | 快捷键 | 备注 |
|---|---|---|
| Describe | d | 类似 kubectl describe |
| 查看 YAML | y | 查看完整资源清单 |
| 编辑资源 | e | 只读模式不可用 |
| 删除资源 | ctrl-d | 需要确认 |
| 立即 kill/delete now | ctrl-k | 高风险,慎用 |
| 跳到 owner | shift-j | 资源存在 owner 时可用 |
| Warp 到 namespace | w | 当前表格有 namespace 列时可用 |
| UsedBy | u | ServiceAccount、PVC、Secret、ConfigMap 等视图里常见 |
6.3 Pod / Container
| 动作 | 快捷键 | 备注 |
|---|---|---|
| 查看日志 | l | 当前 Pod 或容器 |
| 查看 previous logs | p | 排查 CrashLoopBackOff 很有用 |
| Shell 进入容器 | s | 类似 kubectl exec -it |
| Attach 容器 | a | 连接到容器进程 |
| 查看 port-forwards | f | Pod/Service/Container 相关视图 |
| 创建 port-forward | shift-f | Pod/Service/Container 相关视图 |
日志视图内部:
| 动作 | 快捷键 |
|---|---|
| 切换换行 | w |
| 切换时间戳 | t |
| 全屏日志 | f |
| 过滤日志 | / |
| 退出日志 | Esc |
6.4 Workload
| 资源 | 动作 | 快捷键 |
|---|---|---|
| Deployment / DaemonSet / StatefulSet | Restart | r |
| Deployment | 查看 ReplicaSets | z |
| ReplicaSet | Rollback | ctrl-l |
| CronJob | Trigger | t |
这里要注意,r 是上下文相关的:在 Deployment 里通常是 restart,在 Node 里可能是 drain。不要脱离当前视图记快捷键。
6.5 Node
| 动作 | 快捷键 | 备注 |
|---|---|---|
| Cordon / Uncordon | u | 控制是否可调度 |
| Drain | r | 驱逐节点上的 Pod,高风险 |
| Node Shell | s | 需要启用 nodeShell feature gate |
Node 视图里的操作会影响集群调度,生产环境里建议配合 --readonly、RBAC 和变更流程使用。
七、日志、Shell 与端口转发
7.1 日志
排查 Pod 最常用的是:
:po
/服务名或 Pod 名
l
如果 Pod 正在 CrashLoopBackOff,先看 previous logs:
p
可以在配置里调整日志默认行为:
# config.yaml
k9s:
logger:
tail: 200
buffer: 5000
sinceSeconds: 300
textWrap: false
showTime: false
sinceSeconds: 300 表示默认看最近 5 分钟;-1 通常表示持续 tail。日志量很大的服务不要把 buffer 设置得过大,否则终端 UI 会变慢。
7.2 Shell 进入容器
在 Pod 或 Container 视图选中目标后按:
s
这等价于一次交互式 exec。它适合临时查看文件、执行探针命令、确认环境变量,但不要把它变成“手工修改容器”的入口。容器应该是不可变的,修复应该回到镜像、配置或部署清单。
7.3 端口转发
Pod、Service、Container 相关视图里:
| 动作 | 快捷键 |
|---|---|
| 查看已有 port-forward | f |
| 创建 port-forward | shift-f |
可以用环境变量覆盖默认监听地址:
export K9S_DEFAULT_PF_ADDRESS=127.0.0.1
如果某些服务经常要转发端口,可以在清单里使用 K9s 支持的注解,减少每次手动选择容器和端口:
metadata:
annotations:
k9scli.io/auto-port-forwards: api::8080
k9scli.io/port-forwards: web::9090:http
含义是:
| 注解 | 作用 |
|---|---|
k9scli.io/auto-port-forwards | 打开端口转发时自动选择目标 |
k9scli.io/port-forwards | 打开对话框时预选目标 |
格式是:
container-name::[local-port:]container-port
生产环境不要随意把监听地址改成 0.0.0.0,除非你明确知道本机网络暴露范围。
八、多集群与多 namespace 切换
K9s 使用的仍然是 kubeconfig context。先用 kubectl 确认当前有哪些 context:
kubectl config get-contexts
kubectl config current-context
启动时选择 context:
k9s --context dev
k9s --context staging
k9s --context prod-us-east --readonly
在 K9s 内切换 context:
:ctx
进入 Context 视图后选择目标 context。也可以直接:
:ctx prod-us-east
查看某个 context 的资源时,可以这样:
:pod @prod-us-east
官方文档明确说明,这种写法会切换当前 K9s context,所以不要把它当成“临时远程查询”。如果只是想开两个集群窗口,更推荐直接开两个终端:
k9s --context dev
k9s --context prod-us-east --readonly

Namespace 切换:
:ns
进入 Namespace 视图后,选中 namespace,按当前视图菜单提示切换。也可以在资源命令里直接带 namespace:
:pod kube-system
:svc ingress-nginx
:deploy checkout
8.1 多 kubeconfig 文件
如果你把 dev、stage、prod 分成多个 kubeconfig,可以用 Kubernetes 标准的 KUBECONFIG 合并:
export KUBECONFIG="$HOME/.kube/dev:$HOME/.kube/staging:$HOME/.kube/prod"
kubectl config get-contexts
k9s
也可以显式为不同窗口指定 kubeconfig:
KUBECONFIG=$HOME/.kube/dev k9s --context dev
KUBECONFIG=$HOME/.kube/prod k9s --context prod --readonly
我更推荐生产环境使用显式启动脚本或 alias:
alias k9sd='KUBECONFIG=$HOME/.kube/dev k9s --context dev'
alias k9ss='KUBECONFIG=$HOME/.kube/staging k9s --context staging'
alias k9sp='KUBECONFIG=$HOME/.kube/prod k9s --context prod --readonly'
8.2 生产安全切换策略
多集群最大的风险不是“切不过去”,而是“切到了生产却以为自己还在测试”。建议做四层防护:
| 层级 | 做法 |
|---|---|
| kubeconfig | prod 单独文件,不和个人实验集群混在一起 |
| RBAC | 日常账号默认只读,变更使用单独流程 |
| K9s 启动 | prod alias 强制 --readonly |
| 视觉提醒 | prod 使用独立 skin,例如红/琥珀色标题与边框 |
K9s 支持 context 级配置。实际路径以 k9s info 输出为准,通常在 $XDG_DATA_HOME/k9s/clusters/<cluster>/<context>/config.yaml 一类目录下:
k9s:
cluster: prod-us-east
readOnly: true
skin: prod
namespace:
active: default
lockFavorites: false
favorites:
- all
- kube-system
- ingress-nginx
- payments
view:
active: po
这样即使你忘记加 --readonly,context 配置也会继续把该集群保持为只读。
九、配置文件:用 k9s info 找准路径
K9s 使用 XDG 目录规范,但不同操作系统和版本的默认路径不完全相同。官方文档给出的常见位置是:
| 系统 | 配置目录 |
|---|---|
| Unix/Linux | ~/.config/k9s |
| macOS | ~/Library/Application Support/k9s |
| Windows | %LOCALAPPDATA%\k9s |
最可靠的方式是:
k9s info
它会告诉你:
Config:
Logs:
Dumps dir:
Benchmarks dir:
Skins dir:
Contexts dir:
Custom views file:
Plugins file:
Hotkeys file:
Alias file:
如果你想把 K9s 配置放到固定目录,可以设置:
export K9S_CONFIG_DIR=$HOME/.config/k9s
一个适合日常使用的基础配置:
k9s:
refreshRate: 2
apiServerTimeout: 15s
maxConnRetry: 5
readOnly: false
defaultView: po
noExitOnCtrlC: false
portForwardAddress: localhost
ui:
enableMouse: false
headless: false
logoless: false
crumbsless: false
splashless: false
noIcons: false
reactive: false
skin: dracula
defaultsToFullScreen: false
logger:
tail: 200
buffer: 5000
sinceSeconds: 300
textWrap: false
showTime: false
thresholds:
cpu:
warn: 70
critical: 90
memory:
warn: 70
critical: 90
几个关键项:
| 配置 | 作用 |
|---|---|
refreshRate | UI 轮询刷新间隔,太小会增加 API 压力 |
apiServerTimeout | API server 请求超时时间 |
readOnly | 禁用修改类命令 |
defaultView | 默认进入哪个资源视图 |
portForwardAddress | port-forward 默认监听地址 |
logger.tail | 打开日志时默认读取多少行 |
thresholds | CPU/内存告警阈值 |
远程终端复制资源名时,可以关注当前 README 中提到的剪贴板环境变量:
export K9S_CLIPBOARD=auto
# 可选:native 或 osc52
当你在 SSH、tmux、iTerm2、VS Code 远程终端之间切换时,OSC52 剪贴板可能比系统剪贴板工具更稳定。
十、Hotkeys:给高频视图绑定快捷键
命令模式很好用,但每天输入 :deploy、:po app=xxx、:xray deploy 仍然麻烦。K9s 支持自定义 hotkeys,并且会在帮助视图 ? 中展示。
路径以 k9s info 的 Hotkeys file 为准。常见配置文件名是 hotkeys.yaml。
hotKeys:
shift-0:
shortCut: Shift-0
description: View Pods
command: pods
shift-1:
shortCut: Shift-1
description: View Deployments
command: deploy
shift-2:
shortCut: Shift-2
description: XRay Deployments
command: xray deploy
shift-3:
shortCut: Shift-3
description: Failed Pods
command: pod /!Running
更高级一点,可以使用当前资源变量:
hotKeys:
shift-s:
shortCut: Shift-S
override: true
description: Same resource in selected namespace
command: "$RESOURCE_NAME $NAMESPACE"
keepHistory: true
适合绑定的视图:
| 快捷键 | 建议命令 | 用途 |
|---|---|---|
Shift-0 | pods | 快速回到 Pod |
Shift-1 | deploy | 快速看 Deployment |
Shift-2 | xray deploy | 看资源关系 |
Shift-3 | svc | 看服务入口 |
Shift-4 | ing | 看入口流量 |
Shift-5 | events | 看事件 |
如果某个快捷键和 K9s 内置快捷键冲突,不要硬覆盖,除非你明确知道这个动作在当前团队里更重要。
十一、Aliases:给长资源名和 CRD 起短名
Kubernetes 里很多 CRD 名字很长,例如 Argo Rollouts、Istio、Gateway API、External Secrets、Cert Manager。K9s aliases 可以把长资源映射成短命令。
路径同样以 k9s info 的 Alias file 为准。示例:
aliases:
pp: v1/pods
dep: apps/v1/deployments
crb: rbac.authorization.k8s.io/v1/clusterrolebindings
vs: networking.istio.io/v1beta1/virtualservices
gw: gateway.networking.k8s.io/v1/gateways
eso: external-secrets.io/v1beta1/externalsecrets
cert: cert-manager.io/v1/certificates
也可以把 alias 指向一条命令:
aliases:
paypods: pod payments app=checkout
syspods: pod kube-system
然后在 K9s 里直接输入:
:paypods
:vs
:cert
对于平台团队,建议把常用 CRD aliases 纳入 dotfiles 或内部开发环境模板,让所有人使用同一套短名。
十二、Plugins:把团队命令接进 K9s
K9s plugins 可以把外部命令挂到某些资源视图上。官方文档说明 K9s 会查找:
| 位置 | 用途 |
|---|---|
$XDG_CONFIG_HOME/k9s/plugins.yaml | 主插件文件 |
$XDG_CONFIG_HOME/k9s/plugins | 配置目录下插件片段 |
$XDG_DATA_HOME/k9s/plugins | 数据目录下插件片段 |
$XDG_DATA_DIRS/k9s/plugins | 系统级插件片段 |
context 目录下 plugins.yaml | context 级插件 |
插件可以使用 K9s 注入的环境变量,例如:
| 变量 | 含义 |
|---|---|
$NAME / $RESOURCE_NAME | 当前选中资源名 |
$NAMESPACE | 当前资源 namespace |
$CONTAINER | 当前容器 |
$KUBECONFIG | 当前 kubeconfig |
$CLUSTER | 当前集群名 |
$CONTEXT | 当前 context |
$USER | 当前用户 |
$FILTER | 当前过滤条件 |
示例:给 Pod 视图增加一个 Ctrl-L,用 kubectl logs -f 追日志:
plugins:
tail-selected-pod:
shortCut: Ctrl-L
description: Tail pod logs
scopes:
- po
command: kubectl
background: false
args:
- logs
- -f
- $NAME
- -n
- $NAMESPACE
- --context
- $CONTEXT
示例:调用 stern 聚合日志:
plugins:
stern-namespace:
shortCut: Shift-L
description: Stern logs in namespace
scopes:
- po
command: stern
background: false
args:
- $NAME
- -n
- $NAMESPACE
- --context
- $CONTEXT
插件适合接入这些团队工具:
| 工具 | 用法 |
|---|---|
stern / kubetail | 多 Pod 日志聚合 |
kubectl-neat | 清理 YAML 中的运行时字段 |
kubectl tree | 查看 owner 关系 |
kubectl trace / debug 工具 | 临时排查 |
| 内部 CLI | 查看发布单、告警、服务 owner |
插件的风险也很明确:它可以执行任意本地命令。团队共享插件前要做代码审查,尤其是带删除、扩缩容、变更配置、访问 Secret 的命令。

十三、Skins:给环境建立视觉边界
K9s skins 是 YAML 主题。它不只是美化,真正价值是让环境一眼可辨认。
建议:
| 环境 | Skin 思路 |
|---|---|
| dev | 冷色、低警戒 |
| staging | 蓝/紫色 |
| prod | 琥珀/红色状态、明显边框 |
全局设置可以写在配置里:
k9s:
ui:
skin: dracula
也可以通过环境变量覆盖:
export K9S_SKIN=dracula
k9s
context 级 skin 更适合多集群:
k9s:
cluster: prod-us-east
readOnly: true
skin: prod
生产环境最好同时满足:
prod context = 只读 + 独立 kubeconfig + 独立 skin + 明确 alias
不要只靠颜色防误操作,颜色只能降低认知错误,不能替代权限控制。
十四、Custom Views:定制表格列
K9s 支持通过 views.yaml 自定义资源表格列。它适合把团队关心的 label、annotation、资源限制、owner 字段提到表格里。
示例:给 Pod 视图定制列:
views:
v1/pods:
columns:
- AGE
- NAMESPACE|WR
- NAME
- READY
- STATUS
- RESTARTS
- IP
- NODE
- APP:.metadata.labels.app
- TEAM:.metadata.labels.team
- VERSION:.metadata.labels.version
- '%CPU/L'
- '%MEM/L'
列配置要注意:
| 规则 | 说明 |
|---|---|
| 使用 GVR | 例如 v1/pods、apps/v1/deployments |
| JSON path 类表达式 | 从 manifest 中抽取字段 |
| 特殊列名加引号 | 如 '%MEM/L' |
| 属性追加 | 例如 R 右对齐,W wide 列,S 强制显示 |
| 出错看 K9s 日志 | 配置错误通常在 k9s.log 中更清楚 |
适合加到列里的字段:
| 字段 | 价值 |
|---|---|
app / component | 快速按服务识别 |
team / owner | 排障时找负责方 |
version / commit | 判断发布版本 |
rollouts-pod-template-hash | 对比发布批次 |
| 自定义 SLO 标签 | 识别高优先级服务 |
十五、高级玩法
15.1 XRay:看资源关系
:xray deploy
:xray svc
:xray po
XRay 适合理解对象关系,例如:
Deployment -> ReplicaSet -> Pod
Service -> Endpoints -> Pod
StatefulSet -> Pod -> PVC
当你接手一个陌生 namespace,先用 :xray deploy 看一圈,通常比逐个 kubectl describe 更快。
15.2 Pulses:看集群脉冲
:pulses
# 或
:pu
Pulses 用于看整体资源状态、事件和健康信号。它不是 Prometheus/Grafana 的替代品,但适合在终端里快速回答:
现在集群里哪里红了?
哪个 namespace 有异常?
资源是否正在大面积变化?
15.3 Node Shell
K9s 支持在 Node 视图中进入节点 shell,但需要启用 feature gate。它会在目标节点上启动一个 shell pod。
全局 shell pod 配置示例:
k9s:
shellPod:
image: busybox:1.35.0
namespace: default
limits:
cpu: 100m
memory: 100Mi
tty: true
context 级启用:
k9s:
cluster: prod-us-east
featureGates:
nodeShell: true
也可以用环境变量覆盖:
export K9S_FEATURE_GATE_NODE_SHELL=true
Node shell 权限很敏感。建议只在受控排障场景打开,使用专门的 admin 镜像,并明确限制哪些人可以使用。
15.4 Popeye 集群体检
K9s 集成了 Popeye 入口:
:popeye
# 或
:pop
Popeye 用于扫描 Kubernetes 配置中的常见问题,例如资源限制、探针、镜像、服务引用、RBAC 等。它更像“集群卫生检查”,适合在发布前或巡检时使用。
15.5 Benchmark
在 Service 或 port-forward 相关视图里,b 可以运行或停止 benchmark。它适合做非常轻量的连通性和吞吐观察,但不要把它当作正式压测工具。正式压测仍然应该使用 k6、wrk、hey、Locust 等工具,并配合隔离环境与容量保护。
15.6 只读模式
只读模式是生产环境必备:
k9s --readonly
配置里也可以开启:
k9s:
readOnly: true
只读模式会禁用修改命令,例如 delete、kill、edit。注意它不是 Kubernetes RBAC 的替代品。真正的权限边界仍然要靠 kube-apiserver 的认证授权。
十六、生产排障工作流
16.1 Pod CrashLoopBackOff
:po
/服务名
d
p
l
y
检查顺序:
d看 Events:镜像拉取失败、探针失败、调度失败、OOMKilled。p看 previous logs:容器刚崩溃时,当前日志可能为空。l看实时日志:确认是否启动后马上退出。y看环境变量、资源限制、volume、probe。- 回到 Deployment 看 rollout 和 ReplicaSet。
16.2 Service 不通
:svc
/服务名
d
:ep
/服务名
shift-f
检查顺序:
| 检查 | 目标 |
|---|---|
| Service selector | 是否能选中 Pod |
| Endpoints | 是否有后端地址 |
| Pod readiness | Service 只接 ready Pod |
| port/targetPort | 是否和容器端口一致 |
| NetworkPolicy | 是否拦截流量 |
| port-forward | 区分服务内部问题和入口问题 |
16.3 发布后异常
:deploy
/服务名
d
z
:rs
:po
/服务名
检查:
| 对象 | 看什么 |
|---|---|
| Deployment | desired/current/available 是否一致 |
| ReplicaSet | 新旧版本副本分布 |
| Pod | 是否集中失败在新版本 |
| Events | 镜像、调度、探针、权限 |
| Logs | 应用启动和依赖错误 |
需要重启时,在 Deployment 视图按 r。需要回滚时,通常应该优先走发布系统或 GitOps;如果必须在 K9s 操作,先确认当前视图和目标资源,再按帮助菜单执行。
16.4 Node 压力
:node
shift-o
d
看:
| 信号 | 说明 |
|---|---|
| CPU / Memory | 是否整体资源紧张 |
| DiskPressure | 镜像、日志、emptyDir 是否占满 |
| PIDPressure | 进程数是否异常 |
| NotReady | kubelet、网络、运行时是否故障 |
| Pod 分布 | 是否单点过载 |
u cordon/uncordon 和 r drain 都属于高风险操作,建议只在变更窗口和明确 runbook 下执行。
十七、我的推荐配置组合
如果你刚开始用 K9s,可以按这个顺序逐步配置:
第一阶段:默认配置 + 熟悉 :po / :deploy / :svc / :ns / :ctx
第二阶段:配置 logger、skin、defaultView
第三阶段:给 dev/stage/prod 建不同 alias 和 skin
第四阶段:加 hotkeys 和 aliases
第五阶段:接入团队 plugins 和 custom views
一个比较稳的 shell 配置:
export KUBE_EDITOR=nvim
export K9S_CLIPBOARD=auto
alias k9sd='KUBECONFIG=$HOME/.kube/dev k9s --context dev'
alias k9ss='KUBECONFIG=$HOME/.kube/staging k9s --context staging'
alias k9sp='KUBECONFIG=$HOME/.kube/prod k9s --context prod --readonly'
一个比较稳的 K9s 习惯:
| 习惯 | 原因 |
|---|---|
| 先看右上角 context/namespace | 避免误集群、误 namespace |
| 生产只读启动 | 防止交互式误操作 |
任何高风险键先按 ? | 不同视图快捷键不同 |
| 删除、drain、kill 前停 3 秒 | 确认资源名和环境 |
| 修改类动作回到 GitOps | 保持审计和可复现 |
| 插件统一维护 | 避免每个人本地命令不一致 |
十八、快捷键速查表
最后把高频快捷键压成一张速查表。
| 类别 | 快捷键 / 命令 | 作用 |
|---|---|---|
| 帮助 | ? | 当前视图帮助 |
| 资源别名 | ctrl-a | 查看 resource alias |
| 命令模式 | : | 跳转资源/执行命令 |
| 过滤 | / | 过滤当前列表 |
| 退出 | Esc | 返回/退出当前模式 |
| 退出 K9s | :q / ctrl-c | 关闭 K9s |
| Context | :ctx | 切换集群 context |
| Namespace | :ns | 切换 namespace |
| Pod | :po | Pod 视图 |
| Deployment | :deploy / :dp | Deployment 视图 |
| Service | :svc | Service 视图 |
| Node | :node / :no | Node 视图 |
| XRay | :xray deploy | 资源关系视图 |
| Pulses | :pulses / :pu | 集群脉冲视图 |
| Describe | d | 描述资源 |
| YAML | y | 查看 YAML |
| Edit | e | 编辑资源 |
| Logs | l | 当前日志 |
| Previous logs | p | 上一次容器日志 |
| Shell | s | 进入容器或节点 shell |
| Attach | a | attach 容器 |
| Port-forward 列表 | f | 查看转发 |
| 创建 port-forward | shift-f | 新建转发 |
| 删除 | ctrl-d | 删除资源,带确认 |
| Kill | ctrl-k | 立即删除,高风险 |
| Restart | r | Workload 重启;Node 视图为 drain |
| Rollback | ctrl-l | ReplicaSet 回滚 |
| Trigger | t | CronJob 触发 |
| Cordon/Uncordon | u | Node 视图 |
| Jump owner | shift-j | 跳到 owner |
| Refresh | ctrl-r | 刷新 |
| Wide columns | ctrl-w | 切换宽列 |
| Header | ctrl-e | 切换头部 |
| Breadcrumbs | ctrl-g | 切换面包屑 |
| Faults | ctrl-z | 切换故障显示 |
| 复制名称 | c | 复制资源名 |
| 复制 namespace | n | 复制 namespace |
| 标记 | space | 标记资源 |
| 标记范围 | ctrl-space | 批量标记 |
| 清空标记 | Ctrl+Backslash | 清空标记 |
| 保存资源 | ctrl-s | 保存到文件 |
| 日志换行 | w | 日志视图 |
| 日志时间戳 | t | 日志视图 |
| 全屏 | f | 日志/YAML/详情视图 |
参考资料
- K9s 官方站点与文档:https://k9scli.io/
- K9s 安装文档:https://k9scli.io/topics/install/
- K9s 命令与快捷键:https://k9scli.io/topics/commands/
- K9s 配置文档:https://k9scli.io/topics/config/
- K9s Hotkeys:https://k9scli.io/topics/hotkeys/
- K9s Plugins:https://k9scli.io/topics/plugins/
- K9s Skins:https://k9scli.io/topics/skins/
- K9s GitHub README:https://github.com/derailed/k9s
- K9s 最新 release:https://github.com/derailed/k9s/releases/latest