Files
aiops/ROADMAP.md
T

332 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# K8s 管理功能演进路线图
> 每个模块 = 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 正确
---
### M2: Pod Metrics 详情页接入 [done]
**目标**: Deployment 详情页和 Pod 列表展示真实 CPU/内存使用
**改动**:
- 后端 `ListPods` handler 注入 `GetPodMetrics()`(类似 ListNodes 已有逻辑)
- 前端 Pod 列表表格增加 CPU/内存列
- DeploymentView 容器详情区域读取 metrics
**验收标准**:
- [x] Pod 列表有 CPU/内存使用量列
- [x] Deployment 详情页容器 CPU/内存非 mock
---
### M3: Pod 文件上传 [done]
**目标**: PodFileBrowser 增加上传能力
**改动**:
- 后端新增 `POST .../pods/:pod/files/upload` — multipart 表单接收,base64 分块 exec 写入
- 前端 PodFileBrowser 增加上传按钮 + FormData 上传
- **重大修复**: `ExecInPod` 从 raw HTTP SPDY(不工作)改为 WebSocket channel.k8s.io 协议(和 ExecTerminal 一致)
- **修复**: BusyBox `ls` 不支持 `--time-style`,解析器改为兼容 BusyBox 默认日期格式
**验收标准**:
- [x] 可上传文件到 Pod 容器内
- [x] 上传后文件列表刷新可见
- [x] verify 字段返回正确文件大小
---
### M4: ConfigMap/Secret 编辑 [done]
**目标**: 目前只读,增加在线编辑能力
**改动**:
- 后端 `UpdateResourceYAMLNS` 端点已支持 configmaps/secrets(无需改动)
- 前端 `YamlViewer` 增加 `autoEdit` prop — 打开即进入编辑模式
- `NamespaceResourcePage` ConfigMap/Secret 行增加显式编辑按钮(铅笔图标)
- 统一 `cleanBeforeEdit=true` — 编辑前自动清理 status/managedFields/uid 等只读字段
- `k8s-yaml-utils.ts` 的 `cleanYAML()` 提供行级清理
**验收标准**:
- [x] 可在线编辑 ConfigMap 并保存
- [x] 保存后 K8s 中实际生效(curl 验证 label 增删 → GET 确认)
---
### M5: Deployment 暂停更新 + CI/CD 集成 [done]
**目标**: 接通顶部菜单的暂停更新和 CI/CD 按钮
**改动**:
- 后端 `POST .../deployments/:name/pause` 和 `/resume`(ID 路由 + Kuboard code 路由)
- 客户端 `PauseDeployment()` / `ResumeDeployment()` — PATCH `spec.paused` 布尔字段
- Deployment 列表 summary 增加 `paused` 字段,前端可读取暂停状态
- 前端操作菜单增加「暂停更新/恢复更新」动态切换 + 暂停 Badge
- CI/CD 按钮跳转到流水线页面(传递 namespace+deployment 上下文)
**验收标准**:
- [x] 可暂停/恢复 Deployment 滚动更新
- [x] CI/CD 按钮可跳转到流水线页面
---
## 当前冲刺:P1 — Deployment 可视化编辑器(Kuboard 风格)
### M6: 编辑器基础设施 + 基本信息 Tab + YAML编辑器 [done]
**目标**: 三模式切换(查看/可视化编辑/YAML编辑)+ 基本信息 Tab
**改动**:
- `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 路由表)
**验收标准**:
- [x] 三模式 tab 切换正常,YAML 模式打开 CodeMirror 编辑器
- [x] 基本信息 Tab 可编辑 labels/annotations/replicas 并保存
- [x] YAML 编辑器有语法高亮和行号
- [x] YAML 编辑器支持内联模式(inline prop)
- [x] 编辑模式 Tab 导航系统就绪(M7-M9 预留占位)
---
### 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)
---
## 状态标记规则
```
pending → in_progress → done / blocked
```
每个模块完成后:
1. 更新本文件状态
2. 更新 PROJECT_EVALUATION.md 对应行
3. git commit message 格式: `feat(k8s): M1 SyncCluster metrics 采集`