如果你每天都要在 Kubernetes 集群里查 Pod 状态、翻日志、进容器 Shell,那么 k9s 大概是投入产出比最高的一个工具。它是一个跑在终端里的 Kubernetes 交互式管理界面,把原本要敲十几个字符的 kubectl 命令压缩成一两个按键,并且实时刷新资源状态。本文完整讲透 k9s 的安装、核心交互逻辑、排障三连招、自定义配置与插件机制,以及在生产集群里怎么用得安全。
为什么 kubectl 用久了会累
kubectl 本身没有问题,它是标准、是脚本化的基础。但人肉排障时,它的交互效率很低。一次典型的”某个服务 502 了”排查过程,你大概要这样敲:先 get pods 找出异常 Pod,再复制那个带随机后缀的长名字,然后 describe 看事件,再 logs 看输出,发现要看上一个容器实例还得补 –previous,想进容器还要再拼一条 exec。整个过程有一半时间花在复制粘贴 Pod 名字上。
更麻烦的是状态是静态的。Pod 正在 CrashLoopBackOff 反复重启,你只能不停按上箭头重跑 get pods,看重启次数有没有涨。如果你还不熟悉 Pod、Deployment、Service 这些基本对象之间的关系,光是搞清楚”这个 Pod 属于哪个 Deployment”就要多绕两圈(基础概念可先看:K8s 入门:Pod、Deployment、Service)。
k9s 解决的正是这段体验。它常驻在终端里,默认每两秒刷新一次资源列表,用光标选中资源后按单键就能触发描述、日志、进入 Shell、删除等操作,全程不需要复制任何名字。
安装与首次启动
k9s 是单个 Go 编译的二进制文件,没有运行时依赖,各平台安装都很简单:
# macOS
brew install derailed/k9s/k9s
# Linux:下载官方二进制(以 amd64 为例)
curl -sSL -o k9s.tar.gz \
https://github.com/derailed/k9s/releases/latest/download/k9s_Linux_amd64.tar.gz
tar -xzf k9s.tar.gz k9s
sudo install -m 0755 k9s /usr/local/bin/k9s
# 验证
k9s version
# 启动:默认读取 ~/.kube/config 的 current-context
k9s
# 指定 kubeconfig 与命名空间启动
k9s --kubeconfig ~/.kube/prod.yaml -n payment
# 只看所有命名空间
k9s -A
k9s 完全复用 kubeconfig,不需要额外配置权限,也不在集群里部署任何东西——它就是一个更聪明的 kubectl 客户端。这一点很重要:它不引入新的攻击面,也不需要运维审批。
核心交互:记住这几个键就够了
k9s 的键位设计借鉴了 vim 与 less,上手曲线很平。真正日常高频的其实只有下面这些:
| 按键 | 作用 | 等价 kubectl |
|---|---|---|
: | 进入命令模式,切换资源视图 | get <resource> |
/ | 在当前列表内过滤 | grep |
d | describe 选中资源 | describe |
l | 查看容器日志 | logs |
s | 进入容器 Shell | exec -it — sh |
y | 查看完整 YAML | get -o yaml |
e | 在编辑器中修改资源 | edit |
Ctrl+d | 删除资源(有确认) | delete |
Esc | 返回上一层 | — |
0-9 | 快速切换命名空间 | -n <ns> |
命令模式:视图切换的入口
按下冒号后输入资源名即可跳转,支持简写和模糊匹配。常用的几个:
:pod # Pod 列表(可简写 :po)
:deploy # Deployment
:svc # Service
:ing # Ingress
:cm # ConfigMap
:secret # Secret
:node # 节点列表,看资源水位
:event # 集群事件流,排障第一现场
:pulse # 集群健康总览仪表盘
:xray deploy # 树形展开 Deployment→RS→Pod 的归属关系
:ctx # 切换 kubeconfig context
:crd # 查看自定义资源定义
其中 :xray 和 :pulse 是 kubectl 没有直接对应物的两个杀手视图。xray 用树形结构展示 Deployment 到 ReplicaSet 再到 Pod 的层级归属,一眼看清”哪个副本挂了、属于哪个版本”;pulse 则把整个集群的各类资源健康度画成仪表盘,适合值班时挂在屏幕上做态势感知。
排障三连:日志、Shell、端口转发
真实排障场景里,k9s 省下的时间主要来自这三个动作。
日志:多容器与历史实例
选中 Pod 按 l 进日志视图。如果 Pod 里有多个容器(比如注入了 Sidecar),k9s 会先让你选容器。日志视图内还有几个实用键:p 切换到上一个已崩溃实例的日志(等价 –previous,排查 CrashLoopBackOff 必用)、f 全屏、w 切换自动换行、s 暂停滚动方便阅读、0 表示不限制回溯行数。
Shell:进容器现场
按 s 直接进入容器 Shell。k9s 会自动尝试 bash,失败则退回 sh,省去你判断基础镜像的麻烦。需要注意精简镜像(distroless、scratch)里没有 Shell,这时应该考虑用临时调试容器的方式,而不是纠结为什么进不去。
端口转发:本地直连集群内服务
选中 Pod 按 Shift+f 建立端口转发,然后在 :pf 视图里统一管理所有转发通道。这个功能在本地调试集群内的数据库、Redis、内部管理后台时特别顺手,比手动维护一堆后台 kubectl port-forward 进程清爽太多——那些进程断了你往往还不知道。
把这三个动作串起来:从 :event 看到异常事件,用 / 过滤到目标 Pod,d 看事件详情确认是镜像拉取失败还是探针失败,l 加 p 看崩溃前的日志,必要时 s 进容器验证配置文件。整套流程不到一分钟,且完全不用离开终端。关于 Pod 调度失败与探针类问题的系统排查思路,可以配合Kubernetes Pod 调度与故障排查实战一起看。
k9s 与其他 K8s 管理工具怎么选
| 工具 | 形态 | 优势 | 适用场景 |
|---|---|---|---|
| kubectl | CLI | 标准、可脚本化 | 自动化、CI/CD |
| k9s | 终端 UI | 轻量、SSH 可用、实时刷新 | 日常排障、跳板机运维 |
| Lens | 桌面 GUI | 可视化强、多集群面板 | 本地开发、演示汇报 |
| Dashboard | 集群内 Web | 浏览器直达、可授权他人 | 非运维角色临时查看 |
结论很直接:脚本用 kubectl,人肉排障用 k9s。k9s 最大的差异化优势是它能在跳板机、堡垒机的 SSH 会话里跑——生产集群通常不允许你从笔记本直连,GUI 工具在这种环境下毫无用处,而 k9s 只需要一个终端。它和 tmux 终端复用 是天然搭配:在 tmux 里开一个常驻窗格挂着 k9s,SSH 断线重连后现场还在。
自定义配置:别名、皮肤与视图列
k9s 的配置目录在 macOS 上是 ~/Library/Application Support/k9s/,Linux 上是 ~/.config/k9s/。真正值得改的是别名和刷新间隔:
# ~/.config/k9s/config.yaml
k9s:
refreshRate: 2 # 列表刷新间隔(秒),大集群建议调到 3-5
maxConnRetry: 5
readOnly: false # 生产集群建议 true
ui:
skin: dracula
logoless: true # 省掉 logo,给列表腾出屏幕高度
logger:
tail: 200 # 日志视图默认回溯行数
sinceSeconds: 300
# ~/.config/k9s/aliases.yaml:把常用资源压成两个字母
aliases:
dp: apps/v1/deployments
sec: v1/secrets
hpa: autoscaling/v2/horizontalpodautoscalers
vs: networking.istio.io/v1beta1/virtualservices
大集群里 refreshRate 别设太小。每次刷新都是一轮 API Server 请求,几千个 Pod 的集群里设成 1 秒,你会给 API Server 增加可观的额外负载,也容易被 APF(API Priority and Fairness)限流。3 到 5 秒足够。
插件机制:把团队排障经验固化下来
这是 k9s 最被低估的能力。你可以把团队里那些”只有老手记得”的排障命令绑定成快捷键,写进 plugins.yaml 后所有人开箱就能用:
# ~/.config/k9s/plugins.yaml
plugins:
# 在 Pod 视图按 Shift+L 抓取带时间戳的近百行日志
tail-with-ts:
shortCut: Shift-L
description: "Tail 100 (ts)"
scopes: [pods]
command: sh
background: false
args:
- -c
- "kubectl logs -f --tail=100 --timestamps
-n $NAMESPACE $NAME --context $CONTEXT | less -R"
# 在 Pod 视图按 Shift+T 启动临时调试容器(适配无 Shell 的精简镜像)
debug-ephemeral:
shortCut: Shift-T
description: "Debug container"
scopes: [pods]
command: kubectl
background: false
args:
- debug
- -it
- $NAME
- -n
- $NAMESPACE
- --image=nicolaka/netshoot
- --target=$COL-NAME
# 在 Deployment 视图按 Shift+R 触发滚动重启
rollout-restart:
shortCut: Shift-R
description: "Rollout restart"
scopes: [deployments]
command: kubectl
confirm: true
background: false
args: [rollout, restart, deployment/$NAME, -n, $NAMESPACE, --context, $CONTEXT]
注意两点:涉及写操作的插件一定要加 confirm: true,避免误触;$COL-NAME 这类变量取的是当前光标所在列的值,容器列上用它就能精确指定 –target。把 plugins.yaml 提交到团队的 dotfiles 仓库,新人入职当天就能用上老手的排障手法,这和用 Makefile 与 just 让命令可复用 是同一套思路:把隐性知识变成可执行的配置。
生产集群的安全用法
k9s 太顺手了,顺手就容易出事——光标停在生产 Pod 上顺手按了 Ctrl+d,虽然有确认弹窗,但值班时手快点确认的概率并不低。几条务必落实的纪律:
- 生产用只读模式:启动时加
--readonly,或给生产 context 单独配置 readOnly: true,从根上禁掉删除与编辑。 - 皮肤区分环境:给生产 context 配红色皮肤、测试配绿色,视觉上时刻提醒自己在哪个集群,这条比任何规范都管用。
- RBAC 收敛而非依赖客户端:真正的边界在服务端。日常账号只给 get/list/watch,写操作走单独的审批账号或 GitOps 流水线。
- 启动即确认 context:先按
:ctx看清当前集群再动手,多集群运维最常见的事故就是”改对了配置、改错了集群”。
常见坑与规避
实践中踩到过的几个问题,直接给结论:
- CPU/内存列显示 n/a:集群没装 metrics-server。k9s 只是展示端,装上 metrics-server 后立刻有数据。
- 启动报权限错误:k9s 默认会列全部命名空间。若账号只有单命名空间权限,用
k9s -n your-ns显式限定即可。 - 大集群卡顿:调大 refreshRate,并用
/过滤缩小列表;避免长期停在全命名空间的 Pod 视图。 - 中文或图标乱码:终端字体不支持 Nerd Font 符号,换字体或在配置里关掉图标(
noIcons: true)。 - 日志刷太快看不清:日志视图按
s暂停自动滚动,别去和刷屏赛跑。
还要清楚 k9s 的定位边界:它是人机交互的排障放大器,不是监控系统。趋势、告警、历史回溯这些事,该交给 Prometheus 与 Grafana 那一套(延伸阅读:Prometheus + Grafana 监控面板实战)。k9s 看的是”此刻现场”,监控看的是”一段时间的变化”,两者互补而不替代。
小结
k9s 的价值不在功能多,而在把 Kubernetes 日常运维的操作路径缩到了最短:一个终端、几个按键、实时状态。落地建议按这个顺序推进——先装上用一周,只练 :、/、d、l、s 五个键;熟了之后配置别名和环境皮肤;最后把团队的排障命令写成插件共享出去。它和 kubectl 不是替代关系,脚本自动化仍然属于 kubectl,而人坐在终端前排查问题的那段时间,k9s 能实实在在帮你省下一半。想进一步提升终端效率,可以顺带看看后端开发者必备的命令行效率工具,以及容器基础层面的 Docker 部署实践。




