docs: 全量重新评估 — PROJECT_EVALUATION/ROADMAP/TDD_PLAN 清空重写

基于全项目深度审计(96,102 行 / 374 文件),从 K8s 专项开发全面转向:

PROJECT_EVALUATION.md:
- 全量评估 8 大功能模块(资产/K8s/发布/监控/自动化/AIOps/审批/系统)
- 技术债清单:前端 1026 处 any + 后端 4204 行 kubernetes.go + 1324 行 api.ts
- Mock API 缺口:dashboardApi(6) / traceApi(3) / alertCenterApi.silence(1)
- 综合评分 83/100

ROADMAP.md:
- P0 工程质量:Q1 类型安全治理 / Q2 kubernetes.go 拆分 / Q3 api.ts 拆分
- P1 功能补全:F1 告警静默 / F2 审计导出 / F3 前端 RBAC
- P2 架构优化:A1 K8s 路由统一 / A2 告警分布式 / A3 WebSocket 管理
- P3 用户体验:U1 虚拟滚动 / U2 DataTable / U3 i18n / U4 镜像优化

TDD_PLAN.md:
- P0-P1 每个模块完整验证用例
- 回归测试基线(10 个核心 API 端点)
- 全部改用 Python urllib(避免 shell 引号问题)
This commit is contained in:
attacker committed 2026-06-25 01:09:32 +08:00
1 parent 6e479f6df7
commit e29dfb5868
4 files changed
+677 -1265

No files matched your search

