统一管控每一个 Kubernetes 集群
企业级多集群 · 多租户 Kubernetes 管理平台 —— 细粒度权限、可视化运维、实时观测、全量审计,一个控制台搞定。

list_resources / get_resource / get_pod_logs 等读工具以「调用 / 执行结果」卡片流式展示(get 返回完整清单,能回答"用的哪个镜像")。create / update / delete 先暂存 → 出确认卡片 → 用户点确认后才执行,结果写回卡片并持久化(重载可见);创建按 <名>-deploy/<名>-service 命名规范;改镜像自动补发布记录(发布人 = 当前用户 + ⚡AI 标记)。/ai/chat,query-token 鉴权)· 多轮对话持久化 · Markdown 渲染 · 可拖动窗口 + 历史记录 · 中文输入法回车兼容。customresources(view / create / edit / delete)门控——鉴权时把「真实但非内置」的资源映射到它,角色页多一行「其它 / 自定义资源」勾选即可授权。customresources 权限双闸门与两阶段确认约束。用户管理 - 创建用户(分配一个或多个角色)、启用 / 禁用、删除。 - 首登强制改密;管理员重置用户密码并生成一次性临时密码(仅管理员可见入口)。
角色管理
- 角色 = 可复用的权限模板;支持新建 / 编辑 / 复制,roles:create 门控。
- 预置系统角色开箱即用:集群管理员 / 集群只读 / 开发者 / 运维工程师 / 发布管理员 / 审计员(初始化幂等播种,不可删可编辑,角色名按语言国际化)。
- 一个用户可绑定多个角色,权限取并集。
集群权限(细粒度授权)
- 每个角色包含两部分:
- 全局权限(平台级):clusters / users / roles / releases / audit / ai / integrated_deploy × view/create/edit/delete(releases、audit 仅 view;集成部署另含 publish 发布动作)。
- 集群规则(数据面):每条规则 = 某集群(或 * 全部)+ 范围(整集群 / 指定命名空间)+ 「每资源 × 操作」矩阵,操作含 view / create / edit / delete / exec(仅 Pod)/ reveal(仅 Secret);另有一行「其它 / 自定义资源」(customresources)统管所有非内置资源(含 CRD)。
- 前端用权限矩阵直观勾选(而非深层树);角色规则可跨多集群配置、复用首条配置。
- 底层经 rbac.SyncUserGrants 把角色物化成 Casbin g/p 策略,鉴权走 domain 域隔离;删除集群时级联清理规则并重物化受影响用户。
- 菜单按权限派生:侧边栏子菜单由用户角色里「有 view 的资源」自动生成,看不到=无权限;写操作按钮按 capabilities 逐项显隐。
登录安全:图形验证码(纯标准库生成 + 波浪扭曲防 OCR)· JWT · bcrypt · 敏感操作全量审计。
integrated_deploy(view / create / edit / delete / **publish**),且每条资源二次经用户自身的资源级 RBAC 校验,可选资源按写权限过滤。| 层 | 技术 |
|---|---|
| 后端 | Go · Gin · GORM · Casbin · client-go(dynamic client · discovery · RESTMapper)· Google Wire(DI)· PostgreSQL |
| 前端 | React 18 · TypeScript · Vite · Ant Design 5 · Zustand · react-i18next · react-markdown |
| AI | Eino ReAct agent · OpenAI 兼容大模型(baseURL / apiKey / modelId) |
| 观测 | metrics-server(节点 / Pod 用量) |
| 实时 | WebSocket(WebSSH 终端 · 日志流 · AI 对话 · 集成部署发布进度流) |
| 交付 | 单二进制内嵌 SPA(go:embed)或 nginx + API 双镜像 · GitHub Actions → Docker Hub |
分层架构:浏览器内的 React SPA 经接入层(单二进制内嵌 SPA,或 nginx 前端镜像反代)到达 Gin API;API 经统一的中间件链(JWT → 审计 → RBAC)分发到 REST 与 WebSocket 处理器;下沉到领域服务(Casbin 鉴权、client-go 集群连接池、Eino AI 助手、发布通知、加密、审计),最终对接 PostgreSQL、多个 Kubernetes 集群、metrics-server、大模型与 IM Webhook。

