后端: - routes.go: 为 statefulsets/daemonsets 注册专门 YAML 子路由(Gin radix tree 冲突) - kubernetes.go: GetResourceYAMLNS/UpdateResourceYAMLNS 添加 URL path fallback 前端: - WorkloadViewPage.tsx 重写: 修复 kind 提取 bug(useLocation) + 更新策略/选择器/PVC模板/InitContainers - NamespaceResourcePage.tsx: handleDetail 添加 STS/DS 点击导航 验证: DS YAML API 200 ✅ | DS Detail 200 ✅ | Dep YAML 200 ✅ | SPA路由 200 ✅ | TS零错误 ✅
265 lines
12 KiB
Markdown
265 lines
12 KiB
Markdown
# 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 | 事件聚合 + 告警联动 |
|
||
| M13 | 多集群资源对比看板 |
|
||
|
||
---
|
||
|
||
## 状态标记规则
|
||
|
||
```
|
||
pending → in_progress → done / blocked
|
||
```
|
||
|
||
每个模块完成后:
|
||
1. 更新本文件状态
|
||
2. 更新 PROJECT_EVALUATION.md 对应行
|
||
3. git commit message 格式: `feat(k8s): M1 SyncCluster metrics 采集`
|