+165 -332
View File
@@ -1,321 +1,199 @@
# K8s 管理功能演进路线图
# AIOps 智能运维平台 — 优化路线图
> 每个模块 = 1 个 cron 周期(6h)可完成的**中等粒度功能**。完成后更新状态。
## 当前冲刺:P0 — Metrics 数据贯通
### M1: SyncCluster 增加 metrics 采集 [done]
**目标**: 同步时采集 node/pod metrics,写入 DB 的 cpu_usage/memory_usage 字段
**后端改动**:
- `SyncCluster` handler 中,`client.ListNodes()` 之后调 `client.GetNodeMetrics()`
- 将 CPU(nanocores→m) / Memory(Ki→Mi) 换算后写入 `kubernetes_nodes.cpu_usage` / `memory_usage`(百分比)
- 同理调 `client.GetPodMetrics()` 写入 Pod 的资源使用
**前端改动**:
- `KubernetesClusterDetail.tsx`: 删除 `resourceData` 硬编码,改为从 API 获取真实数据(或展示当前 metrics 快照)
- 资源分布卡片读取 cluster 实际计数(node_count/pod_count 已有)
**验收标准**:
- [x] SyncCluster 后 DB `kubernetes_nodes` 表 cpu_usage/memory_usage 非零
- [x] 节点列表页 CPU/内存百分比非零
- [x] 集群详情页无硬编码 mock 数据
- [x] curl `/kubernetes-clusters/:id` 返回的 node_count/pod_count 正确
> 基于全量审计(96,102 行代码 / 374 文件),从「K8s 功能开发」全面转向「工程质量 + 功能补全 + 架构治理」。
> 最后更新: 2026-06-25
---
### M2: Pod Metrics 详情页接入 [done]
**目标**: Deployment 详情页和 Pod 列表展示真实 CPU/内存使用
## 当前状态:功能开发阶段已完成
**改动**:
- 后端 `ListPods` handler 注入 `GetPodMetrics()`(类似 ListNodes 已有逻辑)
- 前端 Pod 列表表格增加 CPU/内存列
- DeploymentView 容器详情区域读取 metrics
**验收标准**:
- [x] Pod 列表有 CPU/内存使用量列
- [x] Deployment 详情页容器 CPU/内存非 mock
| 大模块 | 完成度 | 说明 |
|--------|:------:|------|
| 资产管理 | 100% | 服务器/云账号/域名/账单/Agent 全功能 |
| Kubernetes 管理 | 100% | M1-M14 全部完成(14 个子模块) |
| 应用发布 | 100% | CI/CD 流水线 + SSH/K8s 双路径 |
| 监控告警 | 80% | Agent 监控 + 告警引擎完善;缺:大屏/链路追踪/告警静默 |
| 自动化运维 | 100% | CronJob/脚本/Ansible |
| AIOps 智能 | 100% | 6 种 LLM + 告警分析 + 容量预测 |
| 系统管理 | 95% | 审计导出 TODO |
---
### M3: Pod 文件上传 [done]
**目标**: PodFileBrowser 增加上传能力
## P0 — 工程质量治理(最高优先级)
**改动**:
- 后端新增 `POST .../pods/:pod/files/upload` — multipart 表单接收,base64 分块 exec 写入
- 前端 PodFileBrowser 增加上传按钮 + FormData 上传
- **重大修复**: `ExecInPod` 从 raw HTTP SPDY(不工作)改为 WebSocket channel.k8s.io 协议(和 ExecTerminal 一致)
- **修复**: BusyBox `ls` 不支持 `--time-style`,解析器改为兼容 BusyBox 默认日期格式
> 目标:从「能跑」升级到「能维护」。解决前端类型安全和后端巨型文件问题。
### Q1: 前端类型安全治理 [pending]
**问题**: 1026 处 `any` 类型 + 218 处未使用变量
**方案**:
1. 建立 `frontend/src/types/` 后端响应类型定义库(当前仅 375 行,覆盖率极低)
2. 按模块定义接口:`types/kubernetes.ts` / `types/server.ts` / `types/pipeline.ts` 等
3. 逐步将 `any` 替换为具体接口类型
4. 清理 218 处 `no-unused-vars`
5. 移除 93 处 `console.*`(特别是 `api.ts:280` 泄露 token 的调试日志)
6. 配置 CI `tsc --noEmit` 零错误门禁
**验收标准**:
- [x] 可上传文件到 Pod 容器内
- [x] 上传后文件列表刷新可见
- [x] verify 字段返回正确文件大小
- [ ] `types/` 目录覆盖所有后端响应结构
- [ ] `any` 类型从 1026 处降至 < 50 处
- [ ] `npx tsc --noEmit` 零错误
- [ ] ESLint `no-unused-vars` 降至 < 20 处
- [ ] `console.*` 降至 < 10 处(仅保留 error 级别)
### Q2: 后端 kubernetes.go 模块化拆分 [pending]
**问题**: 单文件 4204 行 / 134 函数,全仓最大文件
**方案**:
```
handlers/kubernetes.go (4204L)
→ handlers/k8s_cluster.go (集群 CRUD + 同步 + metrics)
→ handlers/k8s_workload.go (Deployment/STS/DS 读写操作)
→ handlers/k8s_pod.go (Pod 日志/终端/文件/exec)
→ handlers/k8s_yaml.go (通用 YAML get/update)
→ handlers/k8s_namespace.go (Namespace CRUD + 配额)
→ handlers/k8s_events.go (事件列表 + 聚合)
→ handlers/k8s_node.go (Node 详情 + 资源分配)
→ handlers/k8s_compare.go (多集群对比)
```
**验收标准**:
- [ ] 拆分后单文件不超过 800 行
- [ ] 所有路由不变,API 响应不变
- [ ] `go build` 零错误
- [ ] 411 条路由全部可访问(回归测试)
### Q3: 前端 api.ts 模块化拆分 [pending]
**问题**: 单文件 1324 行 / 352 方法
**方案**:
```
services/api.ts (1324L)
→ services/api/kubernetes.ts (78 方法)
→ services/api/deploy.ts (34 方法)
→ services/api/agent.ts (23 方法)
→ services/api/alert.ts (21 方法)
→ services/api/server.ts (11 方法)
→ services/api/cloud.ts (12 方法)
→ services/api/index.ts (统一 re-export)
```
**验收标准**:
- [ ] 拆分后单文件不超过 300 行
- [ ] 所有 import 路径正确
- [ ] `npm run build` 零错误
- [ ] 352 个 API 方法全部保留
---
### M4: ConfigMap/Secret 编辑 [done]
**目标**: 目前只读,增加在线编辑能力
## P1 — 功能补全
**改动**:
- 后端 `UpdateResourceYAMLNS` 端点已支持 configmaps/secrets(无需改动)
- 前端 `YamlViewer` 增加 `autoEdit` prop — 打开即进入编辑模式
- `NamespaceResourcePage` ConfigMap/Secret 行增加显式编辑按钮(铅笔图标)
- 统一 `cleanBeforeEdit=true` — 编辑前自动清理 status/managedFields/uid 等只读字段
- `k8s-yaml-utils.ts` 的 `cleanYAML()` 提供行级清理
> 目标:消除前端 mock 桩,补全监控模块缺失的后端。
### F1: 告警静默规则 [pending]
**问题**: `alertCenterApi.silence` 硬编码返回 `{success:true}`
**方案**:
- 后端新增 `alert_silences` 表 + CRUD API
- 告警引擎评估时检查静默规则(匹配 namespace/label/时间窗)
- 前端 AlertCenter 新增「静默规则」Tab
**验收标准**:
- [x] 可在线编辑 ConfigMap 并保存
- [x] 保存后 K8s 中实际生效(curl 验证 label 增删 → GET 确认)
- [ ] 可创建/查看/删除静默规则
- [ ] 静默期间告警引擎不触发通知
- [ ] 静默到期自动恢复
### F2: 审计日志导出 [pending]
**问题**: 后端 `audit.go` 导出功能仅返回 JSON(TODO)
**方案**:
- 实现 CSV/Excel 导出(用 `excelize` 库)
- 前端添加「导出」按钮
**验收标准**:
- [ ] 可导出为 Excel 格式
- [ ] 支持按时间/用户/操作类型筛选导出
### F3: 前端 RBAC 按钮级控制 [pending]
**问题**: 后端 RBAC 完善,但前端无按钮级权限控制
**方案**:
- 封装 `<HasPermission permission="xxx">` 组件
- Sidebar 菜单按角色过滤
- 操作按钮根据权限显示/隐藏
**验收标准**:
- [ ] 不同角色看到不同菜单
- [ ] 无权限按钮自动隐藏
- [ ] 权限变更后实时生效
---
### M5: Deployment 暂停更新 + CI/CD 集成 [done]
**目标**: 接通顶部菜单的暂停更新和 CI/CD 按钮
## P2 — 架构优化
**改动**:
- 后端 `POST .../deployments/:name/pause` 和 `/resume`(ID 路由 + Kuboard code 路由)
- 客户端 `PauseDeployment()` / `ResumeDeployment()` — PATCH `spec.paused` 布尔字段
- Deployment 列表 summary 增加 `paused` 字段,前端可读取暂停状态
- 前端操作菜单增加「暂停更新/恢复更新」动态切换 + 暂停 Badge
- CI/CD 按钮跳转到流水线页面(传递 namespace+deployment 上下文)
### A1: K8s 双路由体系统一 [pending]
**验收标准**:
- [x] 可暂停/恢复 Deployment 滚动更新
- [x] CI/CD 按钮可跳转到流水线页面
**问题**: 104 条 K8s 路由存在集群域 `/kubernetes-clusters/:id/...` 和 Kuboard 域 `/kubernetes/:code/...` 两套
**方案**: 以 Kuboard code 路由为主,ID 路由保留向后兼容(标记 deprecated)
### A2: 告警引擎分布式安全 [pending]
**问题**: 告警引擎用 goroutine + 30s ticker 常驻,多副本会重复告警
**方案**: Redis 分布式锁(每轮 ticker 先抢锁),或选主机制
### A3: WebSocket 连接统一管理 [pending]
**问题**: WebShell/kubectl/PodExec/日志流各有 WebSocket 实现
**方案**: 封装统一的 WebSocket 管理器(断线重连 + 心跳 + 消息分发)
---
## 当前冲刺:P1 — Deployment 可视化编辑器(Kuboard 风格)
## P3 — 用户体验提升
### M6: 编辑器基础设施 + 基本信息 Tab + YAML编辑器 [done]
**目标**: 三模式切换(查看/可视化编辑/YAML编辑)+ 基本信息 Tab
### U1: 虚拟滚动 [pending]
- Pod 列表(1000+ Pod 场景)使用 `@tanstack/react-virtual`
- 事件列表、审计日志列表
**改动**:
- `DeploymentWorkload.tsx`: 模式切换从 2 tab → 3 tab(查看模式 / 编辑模式 / YAML编辑)
- 新增 `DeploymentEditBasic.tsx`: 基本信息 Tab — name/namespace(只读) + replicas/labels/annotations/selector(可编辑)
- `YamlViewer.tsx` 升级: 引入 CodeMirror 6(`@uiw/react-codemirror` + `@codemirror/lang-yaml`),支持 YAML 语法高亮 + 行号 + 折叠 + 括号匹配
- `YamlViewer.tsx` 新增 `inline` 模式 — 非弹窗内联展示,适合 YAML 编辑 Tab
- `DeploymentDetailPage.tsx`: `mode` 类型扩展为 `'view' | 'edit' | 'yaml'`
- `DeploymentWorkload.tsx` 新增 `EditModeContainer` — 编辑模式 Tab 导航(基本信息✅ / 容器信息M7 / 存储M8 / 高级M8 / 服务M9)
- 路由 `:mode` 参数自动支持 `yaml` 值(无需改 App.tsx 路由表)
### U2: 统一 DataTable 组件 [pending]
- 封装排序/筛选/分页/导出/列自定义的通用表格
- 替换散布在各页面的手写表格
**验收标准**:
- [x] 三模式 tab 切换正常,YAML 模式打开 CodeMirror 编辑器
- [x] 基本信息 Tab 可编辑 labels/annotations/replicas 并保存
- [x] YAML 编辑器有语法高亮和行号
- [x] YAML 编辑器支持内联模式(inline prop)
- [x] 编辑模式 Tab 导航系统就绪(M7-M9 预留占位)
### U3: 国际化 (i18n) [pending]
- 提取所有中文文案到 `i18n/zh-CN.json`
- 预留 `en-US.json` 扩展
### U4: 后端镜像优化 [pending]
- Backend 277MB → 目标 < 150MB(多阶段构建优化,移除 Agent 编译工具链)
- 或使用 distroless 基础镜像
---
### M7: 容器信息 Tab(工作容器 + 初始化容器)[done]
**目标**: Kuboard 风格的容器编辑器,替代当前浅层 DeploymentEdit
## 模块状态追踪
**改动**:
- 新增 `DeploymentEditContainers.tsx`: 容器列表卡片(initContainers + containers)
- 每个容器卡片可编辑:
- 容器镜像 + ImagePullSecret + 镜像拉取策略
- 命令 (command + args)
- 环境变量(key-value 动态列表)
- 资源需求/限制(CPU/Memory/GPU)
- 端口(name/port/protocol 动态列表)
- 健康检查(liveness/readiness/startup — httpGet/tcpSocket/exec 三种)
- 生命周期回调(postStart/preStop)
- 安全上下文(runAsUser/runAsNonRoot/privileged/capabilities)
- 数据卷挂载(name/mountPath/subPath/readOnly)
**验收标准**:
- [x] 可添加/删除工作容器和初始化容器
- [x] 每个容器的所有常规字段可编辑
- [x] 保存后 K8s 中实际生效
---
### M8: 存储挂载 + 高级设置 Tab [done]
**目标**: 数据卷定义/挂载 + Deployment 高级调度策略
**改动**:
- 新增 `DeploymentEditStorage.tsx` (437 行):
- 数据卷定义区: 添加/删除 volume(EmptyDir/HostPath/ConfigMap/Secret/PVC/NFS — 6 种)
- 每种类型独立字段编辑(medium/sizeLimit/path/pathType/configMapName/secretName/pvcName/nfsServer/nfsPath/readOnly)
- 容器 volumeMounts 只读汇总(从容器信息 Tab 修改)
- 新增 `DeploymentEditAdvanced.tsx` (632 行):
- 更新策略: RollingUpdate(maxSurge/maxUnavailable) / Recreate + revisionHistoryLimit + progressDeadlineSeconds
- 节点调度: nodeSelector (key-value) + tolerations (key/operator/value/effect/tolerationSeconds)
- DNS 配置: dnsPolicy + dnsConfig(nameservers/searches/options)
- 主机别名: hostAliases (ip/hostnames)
- ServiceAccountName + restartPolicy + schedulerName + terminationGracePeriodSeconds
- 主机设置: hostNetwork/hostIPC/hostPID/shareProcessNamespace
- Pod 安全上下文: runAsUser/runAsGroup/fsGroup/runAsNonRoot
**验收标准**:
- [x] 可定义 6 种数据卷并挂载到容器
- [x] 可编辑更新策略和调度策略
- [x] 保存后 K8s 中实际生效(PUT application/yaml 直通 K8s API)
- [x] TypeScript 编译零错误 + Vite 构建成功
- [x] SPA edit 路由返回 200(非 301)
- [x] YAML API 返回有效 K8s manifest(apiVersion/kind/metadata 齐全)
---
### M9: 服务/应用路由 Tab + 整体联调 [done]
**目标**: Service/Ingress 可视化创建 + 编辑器整体联调
**改动**:
- 新增 `DeploymentEditService.tsx`:
- 服务发布: selector 匹配关联 Service(读 spec.selector.matchLabels),支持创建/删除
- 应用路由: Ingress 关联展示
- selector 双路径兼容(manifest?.spec?.selector?.matchLabels || manifest?.selector)
- 整体联调:
- 5 Tab 编辑器全部 `available: true`,统一 manifest 数据源
- 各 Tab 独立保存(PUT application/yaml),保存后刷新 manifest + loadData
- `EditModeContainer` Tab 系统(basic/containers/storage/advanced/service)
- 所有 5 Tab 已在 DeploymentWorkload.tsx EditModeContainer 中接入
**验收标准**:
- [x] 可在编辑器内创建/编辑关联 Service
- [x] 5 Tab 编辑的数据合并保存成功(各 Tab 独立 PUT 完整 manifest)
- [x] DeploymentWorkload.tsx 5 Tab 全部 available
- [x] TypeScript 编译零错误 + Vite 构建成功
---
## 后续规划(P2+)
### M10: Node 详情页(PID/容器运行时/分配率)[done]
**目标**: 节点名称可点击进入详情页,展示完整的系统信息、资源分配率、污点、条件、Pod 列表
**改动**:
- 后端:
- `kubernetesclient/client.go`: 新增 `NodeTaint` / `NodeCondition` 扩展字段 + `NodeInfo` 增加 `architecture`/`operatingSystem` + `GetNode(name)` 方法
- `kubernetes.go`: 新增 `GetNodeDetail` handler — 获取单个节点详情 + 遍历 Pod 计算资源分配率(CPU/Memory/Pods requested vs allocatable)
- `routes.go`: 注册 `GET /kubernetes/:clusterCode/nodes/:name` (Kuboard code 路由) + `GET /kubernetes-clusters/:id/nodes/:name` (ID 路由)
- 新增 `parseCpuToMilli()` / `parseMemToMi()` 辅助函数(解析 Pod resource requests)
- 前端:
- 新增 `NodeDetailPage.tsx` (~330行) — 节点详情页:系统信息卡片 + 资源分配率卡片(进度条) + 条件卡片 + 污点卡片 + 标签卡片 + Pod 列表
- `api.ts`: 新增 `getNodeDetail()` 方法
- `App.tsx`: 新增路由 `:clusterCode/nodes/:nodeName`
- `ClusterOverviewPage.tsx`: 节点名称可点击跳转详情页
**验收标准**:
- [x] `GET /kubernetes/:clusterCode/nodes/:name` 返回完整详情(container_runtime/kubelet/os/kernel/architecture)
- [x] 资源分配率正确计算(cpu_alloc_pct/mem_alloc_pct/pod_alloc_pct)
- [x] metrics-server 数据注入(cpu_usage_m/mem_usage_mi)
- [x] 节点条件全量返回(5个 conditions 含 reason/message)
- [x] 污点列表返回
- [x] 节点上的 Pod 列表返回(含 CPU/内存 requests)
- [x] 前端节点名称可点击跳转
- [x] SPA 路由返回 200(非 301)
- [x] TypeScript 零编译错误 + Vite 构建成功
---
### M11: StatefulSet/DaemonSet 详情页 [done]
**目标**: 节点名称可点击进入详情页,展示完整的系统信息、资源分配率、污点、条件、Pod 列表
**改动**:
- 后端:
- `routes.go`: 为 statefulsets/daemonsets 注册专门的 YAML 子路由(避免 Gin radix tree 与通配 `/:resource/:name/yaml` 冲突)
- `kubernetes.go`: `GetResourceYAMLNS` / `UpdateResourceYAMLNS` 添加 URL path fallback 提取 resource 类型(当 `c.Param("resource")` 为空时从 URL path 解析)
- 前端:
- `WorkloadViewPage.tsx` 重写 (~480行):
- **Bug 修复**: kind 从 `useLocation().pathname` 提取(原 `params.kind` 永远 undefined — 静态路径段不是 :param)
- **增强**: 更新策略卡片(RollingUpdate partition/maxUnavailable/maxSurge + podManagementPolicy + revisionHistoryLimit)
- **增强**: 选择器与标签卡片(selector.matchLabels + labels + annotations)
- **增强**: VolumeClaimTemplates 表格(StatefulSet 专有 — PVC 模板 name/accessModes/storageClass/size)
- **增强**: Init Containers 展示
- **增强**: ContainerInfo 子组件(提取重复容器渲染逻辑)
- **增强**: DaemonSet 状态卡片增加"已更新"字段
- `NamespaceResourcePage.tsx`: `handleDetail` 添加 statefulsets/daemonsets 点击导航(view 模式)
- App.tsx 路由已就绪(`:mode/StatefulSet/:name` + `:mode/DaemonSet/:name`)
- api.ts 方法已就绪(getStatefulSetDetail/getDaemonSetDetail/scaleStatefulSet/restartStatefulSet/restartDaemonSet)
**验收标准**:
- [x] DS YAML API 返回 200 + apiVersion + kind=DaemonSet(路由冲突修复)
- [x] DS Detail API 返回 name/desired/current/ready/containers
- [x] Deployment YAML API 仍然正常(generic 路由未受影响)
- [x] SPA 路由 view/yaml 两种模式均返回 200
- [x] TypeScript 零编译错误 + Vite 构建成功
- [x] NamespaceResourcePage 点击 STS/DS 行可跳转详情页
- [x] WorkloadViewPage 支持 view/yaml 双模式切换
- [x] DaemonSet 详情页正确显示 kind=DaemonSet(非 StatefulSet)
---
### 后续(P3+)
### M12: 事件聚合 + 告警联动 [done]
**目标**: 从扁平事件列表升级为事件聚合看板,支持原因/命名空间/资源类型多维聚合 + 告警联动展示
**后端改动**:
- `kubernetesclient/client.go`: EventItem 结构体已有完整字段(InvolvedObject/Type/Reason/Message/Count/FirstTimestamp/LastTimestamp),无需改动
- `kubernetes.go`: 新增 `GetEventsSummary` handler — 聚合事件统计:
- 按 Reason 聚合(Top 15):统计每种 Warning 原因的累计触发次数
- 按 Namespace 聚合(Top 15):哪个命名空间告警最多
- 按 Resource Kind 聚合:Pod/Node/Deployment 等资源类型分布
- 最新告警事件列表(Top 10 by lastTimestamp)
- 时间窗口过滤(hours 参数:1h/6h/24h/7d/all)
- `routes.go`: 注册 `GET /:clusterCode/events/summary`
**前端改动**:
- `EventsPage.tsx` 完整重写(~480行):
- 概览卡片:事件总数 / 告警事件累计次数 / 正常事件 / 告警类型数
- 三维度柱状图(recharts):告警原因 Top-N / 命名空间分布 / 资源类型分布
- 图表交互:点击柱状图自动过滤事件列表(reason/kind 联动)
- 最新告警面板:红色高亮卡片,展示最近 10 条 Warning 事件
- 时间窗口选择器(全部/1h/6h/24h/7d)
- 事件列表增强:可展开行(显示首次/最后出现时间 + 事件名称)、告警类型高亮、相对时间显示
- 已选过滤 Badge(可点击移除)
**验收标准**:
- [x] `GET /:clusterCode/events/summary` 返回 total/warning_count/normal_count/by_reason/by_namespace/by_kind/recent_warnings
- [x] 时间窗口过滤正常工作(hours=24 只返回近 24h 事件)
- [x] 前端三维度柱状图正确渲染(recharts)
- [x] 点击图表柱可过滤事件列表
- [x] 最新告警面板展示 Warning 事件
- [x] 事件列表行可展开查看详情
- [x] TypeScript 零编译错误 + Vite 构建成功
- [x] SPA 路由 `/kubernetes/:code/events` 返回 200
---
| 模块 | 描述 |
|------|------|
| M13 | 多集群资源对比看板 [done] |
### M13: 多集群资源对比看板 [done]
**目标**: 跨集群资源用量、节点分布、健康状态对比 — 全局视角的多集群运维看板
**后端改动**:
- `handlers/kubernetes.go`: 新增 `GetMultiClusterComparison` handler:
- 聚合所有集群的 DB 缓存数据(node_count/pod_count/deployment_count/service_count/cpu_usage/memory_usage)
- 从 `kubernetes_nodes` 表聚合节点级数据:CPU 核数总和、内存总量、master/worker 分布、健康/非健康节点数
- 集群级别 cpu_usage 为 0 时,用节点平均值回填
- 返回 `{clusters: [...], totals: {cluster_count, node_count, pod_count, ...}}`
- `routes.go`: 注册 `GET /kubernetes/compare`(全局路由,不属于特定集群)
**前端改动**:
- 新增 `ClusterComparePage.tsx` (~360行) — 多集群对比看板:
- 概览卡片:集群总数 / 节点总数 / Pod 总数 / Deployment 总数 / Service 总数
- 资源数量对比柱状图(节点/Pod/Deployment/Service — 4 维度并排)
- CPU/内存使用率对比柱状图(百分比)
- 资源雷达图(多集群 6 维度对比 — 仅 ≥2 集群时显示)
- 节点角色分布饼图(Master/Worker)
- 详细对比表格(可点击行跳转集群概览,含 CPU/内存使用率进度条)
- `api.ts`: 新增 `getMultiClusterComparison()` 方法
- `App.tsx`: 新增路由 `/kubernetes/compare`
- `Sidebar.tsx`: Kubernetes 菜单新增「多集群对比」入口(Layers 图标)
**验收标准**:
- [x] `GET /api/v1/kubernetes/compare` 返回 clusters 数组 + totals 聚合
- [x] totals 包含 cluster_count/node_count/pod_count/deployment_count/service_count
- [x] 每个集群包含 19 个字段(id/name/code/status/node_count/.../total_cpu_cores/total_memory_mb/master_count/worker_count)
- [x] 集群级别 cpu_usage 为 0 时用节点平均值回填
- [x] 前端 4 类图表正确渲染(柱状图×2 + 雷达图 + 饼图)
- [x] 详细对比表格可点击跳转集群概览
- [x] TypeScript 零编译错误 + Vite 构建成功
- [x] SPA 路由 `/kubernetes/compare` 返回 200(非 301/404)
| ID | 模块 | 优先级 | 状态 |
|----|------|:------:|:----:|
| Q1 | 前端类型安全治理 | P0 | pending |
| Q2 | kubernetes.go 拆分 | P0 | pending |
| Q3 | api.ts 拆分 | P0 | pending |
| F1 | 告警静默规则 | P1 | pending |
| F2 | 审计日志导出 | P1 | pending |
| F3 | 前端 RBAC 控制 | P1 | pending |
| A1 | K8s 路由统一 | P2 | pending |
| A2 | 告警引擎分布式 | P2 | pending |
| A3 | WebSocket 管理 | P2 | pending |
| U1 | 虚拟滚动 | P3 | pending |
| U2 | 统一 DataTable | P3 | pending |
| U3 | 国际化 | P3 | pending |
| U4 | 镜像优化 | P3 | pending |
---
@@ -328,49 +206,4 @@ pending → in_progress → done / blocked
每个模块完成后:
1. 更新本文件状态
2. 更新 PROJECT_EVALUATION.md 对应行
3. git commit message 格式: `feat(k8s): M1 SyncCluster metrics 采集`
---
### M14: Namespace 管理看板(资源配额 + 命名空间 CRUD)[done]
**目标**: 从仅返回命名空间名列表升级为完整的命名空间管理看板——含资源统计、配额状态、创建/删除操作
**后端改动**:
- `pkg/kubernetesclient/client.go`:
- `ListNamespacesDetailed()` — 返回完整 metadata(status/age/labels/annotations)
- `GetNamespace(name)` — 单个命名空间详情
- `CreateNamespace(name, labels)` — 创建命名空间
- `DeleteNamespace(name)` — 删除命名空间
- `ListResourceQuotas(namespace)` — 支持空 namespace 全集群模式
- `ListLimitRanges(namespace)` — 支持空 namespace 全集群模式
- `handlers/kubernetes.go`:
- `GetNamespacesDetail` — 全量命名空间 + 资源计数 + 配额状态(6 次 API 调用聚合,非 N×3)
- `GetNamespaceDetailHandler` — 单命名空间详情
- `CreateNamespaceHandler` — 创建(系统命名空间保护)
- `DeleteNamespaceHandler` — 删除(kube-system/default/devops 保护)
- `routes.go`:
- `GET /:clusterCode/namespaces/detail` — 全量命名空间详情
- `GET /:clusterCode/namespace/:namespace/detail` — 单命名空间详情
- `POST /:clusterCode/namespaces` — 创建命名空间
- `DELETE /:clusterCode/namespaces/:namespace` — 删除命名空间
**前端改动**:
- 新增 `NamespaceManagementPage.tsx` (~280行):
- 概览卡片:命名空间总数 / Deployments / Pods / Services / 配额限制数
- 命名空间表格:名称(可点击跳转)/ 状态 Badge / 年龄 / Dep/Pod/Svc 计数 / 配额状态 / 标签 / 操作(删除)
- 创建命名空间弹框(名称 + DNS-1123 提示)
- 删除确认弹框(红色警告 + 二次确认)
- 系统命名空间保护(kube-system/default/devops 不可删除)
- 搜索过滤
- `api.ts`: 新增 4 个方法(getNamespacesDetail/getNamespaceDetail/createNamespace/deleteNamespace)
- `App.tsx`: 新增路由 `kubernetes/:clusterCode/namespaces`
- `ClusterOverviewPage.tsx`: 命名空间区域新增「管理全部」链接
**验收标准**:
- [x] `GET /:clusterCode/namespaces/detail` 返回 9 个命名空间(含 status/age/labels/resource_counts)
- [x] 每个命名空间包含 7 个字段(name/status/age/labels/resource_counts/has_resource_quota/has_limit_range)
- [x] 创建命名空间 API 返回 200 + 创建后列表中出现
- [x] 删除命名空间 API 返回 200 + 删除后列表中消失
- [x] 系统命名空间删除被拦截(403)
- [x] SPA 路由 `/kubernetes/:code/namespaces` 返回 200
- [x] TypeScript 零编译错误 + Vite 构建成功
3. git commit message 格式: `refactor: Q2 kubernetes.go 模块化拆分`