请求与鉴权:公开路由仅 login / captcha / healthz;其余走 authed 组 —— JWTAuth(解析 Authorization: Bearer)→ Audit(写操作按最终状态码埋点)。之上三档授权:平台级端点用 RequireGlobalPerm,集群级动态资源用 RBACAuthMiddleware(读 X-Cluster-ID 头 → 连接池取客户端 → RESTMapper 归一资源 → Casbin 按 域=集群[:命名空间] 鉴权);管理员旁路。WebSocket 因浏览器无法设头,改用 query 的 token 在升级前鉴权。
AI 助手交互流(ReAct + 人在环):
sequenceDiagram
actor U as 用户
participant FE as 前端(悬浮助手)
participant WS as ai/chat(WS)
participant AG as Eino ReAct Agent
participant G as RBAC Guard
participant K as K8s 集群
U->>FE: 自然语言指令
FE->>WS: user_message(query-token 鉴权)
WS->>AG: 运行 ReAct
loop 读工具(自动执行)
AG->>G: 鉴权 = 发起用户 RBAC
G->>K: list / get / logs(仅授权范围)
K-->>FE: 实时「调用 / 结果」卡片
end
alt 写操作 create / update / delete
AG-->>FE: confirm_required(暂存动作预览)
U->>FE: 点击确认
FE->>WS: confirm
WS->>G: 二次门控
G->>K: apply + 审计 + 发布记录
K-->>FE: 执行结果(写回卡片并落库)
end
docker run -d --name omnikube-pg -p 5433:5432 \
-e POSTGRES_USER=omnikube -e POSTGRES_PASSWORD=omnikube -e POSTGRES_DB=omnikube \
postgres:16
cd backend
cp config.yaml.example config.yaml # 填 jwt_secret(≥32 字符)、master_key(base64 32 字节)
# openssl rand -hex 32 / openssl rand -base64 32
go run ./cmd/server -config config.yaml # 监听 :8080,首启自动建表 + 播种 admin 与预置角色
cd frontend
npm install
npm run dev # :5173,已配代理 /api + ws → :8080
打开 http://localhost:5173,用 config 里的 admin 账号登录(首登会要求改密)。
首次启动自举:后端启动即自动建库建表、幂等播种预置角色,并在
ok_users为空时创建管理员——用户名与一次性初始密码会打印到启动日志(仅一次),该账号首登强制改密。
拆成两个镜像(同一仓库,tag 前缀区分):
| 组件 | 镜像 |
|---|---|
| 后端 API(REST + WebSocket) | twwch/omnikube:api-<版本> |
前端(nginx 托管 SPA + 反代 /api) |
twwch/omnikube:frontend-<版本> |
<版本> 为 latest(main)或标签名(如 v1.0.0)。
JWT_SECRET=$(openssl rand -hex 32) MASTER_KEY=$(openssl rand -base64 32) \
docker compose up -d # 加 --build 可本地构建
docker compose logs api # 查看初始 admin 用户名 + 一次性密码
打开 http://localhost:8080 登录(首登强制改密)。前端容器把 /api(含 exec/日志 WebSocket)反代到 api:8080。
CI/CD(.github/workflows/release.yml):main 推送 → 跑测试 → 构建并推送 api-latest / frontend-latest(+ -<sha>);打 vX.Y.Z 标签 → 推送 api-vX.Y.Z / frontend-vX.Y.Z 并自动生成 GitHub Release(正文取自 tag 注解消息 + 自动汇总的提交摘要)。
需在仓库 Secrets 配置
DOCKERHUB_USERNAME、DOCKERHUB_TOKEN。
backend/ Go 后端(cmd/server 入口;app=Wire DI;internal: handler / rbac / cluster /
ai(Eino) / ws / notify / captcha / audit / middleware / crypto / web(内嵌 SPA) ...)
backend/migrations/ 版本化 SQL 迁移文件(NNN_desc.sql,与 GORM AutoMigrate 对应,见 CLAUDE.md)
frontend/ React 前端(src: pages / components(含 AiAssistant) / api / store / i18n)
docs/ 设计文档(docs/superpowers/specs)、功能查漏 feature-gaps.md
images/ 界面截图
video/ 产品演示视频(成片 + 可复现源码)
CLAUDE.md 项目约定(重点:数据库变更规范 —— 改模型 + AutoMigrate + 加编号迁移文件)
# 后端
cd backend && go test ./...
# 前端
cd frontend && npm run lint && npm test && npm run build
| 部署列表 | 部署详情 | 容器组 |
|---|---|---|
![]() |
![]() |
![]() |
| 有状态副本集 | 守护进程集 | 定时任务 |
|---|---|---|
![]() |
![]() |
![]() |
| 服务 | ConfigMap | 节点 |
|---|---|---|
![]() |
![]() |
![]() |
| 用户 | 角色 | 审计日志 |
|---|---|---|
![]() |
![]() |
![]() |
| 集群管理 | 发布记录 |
|---|---|
![]() |
![]() |
把一组资源打包成工单,按「配置 → 工作负载 → 暴露」固定顺序一次性、有序发布;点发布侧边栏 WebSocket 实时逐资源展示结果(已创建 / 已更新 / 失败 / 跳过)。已发布工单只读(仅查看 + 复制)。
| 工单列表 | 工单编辑(资源卡片) | 实时发布 |
|---|---|---|
![]() |
![]() |
![]() |
用自然语言创建 / 更新 / 删除资源:ReAct 实时展示工具调用,写操作两阶段确认后才执行。下图完整演示「在 default 部署 nginx + 建 Service → 按命名规范(nginx-deploy / nginx-service)重建 → 升级镜像到 1.28」,每步确认卡片内直接输出执行结果。

系统架构图见上方 🏛️ 架构 一节(
images/00-architecture.png)。
$ claude mcp add OmniKube \
-- python -m otcore.mcp_server <graph>