Show HN: K10s – 一个可点击的 Kubernetes TUI(Go、Bubble Tea)

Hacker News Top 工具

摘要

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 toppod/node 指标,按容器展示,含 requests 与 limits 对比
e 编辑 · r 重启 · c 扩缩容rollout restart、扩缩容、$EDITOR
o / ucordon-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。

区别在于理念:

k9sk10s
主要输入方式键盘优先,命令驱动鼠标和键盘,平起平坐
发现方式你需要学会那些命令选中对象的可用操作直接列在屏幕上
搜索每个视图各自的过滤,外加 : 在视图间跳转一个框(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+aAI 提示模式 ✦
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 在真实终端中驱动真实二进制文件。

相似文章

webernetes:在浏览器中运行 Kubernetes

Lobsters Hottest

Webernetes 是 ngrok 开发的一个开源库,使用 TypeScript 在浏览器中模拟 Kubernetes 集群,无需后端基础设施即可实现交互式 Kubernetes 内容。

@geekbb: 基于 Tauri(Rust + Svelte)的桌面应用,将编程 AI 代理、API 客户端、SQL/NoSQL 编辑器、SSH 终端、远程文件浏览器和项目管理看板整合在一个界面中,开发者不用在多个应用之间切换。 https://gith…

X AI KOLs Timeline

Clauge 是一个基于 Tauri(Rust + Svelte)的桌面应用,将编程 AI 代理、API 客户端、SQL/NoSQL 编辑器、SSH 终端、远程文件浏览器和项目管理看板集成在同一界面内,让开发者无需在多个应用间切换。

Show HN: Davit,一个 Apple Containers 界面

Hacker News Top

Davit 是一个免费、开源的 macOS 原生应用,使用 SwiftUI 构建,为 Apple silicon 上的 Apple 容器平台提供用户界面,允许用户无需 Docker Desktop 即可运行 Linux 容器。