Files
aiops/ROADMAP.md
T

16 KiB
Raw Blame History

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 已有)

验收标准:

  • 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/内存使用

改动:

  • 后端 ListPods handler 注入 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 增加 autoEdit prop — 打开即进入编辑模式
  • NamespaceResourcePage ConfigMap/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() — PATCH spec.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 编辑 Tab
  • DeploymentDetailPage.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
    • EditModeContainer Tab 系统(basic/containers/storage/advanced/service)
  • 所有 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: 新增 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: 节点名称可点击跳转详情页

验收标准:

  • 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 构建成功

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)

验收标准:

  • DS YAML API 返回 200 + apiVersion + kind=DaemonSet(路由冲突修复)
  • DS Detail API 返回 name/desired/current/ready/containers
  • Deployment YAML API 仍然正常(generic 路由未受影响)
  • SPA 路由 view/yaml 两种模式均返回 200
  • TypeScript 零编译错误 + Vite 构建成功
  • NamespaceResourcePage 点击 STS/DS 行可跳转详情页
  • WorkloadViewPage 支持 view/yaml 双模式切换
  • 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(可点击移除)

验收标准:

  • GET /:clusterCode/events/summary 返回 total/warning_count/normal_count/by_reason/by_namespace/by_kind/recent_warnings
  • 时间窗口过滤正常工作(hours=24 只返回近 24h 事件)
  • 前端三维度柱状图正确渲染(recharts)
  • 点击图表柱可过滤事件列表
  • 最新告警面板展示 Warning 事件
  • 事件列表行可展开查看详情
  • TypeScript 零编译错误 + Vite 构建成功
  • 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 图标)

验收标准:

  • GET /api/v1/kubernetes/compare 返回 clusters 数组 + totals 聚合
  • totals 包含 cluster_count/node_count/pod_count/deployment_count/service_count
  • 每个集群包含 19 个字段(id/name/code/status/node_count/.../total_cpu_cores/total_memory_mb/master_count/worker_count)
  • 集群级别 cpu_usage 为 0 时用节点平均值回填
  • 前端 4 类图表正确渲染(柱状图×2 + 雷达图 + 饼图)
  • 详细对比表格可点击跳转集群概览
  • TypeScript 零编译错误 + Vite 构建成功
  • 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 采集