- 后端: GetNodeDetail handler — 获取单个节点完整信息 * 系统信息: container_runtime/architecture/kubelet/os/kernel * 资源分配率: 遍历 Pod 计算 CPU/Memory/Pods requested vs allocatable * metrics-server 数据注入 (cpu_usage_m/mem_usage_mi) * 全量 conditions/taints/labels + 节点上的 Pod 列表 - 后端: K8s 客户端扩展 * NodeTaint/NodeCondition 扩展字段 (reason/message) * NodeInfo 增加 architecture/operatingSystem * GetNode(name) 单节点查询方法 * parseCpuToMilli()/parseMemToMi() 资源解析辅助函数 - 后端: 注册路由 * GET /kubernetes/:clusterCode/nodes/:name (Kuboard code) * GET /kubernetes-clusters/:id/nodes/:name (ID) - 前端: NodeDetailPage.tsx (~330行) * 系统信息卡片 + 资源分配率卡片(进度条) * 条件卡片 + 污点卡片 + 标签卡片 + Pod 列表 - 前端: 节点名称可点击跳转 (ClusterOverviewPage) - 验证: API/SPA/TS/Vite 全部通过
10 KiB
10 KiB
K8s 管理功能演进路线图
每个模块 = 1 个 cron 周期(6h)可完成的中等粒度功能。完成后更新状态。
当前冲刺:P0 — Metrics 数据贯通
M1: SyncCluster 增加 metrics 采集 [done]
目标: 同步时采集 node/pod metrics,写入 DB 的 cpu_usage/memory_usage 字段
后端改动:
SyncClusterhandler 中,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 已有)
验收标准:
- SyncCluster 后 DB
kubernetes_nodes表 cpu_usage/memory_usage 非零 - 节点列表页 CPU/内存百分比非零
- 集群详情页无硬编码 mock 数据
- curl
/kubernetes-clusters/:id返回的 node_count/pod_count 正确
M2: Pod Metrics 详情页接入 [done]
目标: Deployment 详情页和 Pod 列表展示真实 CPU/内存使用
改动:
- 后端
ListPodshandler 注入GetPodMetrics()(类似 ListNodes 已有逻辑) - 前端 Pod 列表表格增加 CPU/内存列
- DeploymentView 容器详情区域读取 metrics
验收标准:
- Pod 列表有 CPU/内存使用量列
- 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 默认日期格式
验收标准:
- 可上传文件到 Pod 容器内
- 上传后文件列表刷新可见
- verify 字段返回正确文件大小
M4: ConfigMap/Secret 编辑 [done]
目标: 目前只读,增加在线编辑能力
改动:
- 后端
UpdateResourceYAMLNS端点已支持 configmaps/secrets(无需改动) - 前端
YamlViewer增加autoEditprop — 打开即进入编辑模式 NamespaceResourcePageConfigMap/Secret 行增加显式编辑按钮(铅笔图标)- 统一
cleanBeforeEdit=true— 编辑前自动清理 status/managedFields/uid 等只读字段 k8s-yaml-utils.ts的cleanYAML()提供行级清理
验收标准:
- 可在线编辑 ConfigMap 并保存
- 保存后 K8s 中实际生效(curl 验证 label 增删 → GET 确认)
M5: Deployment 暂停更新 + CI/CD 集成 [done]
目标: 接通顶部菜单的暂停更新和 CI/CD 按钮
改动:
- 后端
POST .../deployments/:name/pause和/resume(ID 路由 + Kuboard code 路由) - 客户端
PauseDeployment()/ResumeDeployment()— PATCHspec.paused布尔字段 - Deployment 列表 summary 增加
paused字段,前端可读取暂停状态 - 前端操作菜单增加「暂停更新/恢复更新」动态切换 + 暂停 Badge
- CI/CD 按钮跳转到流水线页面(传递 namespace+deployment 上下文)
验收标准:
- 可暂停/恢复 Deployment 滚动更新
- 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 编辑 TabDeploymentDetailPage.tsx:mode类型扩展为'view' | 'edit' | 'yaml'DeploymentWorkload.tsx新增EditModeContainer— 编辑模式 Tab 导航(基本信息✅ / 容器信息M7 / 存储M8 / 高级M8 / 服务M9)- 路由
:mode参数自动支持yaml值(无需改 App.tsx 路由表)
验收标准:
- 三模式 tab 切换正常,YAML 模式打开 CodeMirror 编辑器
- 基本信息 Tab 可编辑 labels/annotations/replicas 并保存
- YAML 编辑器有语法高亮和行号
- YAML 编辑器支持内联模式(inline prop)
- 编辑模式 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)
验收标准:
- 可添加/删除工作容器和初始化容器
- 每个容器的所有常规字段可编辑
- 保存后 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
验收标准:
- 可定义 6 种数据卷并挂载到容器
- 可编辑更新策略和调度策略
- 保存后 K8s 中实际生效(PUT application/yaml 直通 K8s API)
- TypeScript 编译零错误 + Vite 构建成功
- SPA edit 路由返回 200(非 301)
- 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
EditModeContainerTab 系统(basic/containers/storage/advanced/service)
- 5 Tab 编辑器全部
- 所有 5 Tab 已在 DeploymentWorkload.tsx EditModeContainer 中接入
验收标准:
- 可在编辑器内创建/编辑关联 Service
- 5 Tab 编辑的数据合并保存成功(各 Tab 独立 PUT 完整 manifest)
- DeploymentWorkload.tsx 5 Tab 全部 available
- TypeScript 编译零错误 + Vite 构建成功
后续规划(P2+)
M10: Node 详情页(PID/容器运行时/分配率)[done]
目标: 节点名称可点击进入详情页,展示完整的系统信息、资源分配率、污点、条件、Pod 列表
改动:
- 后端:
kubernetesclient/client.go: 新增NodeTaint/NodeCondition扩展字段 +NodeInfo增加architecture/operatingSystem+GetNode(name)方法kubernetes.go: 新增GetNodeDetailhandler — 获取单个节点详情 + 遍历 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/:nodeNameClusterOverviewPage.tsx: 节点名称可点击跳转详情页
- 新增
验收标准:
GET /kubernetes/:clusterCode/nodes/:name返回完整详情(container_runtime/kubelet/os/kernel/architecture)- 资源分配率正确计算(cpu_alloc_pct/mem_alloc_pct/pod_alloc_pct)
- metrics-server 数据注入(cpu_usage_m/mem_usage_mi)
- 节点条件全量返回(5个 conditions 含 reason/message)
- 污点列表返回
- 节点上的 Pod 列表返回(含 CPU/内存 requests)
- 前端节点名称可点击跳转
- SPA 路由返回 200(非 301)
- TypeScript 零编译错误 + Vite 构建成功
后续(P3+)
| 模块 | 描述 |
|---|---|
| M11 | StatefulSet/DaemonSet 详情页(对标 Deployment) |
| M12 | 事件聚合 + 告警联动 |
| M13 | 多集群资源对比看板 |
状态标记规则
pending → in_progress → done / blocked
每个模块完成后:
- 更新本文件状态
- 更新 PROJECT_EVALUATION.md 对应行
- git commit message 格式:
feat(k8s): M1 SyncCluster metrics 采集