Show HN: K10s – 一个可点击的 Kubernetes TUI(Go、Bubble Tea)
摘要
Show HN: k10s 是一个用 Go 和 Bubble Tea 构建的可点击 Kubernetes 终端 UI,作为 k9s 的现代化替代,提供鼠标操作、全局搜索、延迟 informer 以实现即时启动,并内置具备集群上下文感知能力的 AI 助手。
查看缓存全文
缓存时间: 2026/10/08 21:01
p10node/k10s
Source: https://github.com/p10node/k10s
一个可以点击的 Kubernetes 终端 UI。
k9s 教会了我们在终端里工作。k10s 让这个终端变成可以点击、即时搜索、可换主题的样子——还内置了一个已经了解你的集群、命名空间和当前选中对象的 AI。
路线图 · Go · 支持平台 · 单一二进制文件 · 自更新 · 许可证 · 欢迎 PR
安装 · 30 秒上手,无需集群 · 功能 · 从 k9s 迁移 · 文档 · 构建日志
一张真实终端截图,运行的是 k10s demo——通过 just screenshot 在离线演示后端上截取。本文档中的每一帧画面都来自实际运行的二进制文件,绝非手工绘制。
为什么是 k10s
集群仪表盘是你一天要打开二十次的东西,而且通常是在出事的时候。真正要紧的只有两件事:它打开得有多快,以及你需要记住多少东西。
- 没有任何操作藏在需要背下来的快捷键后面。 适用于你当前选中对象的操作会直接列在专属面板里。点一下,或者按旁边的字母即可。
- 鼠标能用。 点击某一行、点击某个面板、点击
[ zoom ]、点击ns default ▾、滚动表格。边框上的每个按钮都是真的。 - 一个搜索框,搜索整个集群。
ctrl+p把资源类型和对象放在一起搜索。不需要学习任何前缀语法。 - 它瞬间启动。 启动时注册零个 watch,什么都不等——informer 按类型惰性启动,你第一次查看某种资源时才开始。打开 Pod 只 watch pod,不会 watch 你名下的每一个 Secret 和 Event。(原理与防回归保障)
- AI 能看到屏幕。
ctrl+a,用大白话提问。当前 context、命名空间、资源类型和选中对象都会注入提示词,所以“这个 pod 为什么不健康?“指的就是这个 pod。 - 它会自我更新。
/update会在正在运行的二进制文件上安装最新版本——校验和验证、原子替换,并提示你重启进入新版本。 - 你的 k9s 风格命令插件直接可用。 把带作用域的快捷方式放进
~/.k10s/plugins.yaml;它们会出现在内置操作旁边,并能收到选中对象、命名空间、context 和列的值。
30 秒试用(无需集群)
k10s 自带一个离线演示后端:一个可以随便点点看的逼真集群,其中还有一个 CrashLoopBackOff 供你折腾。它是可选启用的,因为示例数据绝不应被误认为是你自己的机器。
git clone https://github.com/p10node/k10s && cd k10s
go run . demo # 示例集群——假数据,有明确标注
go run . # 你的真实集群,没有则显示 "No cluster"
演示是一个 context,而不是一种模式。k10s demo 会打开它,/demo 可以从任何地方切换到它,:ctx 列表里也永远有它(标注为 k10s demo · sample data,列表下方还有图例)。要退出它,选择任何其他 context 即可——没有单独的退出命令。
演示运行时,标题栏会带一个 DEMO 标记,因此它的任何一帧画面都不会被误认为是真实集群。
普通的 k10s 读取与 kubectl 相同的 kubeconfig($KUBECONFIG,否则 ~/.kube/config),并显示该 context 能访问到的一切——不多也不少。如果没有 kubeconfig,或者某个 context 的 API server 无响应,主面板会显示 No cluster 并指明出路:r 重试,:ctx 换一个 context,/setup 提供 kubectl 和 kubeconfig 的链接。docs/cluster-setup.md 是同一份指南的加长版。
安装
curl -fsSL https://p10node.com/k10s/install.sh | sh
支持 macOS 和 Linux,amd64 与 arm64。脚本会挑选正确的预构建二进制文件,对照发布清单校验 sha256,然后安装到 /usr/local/bin(当该路径需要一个它无法询问的密码时,则安装到 ~/.local/bin)。--dir、--version 和 --no-sudo 见 docs/install.md,其中还包括如何在运行前先阅读脚本内容,以及配套的 uninstall.sh。
机器上装了 Go 的话:
go install github.com/p10node/k10s@latest
或者从克隆的源码安装,这会同时把版本号打进二进制文件:
git clone https://github.com/p10node/k10s && cd k10s
just install # → $GOBIN/k10s,带版本标记
每个 tag 都会发布 darwin/amd64、darwin/arm64、linux/amd64、linux/arm64 和 windows/amd64 的预构建静态二进制文件——Windows 是安装脚本唯一会把你送到发布页面(https://github.com/p10node/k10s/releases)的平台。
之后每次升级都只需:
k10s update
然后运行它:
k10s # 使用你当前的 kubeconfig context
k10s demo # 内置示例集群,无需集群
k10s --readonly # 只看不动:禁止一切修改集群的操作
k10s --version # 这是哪个构建版本
你能得到什么
所有资源,按你脑海中的方式分组
覆盖 工作负载 · 网络 · 配置 · 存储 · RBAC · 集群 · 自定义资源 共 30 种类型,每种都显示当前命名空间下的实时行数。你的 CRD 会被自动发现——无需配置。
分组可以折叠:按 space、left 或点击标题,折叠状态跨重启记住,其中配置/存储/RBAC 默认折叠。折叠的分组同样不会向集群请求任何东西——决定哪些类型被计数的是侧边栏本身,而计数只是对每个可见类型发一个 limit=1 请求,每批六个,并会记住被拒绝的请求。
Pods · Deployments · ReplicaSets · StatefulSets · DaemonSets · Jobs · CronJobs · HPAs · Services · Endpoints · Ingresses · NetworkPolicies · ConfigMaps · Secrets · ResourceQuotas · LimitRanges · PDBs · PVCs · PVs · StorageClasses · ServiceAccounts · Roles · RoleBindings · ClusterRoles · ClusterRoleBindings · Nodes · Namespaces · Events · CRDs · Custom Resources
完整的 day-2 工具箱,一个按键直达
d describe | 来自 API 的真实 kubectl describe 输出 | |
y YAML | 活对象(live object)的 YAML | |
l logs | 跟随(-f),最新在底部,可回滚 500 行 | |
s shell | 真正的交互式 exec 会话——原生 TTY、感知窗口大小、在面板内 | |
p port-forward | 真实的 SPDY 转发,可在面板里启动/停止 | |
m top | pod/node 指标,按容器展示,含 requests 与 limits 对比 | |
e 编辑 · r 重启 · c 扩缩容 | rollout restart、扩缩容、$EDITOR | |
o / u | cordon-uncordon / drain——仅在选中 Nodes 时提供 | |
D delete | 红色确认弹窗,因为删除本该让人害怕 |
你可以用 k9s 核心的 plugins.yaml 格式添加自己的带作用域操作。它们可以运行前台或后台命令、请求确认、有意覆盖某个内置快捷方式,并且在同一个面板里同样可点击。参见插件指南和可安装示例。
日志跟随显示,就在你本来就在看的那个面板里(z 放大)
╭─ logs -f billing-worker-6f8d9c5b7-qq91x ────────────────────────────────── [ close ] [ restore ] ╮
│ 8 2026-08-25T08:12:18.331Z INFO http GET /v1/users/me 200 3.1ms │
│ trace=44b1e2f9 │
│ 7 2026-08-25T08:12:21.660Z INFO worker flushed batch size=250 dur=41ms │
│ 6 2026-08-25T08:12:25.019Z INFO http GET /healthz 200 0.3ms │
│ 5 2026-08-25T08:12:31.402Z INFO http DELETE /v1/sessions/9a1 204 5.7ms │
│ trace=7c0d19ba │
│ 4 2026-08-25T08:12:33.881Z WARN gc pause=18ms heap=412Mi │
│ 3 2026-08-25T08:12:40.117Z INFO http GET /v1/orders/88213 200 7.4ms │
│ trace=e21f8b05 │
│ 2 2026-08-25T08:12:44.590Z INFO metrics scrape ok series=1842 │
│ 1 2026-08-25T08:12:51.008Z INFO http GET /healthz 200 0.3ms │
│ ● following newest at bottom 500 loaded · ↑ for older │
╰────────────────────────────────────────────────────────────────────────────────────────────────╯
一个已经自带上下文的 AI 提示框
╭─ Prompt · plain text → AI · /commands still work · esc close ─ [ grow ] [ AI · claude-sonnet-5 ] ╮
│ ✦ ask about your cluster... · /settings to change provider/model │
╰─────────────────────────────────────────────────────────────────────────────────────────────────╯
● AI mode — plain text goes to claude-sonnet-5 tab panes · enter open · ctrl+p search · f find...
ctrl+a 切换它。使用你自己的 API key——OpenAI 兼容(因此也支持 Groq、Together、OpenRouter、vLLM、Ollama、LM Studio 以及任何本地网关)或 Anthropic。回答会以普通文本视图打开,可以滚动、放大和关闭。除非你在 AI 模式下按下回车,否则不会有集群数据离开你的机器。k10s 自主发起的唯一另一种网络请求是每天一次的更新检查,它只向 GitHub 询问一个版本号,别无其他。
八套内置主题,外加你自己的——实时预览
tokyo-night(默认) · catppuccin-mocha · dracula · nord · gruvbox-dark · solarized-dark · solarized-light · matrix
T 循环切换,/theme 打开一个选择器,它会在你上下浏览时逐个套用主题——让你在真实界面上评判,而不是凭一个名字——按 esc 则恢复你原来的主题。把一个 YAML 配色文件丢进 ~/.k10s/themes,重启后它就会出现在同一个选择器里——无需重新构建。参见自定义主题指南和可安装示例。
只有经历一整天之后才会注意到的细节
- 复制模式(
ctrl+s)会释放鼠标,让你的终端可以拖选和复制——这是所有捕获鼠标的 TUI 都会破坏的功能。 - 诚实的加载状态,而不是在 watch 还在同步时显示 “no resources found”。
- 命名空间和 context 选择器从不要求你手动输入名称。
- 没有设置向导。 首次运行就直接打开集群;每个设置都有可用的默认值,想改时按一下
/settings即可。 - 可放大的提示框(
ctrl+z)——因为一行很长的 kubectl 命令或一个 AI 问题,塞不进一个会横向滚动的单行输入框里。 - 终端窗口过小的提示,而不是乱成一团的布局。
从 k9s 过来
k10s 的存在要归功于 k9s(https://github.com/derailed/k9s)。该给的 credit 就要给:k10s 很年轻,而且刻意做得更窄。功劳属于 k9s——它成熟、功能范围庞大、可通过插件扩展,也正是它让我们这一代人不再整天手敲 kubectl get pods。
区别在于理念:
| k9s | k10s | |
|---|---|---|
| 主要输入方式 | 键盘优先,命令驱动 | 鼠标和键盘,平起平坐 |
| 发现方式 | 你需要学会那些命令 | 选中对象的可用操作直接列在屏幕上 |
| 搜索 | 每个视图各自的过滤,外加 : 在视图间跳转 | 一个框(ctrl+p)同时搜索类型和对象 |
| AI | 插件的地盘 | 内置,并注入集群上下文 |
| 范围 | 非常大,插件生态 | 小、有主见、兼容核心命令插件 |
| 升级 | 交给你的包管理器 | k10s update,自我替换 |
选择 k9s,如果你想要最大的功能面、完整的插件生态,以及多年生产环境的打磨。选择 k10s,如果你想把它交给一个从没打开过 TUI 的同事,然后让他们十秒钟内自己找到 logs。
按键
简版——完整参考在这里。
| 按键 | 操作 |
|---|---|
tab / shift+tab | 在面板间循环 |
↑↓(j/k)· pgup/pgdn · g/G | 移动 · 翻页 · 首行/末行 |
| 直接输入(Resources 面板聚焦时) | 即时按类型过滤 · esc 清除 |
f | 查找:搜索打开表格的每一列 |
ctrl+p | 搜索一切——类型和对象同一个框 |
enter / 双击 | 打开它:有日志就看日志,否则看 describe |
z | 放大 / 还原中间面板 |
: / / | 命令提示框(带建议弹窗) |
ctrl+a | AI 提示模式 ✦ |
T / ctrl+t | 循环切换主题 |
ctrl+s | 复制模式——释放鼠标以选中和复制 |
| 点击 / 滚轮 | 点击面板任意位置即选中它,空白区域也算 |
q / ctrl+c | 退出 |
命令
两个前缀,而且每个前缀只显示它自己那一套命令。
/ 是 k10s 本身(主题、设置、更新)。: 是集群,沿用 k9s 的词汇——一个资源视图、命名空间、context,或对屏幕上内容执行的操作。enter 会立即执行高亮的建议——不需要再过一遍提示框。
/theme /settings /mouse /update /version /demo /setup /help
k10s 本身
:po :deploy :rs :sts :ds :job :cj :hpa 工作负载
:svc :ep :ing :netpol 网络
:cm :sec :quota :limits :pdb 配置
:pvc :pv :sc 存储
:sa :role :rb :crole :crb RBAC
:no :ns :ev :crd :cr 集群 + 自定义
短形式就是弹窗里列出的;每种类型同时接受复数和单数——
:pods, :pod, :deployments, :persistentvolumes ...
:aliases 会把全部都打印出来
:po kube-system 该命名空间下的该类型(支持 `all`)
:svc api 不是命名空间的参数就是过滤条件
:ns :ctx 命名空间 / context 选择器
:ns <name> :ctx <name> 直接切换过去
:aliases :search :filter :scale :q
/ 是 k10s,: 是集群——命名空间和 context 是 :ns 与 :ctx,不是 /ns 和 /context。:aliases 会打印出整个 : 词汇表。任何不是 / 或 : 命令的内容都会作为 shell 命令执行,其输出在主面板中打开——date、kubectl get pods -o wide、helm list 都可以。通过你自己的 $SHELL 运行,上限 30 秒,并且不连接终端(想要交互式 shell,就在 pod 上按 s)。
配置
k10s 打开时使用 kubeconfig 的 current-context——也就是 kubectl 会与之通信的那个集群。:ctx <name> 会在本次会话中切换而不修改 kubeconfig;要改变下次打开时的默认集群,用 kubectl config use-context。主题、命名空间、折叠的侧边栏分组、AI 设置和更新检查都会持久化到 ~/.k10s/config.yaml(可用 K10S_CONFIG 覆盖路径),每次变更即时保存。参见 config.md。
注意: AI API key 以明文形式存储在该文件中(文件权限 0600), 并在 UI 中做掩码显示。如果你的环境无法接受这一点,把它留空即可, AI 模式将保持关闭。
文档
| architecture.md | 各包、Source 边界、渲染管线、鼠标区域 |
| performance.md | 惰性 watch、低成本计数,以及保持其快速的防护措施 |
| ui.md | 布局、面板、焦点、缩放、覆盖层 |
| keybindings.md | 完整的按键 + 鼠标参考 |
| commands.md | 提示模式、斜杠命令、AI 设置 |
| themes.md | 主题列表、选择器、配色规范 |
| config.md · update.md | 哪些东西会持久化 · 自更新如何工作 |
| cluster-setup.md | 没有集群?安装 kubectl 并获取 ~/.kube/config |
| backends.md · dev.md | 实时后端 vs 演示后端 · 构建、测试、无头渲染器 |
| roadmap.md | 已完成的、缺失的,以及已知的限制 |
| marketing.md · build-in-public.md | 这个项目是如何被分享出去的 |
参与贡献
门槛是刻意压低的。just 会列出所有配方:
just dev # 从源码运行
just shot 140 44 # 无头渲染一帧——不需要 TTY,不需要集群
just screenshot # 在真实终端中截取 README 主图(vhs)
just check # fmt + vet + test,按最快失败的顺序执行
cmd/shot 就是这里的 UI 工作如此愉快的原因:你可以迭代布局、回放按键序列(just shot 140 44 j,j,d),并在没有终端、没有集群的情况下对比不同帧。本文档里的任何画面都不是手工绘制的——它们都来自那个渲染器,主图则来自 just screenshot 在真实终端中驱动真实二进制文件。
相似文章
Show HN: Hntui – 一个用于 Hacker News 的终端用户界面
hntui 是一个用于浏览 Hacker News 的简洁终端用户界面,提供导航、帖子保存和主题支持等功能。
webernetes:在浏览器中运行 Kubernetes
Webernetes 是 ngrok 开发的一个开源库,使用 TypeScript 在浏览器中模拟 Kubernetes 集群,无需后端基础设施即可实现交互式 Kubernetes 内容。
@devops_nk:有人构建了一个完全在你的浏览器中运行的Kubernetes。这可能是学习Kubernetes的最简单方式。- 无需Do…
一位开发者通过将核心组件重写为TypeScript,并在AI辅助下进行代码转换,将Kubernetes移植到浏览器中完全运行。该工具无需安装,专为学习、教学和面试准备而设计。
@geekbb: 基于 Tauri(Rust + Svelte)的桌面应用,将编程 AI 代理、API 客户端、SQL/NoSQL 编辑器、SSH 终端、远程文件浏览器和项目管理看板整合在一个界面中,开发者不用在多个应用之间切换。 https://gith…
Clauge 是一个基于 Tauri(Rust + Svelte)的桌面应用,将编程 AI 代理、API 客户端、SQL/NoSQL 编辑器、SSH 终端、远程文件浏览器和项目管理看板集成在同一界面内,让开发者无需在多个应用间切换。
Show HN: Davit,一个 Apple Containers 界面
Davit 是一个免费、开源的 macOS 原生应用,使用 SwiftUI 构建,为 Apple silicon 上的 Apple 容器平台提供用户界面,允许用户无需 Docker Desktop 即可运行 Linux 容器。