主题
K8s 多集群管理平台 · 需求规格说明书 v2.1
文档信息
| 字段 | 内容 |
|---|---|
| 文档版本 | v2.1 |
| 对应设计文档 | 系统设计文档 v2.1 |
| 编写日期 | 2026-07-31 |
| 状态 | 待评审 |
| 变更摘要 | v2.0 → v2.1:新增性能优化需求(分页/缓存/字段裁剪/Watch增量/虚拟滚动)、应用负责人绑定与飞书告警通知需求 |
一、功能需求清单
FR-01:集群管理
| ID | 需求描述 | 优先级 | 验收标准 |
|---|---|---|---|
| FR-01-01 | 支持注册新集群(录入名称、API 地址、kubeconfig) | P0 | 注册后自动校验连通性,成功/失败给出明确提示 |
| FR-01-02 | 支持查看集群列表和健康状态 | P0 | 显示 apiserver / etcd / node Ready 状态,异常标红 |
| FR-01-03 | 支持同步集群节点信息到平台数据库 | P0 | 节点信息包含:名称、IP、规格、Labels、Taints、Conditions、Allocatable |
| FR-01-04 | 支持编辑 / 删除集群 | P1 | 删除前校验无应用在使用该集群,有则拒绝并提示 |
| FR-01-05 | 集群连接信息 AES-256 加密存储 | P0 | 数据库中的 kubeconfig / token 字段不可明文读取 |
FR-02:域(Zone)管理
| ID | 需求描述 | 优先级 | 验收标准 |
|---|---|---|---|
| FR-02-01 | 支持创建 / 编辑 / 删除域 | P0 | 创建域时配置:名称、超卖比、HPA 默认值、ResourceQuota、污点策略 |
| FR-02-02 | 支持将节点分配到指定域(打 Label) | P0 | 节点打标后,已有 Pod 不受影响,新 Pod 按亲和性调度 |
| FR-02-03 | 支持查看域资源水位(Request / Limit / Actual) | P0 | 数据刷新间隔 ≤ 10s(WebSocket 增量),饱和度颜色正确 |
| FR-02-04 | 隐私域创建时自动配置 NetworkPolicy Deny All | P0 | 新建隐私域 NS 时自动创建 Default Deny NetworkPolicy |
| FR-02-05 | 异常观察域支持设置 TTL,到期后自动缩容 | P1 | TTL 到期前 3 天提醒,到期后 Pod 缩到 0,数据保留 7 天 |
| FR-02-06 | 域删除前校验无应用在使用 | P0 | 有运行中的应用则拒绝删除并列出应用清单 |
FR-03:标签管理
| ID | 需求描述 | 优先级 | 验收标准 |
|---|---|---|---|
| FR-03-01 | 平台维护标签字典(枚举值),用户从字典中选择 | P0 | 字典覆盖所有系统标签和业务标签,自由输入被拒绝 |
| FR-03-02 | 应用发布时未指定域标签,自动注入默认域 | P0 | 注入同时记录审计日志,看板标注 "⚠️ 未指定域" |
| FR-03-03 | 支持查看标签漂移(节点标签与实际调度不匹配) | P1 | 列出所有不一致的节点和应用,标注漂移方向 |
| FR-03-04 | AI 标签命名建议:用户输入自由标签时推荐标准化名称 | P2 | 推荐准确率 > 80%(人工抽检 100 条) |
| FR-03-05 | 标签变更影响分析 | P2 | 输入节点标签变更 → AI 给出受影响的应用列表 |
FR-04:应用管理
| ID | 需求描述 | 优先级 | 验收标准 |
|---|---|---|---|
| FR-04-01 | 支持从模板创建应用 | P0 | 内置至少 3 种模板(微服务 / 批处理 / 前端静态) |
| FR-04-02 | 支持从镜像创建应用 | P0 | 填入镜像地址后自动解析端口和健康检查路径 |
| FR-04-03 | 支持查看应用列表(虚拟滚动 + 分页) | P0 | 万级数据首屏 < 1s,滚动 60fps 不卡顿 |
| FR-04-04 | 应用列表只返回摘要字段(fields=summary) | P0 | 默认响应体单条 < 2KB,不含 spec.template 完整定义 |
| FR-04-05 | 支持应用详情页按需加载各 Tab 数据 | P0 | 首屏基本信息 < 500ms,其他 Tab 点击后 < 2s |
| FR-04-06 | 支持应用发布(RollingUpdate) | P0 | 发布过程可视化,可暂停 / 继续 / 回滚 |
| FR-04-07 | 支持一键回滚到指定历史版本 | P0 | 回滚后验证 Pod 状态,记录操作日志 |
| FR-04-08 | 支持手动扩缩容和 HPA 配置 | P0 | HPA 生效后看板显示当前副本数和目标 |
| FR-04-09 | 支持 ConfigMap / Secret 版本化管理 | P1 | 修改 ConfigMap 后可触发滚动重启 |
| FR-04-10 | 支持查看 Pod 日志和 Web 终端 | P1 | 日志支持关键字搜索和时间范围筛选 |
| FR-04-11 | 支持查看 K8s Events 时间线 | P1 | 按时间倒序,支持按类型过滤 |
| FR-04-12 | 发布前 AI 风险评估 | P2 | 对比新旧版本 diff,输出风险等级和高 / 中 / 低建议 |
| FR-04-13 | 发布后 AI 智能回滚判断 | P2 | 发布后 5xx 飙升自动弹出回滚建议 |
| FR-04-14 | 应用负责人绑定 | P0 | 创建 / 编辑应用时可搜索添加负责人(用户 / 团队),支持多负责人 |
| FR-04-15 | 负责人通知渠道配置 | P0 | 每个负责人可独立配置飞书 / 邮件渠道和告警级别(全部 / 仅严重 / 不接收) |
| FR-04-16 | 负责人降级策略 | P0 | 无负责人时降级到域管理员 → 超级管理员 |
FR-05:智能看板
| ID | 需求描述 | 优先级 | 验收标准 |
|---|---|---|---|
| FR-05-01 | 全局总览:所有域卡片式排列,显示关键指标 | P0 | 包含:节点数、Pod 数、Request%、Limit%、Actual%、饱和度 |
| FR-05-02 | 域详情:节点列表 + 应用 TopN + 时序图 | P0 | 时序图支持 1h / 24h / 7d 切换 |
| FR-05-03 | 节点 / 应用详情:Pod 级明细 | P0 | 显示每个 Pod 的 CPU / Mem Request / Limit / Actual |
| FR-05-04 | 看板数据通过 WebSocket 增量推送 | P0 | 事件到前端渲染延迟 < 500ms |
| FR-05-05 | 看板数据三级缓存(L1 内存 5s / L2 Redis 30s / L3 K8s API) | P0 | L1 命中率 > 50%,L2 命中率 > 80% |
| FR-05-06 | AI 异常标记:在看板上标注异常波动点 | P1 | 点击异常点可查看 AI 分析的根因假设 |
| FR-05-07 | 自然语言查询:"核心域过去 24h OOM 最多的 5 个应用" | P2 | AI 生成 PromQL 并返回结果表格 |
FR-06:监控 & 告警
| ID | 需求描述 | 优先级 | 验收标准 |
|---|---|---|---|
| FR-06-01 | 每集群独立 Prometheus 采集,平台通过 VM 聚合查询 | P0 | 看板数据来自 VM 统一查询接口 |
| FR-06-02 | 内置基础设施告警规则(节点 NotReady / etcd 切换等) | P0 | 告警触发后 5s 内出现在平台告警列表 |
| FR-06-03 | 支持用户自定义告警规则(PrometheusRule) | P1 | 提供表单和 YAML 两种编辑方式 |
| FR-06-04 | 告警通知:飞书 / 邮件 / Webhook | P0 | 按域路由到不同接收组,按负责人精准触达 |
| FR-06-05 | 飞书告警卡片消息 | P0 | 卡片包含:应用名 / 集群 / 域 / 时间 / 指标值 / AI 分析 / 操作按钮 |
| FR-06-06 | 飞书卡片交互按钮(查看详情 / AI 诊断 / 一键回滚) | P0 | 点击按钮跳转平台对应页面(需登录鉴权) |
| FR-06-07 | 告警风暴防护 | P0 | 同应用 5min 内多条告警合并;单应用每分钟最多 3 条通知 |
| FR-06-08 | AI 告警降噪:同域 5min 内多条告警聚合为一条 | P1 | 聚合后显示根因假设 + 影响范围 |
| FR-06-09 | AI 告警规则生成:"P99>1s 告警" → 自动生成 PromQL | P2 | 生成结果可预览和微调 |
FR-07:RBAC & 审计
| ID | 需求描述 | 优先级 | 验收标准 |
|---|---|---|---|
| FR-07-01 | 三级角色:超级管理员 / 域管理员 / 只读用户 | P0 | 域管理员只能看到自己管理的域 |
| FR-07-02 | 支持用户增删改查 | P0 | 密码 bcrypt 加密存储 |
| FR-07-03 | 所有写操作记录审计日志(append-only) | P0 | 日志包含:用户、时间、操作、对象、变更前后;禁止 UPDATE / DELETE |
| FR-07-04 | 审计日志支持按条件检索和导出 | P1 | 支持按用户 / 时间 / 资源类型过滤,导出 CSV |
| FR-07-05 | AI 操作独立审计(ai_tool_audit 表) | P1 | 记录 AI 的每次 Tool 调用和结果 |
| FR-07-06 | 隐私域操作额外存证(不可篡改日志) | P0 | 使用独立日志通道,WORM 存储 |
FR-08:AI 智能体(Copilot)
| ID | 需求描述 | 优先级 | 验收标准 |
|---|---|---|---|
| FR-08-01 | Copilot 侧边栏:随时唤出对话界面 | P1 | 不离开当前页面即可对话 |
| FR-08-02 | 对话支持流式输出(SSE) | P1 | 打字机效果,token 级流式 |
| FR-08-03 | 支持多轮对话和上下文记忆 | P1 | 同一会话内可追问,跨会话不混淆 |
| FR-08-04 | 知识库管理:支持导入 K8s 文档和平台手册 | P2 | 上传 PDF / Markdown 后自动向量化 |
| FR-08-05 | AI 洞察中心:集中展示 AI 生成的建议 | P1 | 每条洞察可确认 / 忽略 / 执行 |
| FR-08-06 | 安全护栏:危险操作二次确认 | P0 | DELETE / DRAIN 等操作必须用户点确认 |
| FR-08-07 | 安全护栏:AI 权限 ≤ 用户权限 | P0 | 只读用户通过 AI 也不能执行写操作 |
| FR-08-08 | 安全护栏:隐私域数据只走本地模型 | P0 | 隐私域查询时强制路由到本地 Ollama |
| FR-08-09 | 安全护栏:AI 回答需附带数据来源 | P0 | 数据类回答标注 PromQL / 日志来源 |
FR-09:AI 辅助排障
| ID | 需求描述 | 优先级 | 验收标准 |
|---|---|---|---|
| FR-09-01 | 应用详情页 "AI 诊断" 按钮,点击后执行诊断 | P1 | 30 秒内返回诊断结果 |
| FR-09-02 | 规则引擎覆盖 10 种常见故障 | P1 | 每种故障命中时置信度 ≥ 75% |
| FR-09-03 | LLM 参与复杂日志分析和多信号关联 | P1 | 输出结构化 JSON:根因 + 证据 + 建议 |
| FR-09-04 | 诊断结果展示:根因 + 证据链 + 修复建议 + 操作按钮 | P1 | 低风险操作可一键执行,高风险需确认 |
| FR-09-05 | 告警触发时自动后台诊断,结果推送飞书 | P1 | 推送包含根因 + 一键回滚按钮 |
| FR-09-06 | 诊断结果反馈收集(有帮助 / 无帮助) | P2 | 反馈数据存入数据库,用于模型迭代 |
| FR-09-07 | 排障知识沉淀:成功诊断自动生成知识库草稿 | P2 | 草稿经人工审核后正式入库 |
| FR-09-08 | 知识库命中时直接给出方案(不调 LLM,秒级) | P2 | 命中后响应时间 < 1s |
FR-10:🆕 性能优化
| ID | 需求描述 | 优先级 | 验收标准 |
|---|---|---|---|
| FR-10-01 | 应用列表使用游标分页(K8s Continue Token) | P0 | 万级数据翻页无性能衰减,无 offset |
| FR-10-02 | 应用列表默认只返回摘要字段(fields=summary) | P0 | 默认 12 字段,单条 < 2KB;full 模式需显式指定 |
| FR-10-03 | 前端虚拟滚动渲染列表 | P0 | DOM 节点恒定 < 50 个,万级列表 60fps |
| FR-10-04 | 三级缓存架构(L1 内存 5s / L2 Redis 30s / L3 K8s API) | P0 | L1 命中率 > 50%,L2 命中率 > 80% |
| FR-10-05 | Write-Through 缓存失效(Watch 事件触发) | P0 | 数据变更后缓存 5s 内失效 |
| FR-10-06 | WebSocket 增量推送(替代看板轮询) | P0 | 事件到渲染 < 500ms,HTTP 请求量减少 90% |
| FR-10-07 | 应用详情页 Tab 懒加载 | P0 | 首屏 < 500ms,非首屏 Tab 点击 < 2s |
| FR-10-08 | 后端并行查询(goroutine pool,max 10) | P0 | 列表加载从 3s → 800ms |
| FR-10-09 | 搜索防抖(300ms) | P0 | 输入停止 300ms 后才发送请求 |
| FR-10-10 | 告警风暴防护(合并 / 限速 / 静默) | P0 | 告警量下降 70% |
FR-11:🆕 应用负责人 & 飞书通知
| ID | 需求描述 | 优先级 | 验收标准 |
|---|---|---|---|
| FR-11-01 | 应用创建 / 编辑时可绑定负责人(用户 / 团队) | P0 | 支持搜索用户、多选、设置主备 |
| FR-11-02 | 每个负责人独立配置通知渠道(飞书 / 邮件 / Webhook) | P0 | 渠道开关独立,可组合 |
| FR-11-03 | 每个负责人独立配置告警级别(全部 / 仅严重 / 不接收) | P0 | 级别过滤在路由层生效 |
| FR-11-04 | 飞书群机器人 Webhook 通知 | P0 | 发送卡片消息,包含应用信息 + AI 分析 + 操作按钮 |
| FR-11-05 | 飞书卡片支持交互按钮(查看详情 / AI 诊断 / 一键回滚 / 认领 / 静默) | P0 | 按钮点击跳转平台对应页面 |
| FR-11-06 | 飞书个人消息通知(需用户绑定 open_id) | P2 | 通过 open_id 发送个人卡片消息 |
| FR-11-07 | 用户飞书绑定流程(OAuth2 授权) | P2 | 点击绑定 → 跳转飞书授权 → 回调获取 open_id |
| FR-11-08 | 通知降级策略(负责人 → 域管理员 → 超级管理员) | P0 | 每级都有超时(5min),超时自动升级 |
| FR-11-09 | 通知日志记录(谁 / 什么告警 / 什么渠道 / 是否成功 / 是否点击) | P0 | 日志保留 90 天,支持查询统计 |
| FR-11-10 | 通知效果分析(告警响应时间 / 黑洞识别) | P2 | 统计面板,按负责人 / 应用 / 域维度 |
二、非功能需求
| ID | 需求描述 | 量化指标 | 验收方式 |
|---|---|---|---|
| NFR-01 | 平台 API 响应时间 | 列表 < 1s(走缓存),详情 < 2s,P99 < 3s | 压测工具验证 |
| NFR-02 | 并发支持 | 50 并发用户操作无报错 | 压测:50 并发持续 10min |
| NFR-03 | 数据安全 | kubeconfig AES-256 加密;HTTPS 全站;密码 bcrypt | 安全审计 + 渗透测试 |
| NFR-04 | 平台自身可用性 | 99.9%(年度停机 < 8.76h) | 监控平台自身 uptime |
| NFR-05 | 兼容性 | Kubernetes 1.24 ~ 1.30 | 多版本测试矩阵 |
| NFR-06 | 浏览器兼容 | Chrome 100+, Firefox 100+, Edge 100+ | 手动验证 |
| NFR-07 | AI 响应时间 | 规则命中 < 3s;LLM 诊断 < 30s;流式首字 < 2s | 计时验证 |
| NFR-08 | 列表性能 | 万级应用列表首屏 < 1s,滚动 60fps | Chrome DevTools 性能分析 |
| NFR-09 | 缓存命中率 | L1 > 50%,L2 > 80% | Redis INFO + 应用 metrics |
| NFR-10 | WebSocket 可靠性 | 断线重连成功率 100%,指数退避最大 30s | 网络模拟测试 |
| NFR-11 | 通知可达性 | 飞书通知送达率 > 99%,P99 延迟 < 5s | 通知日志统计 |
| NFR-12 | 审计完整性 | 审计日志零丢失,append-only 不可篡改 | 定期校验 + WORM 测试 |
三、数据需求
| ID | 需求描述 | 存储方式 | 保留期限 |
|---|---|---|---|
| DR-01 | 平台业务数据(集群/域/应用/用户) | PostgreSQL | 永久 |
| DR-02 | 指标数据(CPU/Mem/QPS 等) | VictoriaMetrics | 90 天 |
| DR-03 | 日志数据(容器日志 / 平台日志) | Loki / ES | 普通域 30 天,隐私域 90 天 |
| DR-04 | AI 对话历史和知识库向量 | PostgreSQL(PGVector 扩展) | 对话 90 天,知识库永久 |
| DR-05 | kubeconfig 等敏感字段 | AES-256 加密存储 | 永久 |
| DR-06 | 审计日志 | append-only,禁止 UPDATE / DELETE | 永久 |
| DR-07 | 通知日志 | PostgreSQL | 90 天 |
| DR-08 | 告警事件 | PostgreSQL | 180 天 |
四、接口需求
| ID | 需求描述 | 协议 / 格式 |
|---|---|---|
| IR-01 | 平台提供 RESTful API | JSON over HTTPS |
| IR-02 | API 认证使用 JWT Bearer Token | Authorization: Bearer <token> |
| IR-03 | AI 对话接口使用 SSE(Server-Sent Events)流式返回 | text/event-stream |
| IR-04 | 看板增量数据使用 WebSocket 推送 | WS / WSS |
| IR-05 | 外部 CI 系统通过 API 触发发布 | Webhook(HMAC 签名验证) |
| IR-06 | 告警通知通过 Webhook 推送到飞书 | 飞书开放平台 API |
| IR-07 | 飞书卡片按钮回调接收 | 飞书事件订阅(加密验证) |
五、约束与假设
| 类型 | 内容 |
|---|---|
| 约束 | 目标用户为运维人员,界面可适当专业,不需过度简化 |
| 约束 | 平台自身部署在虚拟机 / 物理机上,不依赖 K8s |
| 约束 | 隐私域必须使用独立集群 |
| 约束 | LLM 推理必须支持私有化部署 |
| 约束 | 飞书通知 Phase 1 仅支持群机器人 Webhook,个人消息 Phase 2 |
| 假设 | 每个业务团队拥有一个或多个 Namespace |
| 假设 | 每个集群至少有 2 个可用区(AZ) |
| 假设 | 公司已部署 Prometheus 和 VictoriaMetrics |
| 假设 | 公司已开通飞书开放平台,可创建企业自建应用 |
六、性能优化需求详述
6.1 应用列表分页
| 需求点 | 说明 |
|---|---|
| 分页方式 | 使用 K8s 原生 Continue Token(游标分页),不使用 offset |
| 默认页大小 | 20 条 / 页,最大 50 条 / 页 |
| 响应字段 | 默认 fields=summary(12 字段),可选 basic(~30 字段)/ full(全部) |
| 排序规则 | 默认按异常程度降序(Error → Degraded → Healthy),其次按名称字母序 |
| 搜索 | 前端 300ms 防抖后发送,支持应用名模糊匹配 |
| 筛选 | 域筛选 / 状态筛选 / 团队筛选,组合条件 AND 逻辑 |
6.2 前端虚拟滚动
| 需求点 | 说明 |
|---|---|
| 组件 | vue-virtual-scroller 的 RecycleScroller |
| 行高 | 固定 56px |
| DOM 节点 | 可视区域约 15-20 行,恒定 < 50 个 DOM 节点 |
| 触底加载 | 滚动到距底部 200px 时触发 loadMore |
| 筛选切换 | 重置列表 + 从头加载(清空 next_token) |
| 增量更新 | WebSocket 收到变更 → 更新对应行(不重新拉列表) |
6.3 三级缓存
| 层级 | 存储 | TTL | 命中率目标 | 失效策略 |
|---|---|---|---|---|
| L1 | 本地内存(sync.Map) | 5s | > 50% | Watch 事件触发立即失效 |
| L2 | Redis | 30s | > 80%(含 L1) | Write-Through + TTL 兜底 |
| L3 | K8s API | - | 兜底 | List + Watch 增量 |
6.4 WebSocket 增量推送
| 需求点 | 说明 |
|---|---|
| 连接时机 | 进入看板 / 应用列表页时建立 |
| 参数 | cluster_id(必选)+ zone(可选) |
| 消息类型 | ADDED / MODIFIED / DELETED / ALERT_FIRING / ALERT_RESOLVED |
| 重连策略 | 指数退避:1s → 2s → 4s → ... → 最大 30s |
| 心跳 | 每 30s 发送 ping,60s 无 pong 则断开重连 |
6.5 详情页懒加载
| Tab | 加载时机 | 数据量 | 目标耗时 |
|---|---|---|---|
| 基本信息 | 首屏立即加载 | ~8KB | < 500ms |
| Pod 列表 | 点击 Tab 时加载 | ~5KB | < 1s |
| 日志 | 点击 Tab + 选择容器后加载 | 按需 | < 2s |
| 事件 | 点击 Tab 时加载 | ~3KB | < 1s |
| 监控 | 点击 Tab 时加载 | 时序数据 | < 2s |
| 配置 | 点击 Tab 时加载 | ~2KB | < 500ms |
| YAML | 点击 Tab 时加载(仅高级用户) | ~50KB | < 2s |
七、飞书通知需求详述
7.1 飞书集成方案
| Phase | 能力 | 说明 |
|---|---|---|
| Phase 1 | 群机器人 Webhook | 简单,无需用户授权,发到团队群 |
| Phase 2 | 个人消息(open_id) | 需用户 OAuth2 绑定,精准到个人 |
7.2 飞书卡片消息规格
| 元素 | 内容 |
|---|---|
| Header | 严重等级图标 + 标题(应用名 + 告警摘要) |
| 正文 | 应用 / 集群 / 域 / 时间 / 指标值 / 影响范围 |
| AI 分析区 | 根因假设 + 置信度 + 证据摘要 |
| 操作按钮 | 查看详情(primary)/ AI 诊断(default)/ 一键回滚(danger)/ 认领 / 静默 |
| 页脚 | 平台链接 + 通知 ID(用于追踪) |
7.3 通知降级流程
Level 0: 应用负责人(飞书群 + 邮件)
│ 5min 内未响应(无点击 / 无认领)
▼
Level 1: 域管理员(飞书群)
│ 5min 内未响应
▼
Level 2: 超级管理员(飞书 + 邮件 + 电话)
│ 仍无响应
▼
Level 3: 写入告警池(平台内可见)+ 日志记录7.4 通知效果追踪
| 指标 | 计算方式 | 用途 |
|---|---|---|
| 送达率 | 成功发送数 / 总发送数 | 监控飞书服务健康 |
| 响应时间 | 首次点击时间 - 发送时间 | 评估负责人响应速度 |
| 黑洞识别 | 某负责人 7 天内告警响应率 < 20% | 提醒管理员调整负责人 |
| 告警收敛率 | 合并后告警数 / 原始告警数 | 评估降噪效果 |
八、待定事项(Open Issues)
| # | 问题 | 决策 | 状态 |
|---|---|---|---|
| OI-01 | 告警自动诊断的范围 | 仅手动触发,告警产生后不自动调用 AI 诊断,运维点击按钮后执行 | ✅ 已确认 |
| OI-02 | 排障知识库是否对开发团队开放 | 开放,新增 developer 角色,只读知识库 + 脱敏日志 | ✅ 已确认 |
| OI-03 | 本地 LLM 的 GPU 资源配置 | 需配置 GPU 节点,推荐 A100 80G×1 或 A6000 48G×2 | ✅ 已确认 |
| OI-04 | 是否需要对接公司 LDAP/SSO | 对接 LDAP,Phase 1 即引入,LDAP group 映射平台角色 | ✅ 已确认 |
| OI-05 | 飞书通知方式 | Phase 1 仅群机器人,Phase 2 加个人消息 | ✅ 已确认 |
| OI-06 | 列表页默认排序规则 | 按异常程度(Error 排最前) | ✅ 已确认 |
九、O-I 决策影响分析
9.1 OI-01:仅手动触发 AI 诊断
9.1.1 需求变更
| 原需求 | 变更后 |
|---|---|
| FR-09-05:告警触发时自动后台诊断,结果推送飞书 | 改为:告警产生后,在告警详情页和飞书卡片显示 [🤖 AI 诊断] 按钮,运维手动点击后触发诊断 |
9.1.2 新增需求
| ID | 需求描述 | 优先级 | 验收标准 |
|---|---|---|---|
| FR-09-09 | 告警详情页显示 [🤖 AI 诊断] 按钮 | P1 | 按钮在所有非 resolved 状态的告警上可见 |
| FR-09-10 | 飞书告警卡片包含 [🤖 AI 诊断] 按钮 | P1 | 点击跳转平台并自动执行诊断 |
| FR-09-11 | AI 诊断历史与告警关联 | P1 | 同一告警的多次诊断记录在告警详情页可查看 |
9.1.3 设计影响
变更前:
告警产生 → 自动后台诊断 → 结果推送飞书
变更后:
告警产生 → 写入告警列表 → 展示 [AI 诊断] 按钮
│
运维点击按钮
▼
执行 AI 诊断流程
│
结果展示 + 推送飞书
好处:
├── 节省 LLM 算力(大量告警不需要诊断)
├── 避免误判干扰(AI 诊断不是 100% 准确)
├── 运维按需使用,体验更好
└── 不改变告警本身的通知链路(飞书通知照常发送)9.1.4 算力节省估算
假设:每天 500 条告警,其中 20% 需要诊断
变更前:500 × LLM 调用/天
变更后:100 × LLM 调用/天
节省:80% 算力9.2 OI-02:排障知识库对开发开放
9.2.1 新增角色:developer
| 属性 | 说明 |
|---|---|
| 角色标识 | developer |
| 认证方式 | LDAP(cn=developers group 自动映射) |
| 权限范围 | 只读:知识库 + 应用基本信息(脱敏)+ 应用日志(脱敏) |
| 不可操作 | 发布 / 回滚 / 扩缩 / 删除 / 配置修改 |
9.2.2 新增需求
| ID | 需求描述 | 优先级 | 验收标准 |
|---|---|---|---|
| FR-12-01 | 新增 developer 角色 | P1 | LDAP group=developers → 自动获得 developer 权限 |
| FR-12-02 | developer 可搜索 / 浏览知识库 | P1 | 仅显示 verified=true 的条目 |
| FR-12-03 | developer 可查看应用基本信息(脱敏) | P1 | 不显示 Secret 值 / 镜像仓库凭证 / 内部 IP |
| FR-12-04 | developer 可查看应用日志(脱敏) | P2 | 自动遮蔽手机号 / 身份证 / token / 密码 |
| FR-12-05 | developer 不可见:Secret 内容 / ConfigMap 敏感键 | P0 | 前端校验 + 后端 API 拦截 |
| FR-12-06 | developer 可评论 / 点赞知识条目 | P2 | 评论内容人工审核后公开 |
| FR-12-07 | developer 可见 "联系运维" 按钮 | P1 | 点击后创建工单 / 发送飞书消息给负责人 |
9.2.3 权限矩阵
| 资源 | super_admin | zone_admin | readonly | developer |
|---|---|---|---|---|
| 集群管理 | ✅ RW | ❌ | ❌ | ❌ |
| 域管理 | ✅ RW | ✅ RW(本域) | ❌ | ❌ |
| 应用发布/回滚 | ✅ RW | ✅ RW(本域) | ❌ | ❌ |
| 应用基本信息 | ✅ RW | ✅ RW | ✅ R | ✅ R(脱敏) |
| ConfigMap/Secret | ✅ RW | ✅ RW | ✅ R | ❌(仅元数据) |
| 应用日志 | ✅ RW | ✅ RW | ✅ R | ✅ R(脱敏) |
| Pod 终端 | ✅ RW | ✅ RW | ❌ | ❌ |
| 知识库(读写) | ✅ RW | ✅ RW | ✅ R | ✅ R(仅 verified) |
| 知识库(评论) | ✅ | ✅ | ✅ | ✅ |
| AI 诊断 | ✅ RW | ✅ RW | ✅ R | ❌ |
| 告警规则 | ✅ RW | ✅ RW(本域) | ✅ R | ❌ |
| 审计日志 | ✅ R | ✅ R(本域) | ✅ R | ❌ |
9.3 OI-03:本地 LLM 的 GPU 资源配置
9.3.1 推荐配置方案
| 方案 | GPU | 显存 | 模型 | 推理框架 | 并发 | 适用场景 |
|---|---|---|---|---|---|---|
| A(推荐) | A100 80G × 1 | 80GB | Qwen2.5-72B-Instruct (FP16) | vLLM | ~20 req/s | 100+ 人团队 |
| B(经济) | A6000 48G × 2 (NVLink) | 96GB | Qwen2.5-32B-Instruct (FP16) | vLLM | ~10 req/s | 50 人以下团队 |
| C(起步) | A100 80G × 1 | 80GB | Qwen2.5-14B-Instruct (FP16) | Ollama | ~15 req/s | MVP 阶段 |
9.3.2 部署需求
| ID | 需求描述 | 优先级 | 验收标准 |
|---|---|---|---|
| FR-13-01 | GPU 节点独立部署(不在业务集群内) | P0 | GPU 节点物理隔离,仅平台 API 可访问 |
| FR-13-02 | 推理服务通过内网 IP + 端口访问 | P0 | 不暴露公网,防火墙仅放行平台 API IP |
| FR-13-03 | 模型文件存储在本地 NVMe SSD | P0 | 可用空间 > 500GB,IOPS > 100K |
| FR-13-04 | 平台通过 HTTP 调用推理服务(OpenAI 兼容接口) | P0 | 接口格式:/v1/chat/completions |
| FR-13-05 | 定时健康检查(ping /v1/models) | P0 | 连续 3 次失败 → 告警 + 降级到备用模型 |
| FR-13-06 | 模型热加载 / 热切换能力 | P1 | 不中断服务的前提下切换模型版本 |
| FR-13-07 | 推理服务资源限制(防 OOM 影响宿主) | P0 | GPU 显存上限 + CPU/内存 cgroup 限制 |
| FR-13-08 | 推理请求超时控制 | P0 | 默认 60s 超时,超时返回降级响应 |
| FR-13-09 | Token 用量统计(按用户/团队/应用维度) | P2 | 月度报表,用于成本分摊 |
9.3.3 降级策略
Primary: 本地 vLLM (Qwen2.5-72B)
│ 健康检查连续 3 次失败 / 响应 > 60s
▼
Secondary: 本地 Ollama (Qwen2.5-14B) ← 小模型兜底
│ 同样不可用
▼
Tertiary: 规则引擎 only(不调 LLM)
│
└── 仅返回确定性规则匹配结果(如 OOM/ImagePull 等 100% 置信度规则)9.4 OI-04:对接 LDAP
9.4.1 认证流程
用户输入用户名/密码
│
▼
平台将凭证转发至 LDAP 服务器验证
│
┌────┴────┐
│ 验证成功 │ → 查询 LDAP 获取用户属性
└─────────┘ (displayName / email / groups)
│
▼
本地 users 表 upsert(同步 LDAP 属性)
│
▼
根据 LDAP group → 映射平台角色
┌─────────────────────────────────────────┐
│ cn=ops-admin → super_admin │
│ cn=ops-zone-core → zone_admin:core │
│ cn=developers → developer │
│ cn=ops-readonly → readonly │
└─────────────────────────────────────────┘
│
▼
签发 JWT Token → 正常登录
验证失败 → 返回 401 + 错误提示9.4.2 新增需求
| ID | 需求描述 | 优先级 | 验收标准 |
|---|---|---|---|
| FR-14-01 | 平台支持 LDAP 认证(Phase 1 即引入) | P0 | 用户使用 LDAP 账号密码登录 |
| FR-14-02 | LDAP group → 平台角色自动映射 | P0 | 登录后角色正确,无需手动分配 |
| FR-14-03 | LDAP 用户属性同步(displayName/email) | P0 | 首次登录自动创建本地用户记录 |
| FR-14-04 | 定时全量同步(默认 1h) | P1 | LDAP 中禁用的账号 → 平台标记为 disabled |
| FR-14-05 | 本地 admin 账号兜底 | P0 | LDAP 不可用时可用本地账号登录 |
| FR-14-06 | LDAP 连接信息 AES-256 加密存储 | P0 | 数据库中的 bind_password 不可明文读取 |
| FR-14-07 | 支持 LDAP over TLS(ldaps://) | P0 | 生产环境强制 TLS,否则拒绝连接 |
| FR-14-08 | 支持多 LDAP 服务器(主备) | P2 | 主服务器不可用时自动切换备服务器 |
| FR-14-09 | 登录审计(成功/失败/锁定) | P1 | 连续 5 次失败 → 锁定 30min |
9.4.3 LDAP 配置项
yaml
# config.yaml 中的 LDAP 配置段
ldap:
enabled: true
servers:
- url: "ldaps://ldap-primary.company.com:636"
priority: 1
- url: "ldaps://ldap-standby.company.com:636"
priority: 2
base_dn: "dc=company,dc=com"
bind_dn: "cn=platform-svc,ou=serviceaccounts,dc=company,dc=com"
bind_password_enc: "AES-256 加密字符串"
user_filter: "(uid={username})"
user_attr_map:
display_name: "displayName"
email: "mail"
phone: "mobile"
group_filter: "(member={dn})"
group_attr: "cn"
group_mapping:
"cn=ops-admin,dc=company,dc=com": "super_admin"
"cn=ops-zone-core,dc=company,dc=com": "zone_admin:core"
"cn=ops-zone-batch,dc=company,dc=com": "zone_admin:batch"
"cn=developers,dc=company,dc=com": "developer"
"cn=ops-readonly,dc=company,dc=com": "readonly"
sync_interval: "1h"
timeout: "10s"
tls_verify: true
tls_ca_cert: "/etc/platform/ldap-ca.pem"9.4.4 认证方式优先级
登录请求到达
│
▼
┌─────────────────────────────────┐
│ 判断认证方式 │
│ │
│ ldap.enabled == true? │
│ ├── 是 → 尝试 LDAP 认证 │
│ │ ├── 成功 → 签发 JWT │
│ │ └── 失败 → 尝试本地账号 │
│ │ ├── 成功 → 签发 JWT│
│ │ └── 失败 → 401 │
│ │ │
│ └── 否 → 仅本地账号认证 │
└─────────────────────────────────┘9.4.5 角色映射冲突处理
| 场景 | 处理方式 |
|---|---|
| 用户在多个 LDAP group 中 | 取最高权限角色(super_admin > zone_admin > developer > readonly) |
| LDAP group 未配置映射 | 默认赋 readonly 角色 + 记录告警日志 |
| 用户被从所有 LDAP group 移除 | 保留本地账号但标记为 disabled |
| LDAP 中删除用户 | 下次同步时标记为 disabled,不删除(保留审计记录) |
十、需求追溯矩阵(更新版)
| 需求 ID | 需求简述 | 设计文档章节 | 优先级 |
|---|---|---|---|
| FR-01 ~ FR-03 | 集群/域/标签管理 | §3.1, §4 M1-M2 | P0/P1 |
| FR-04 | 应用管理(含负责人绑定) | §3.2, §4 M3 | P0-P2 |
| FR-05 ~ FR-06 | 看板/监控告警 | §4 M4-M5 | P0-P2 |
| FR-07 | RBAC & 审计 | §4 M6 | P0/P1 |
| FR-08 ~ FR-09 | AI Copilot / 排障 | §4 M7-M8, §9 | P0-P2 |
| FR-10 | 性能优化 | §5, §10, 附录F | P0 |
| FR-11 | 负责人 & 飞书通知 | §6, §10 | P0-P2 |
| FR-12 | developer 角色 & 知识库开放 | §4 M6, §9.2 | P1/P2 |
| FR-13 | GPU 资源配置 & 推理服务 | §9, §9.3 | P0/P1 |
| FR-14 | LDAP 认证集成 | §4 M6, §9.4 | P0/P1 |
附录
- 附录 A:功能需求追溯矩阵(需求 ID ↔ 设计文档章节)
- 附录 B:性能优化验收测试用例
- 附录 C:飞书卡片消息 JSON Schema
- 附录 D:API OpenAPI 3.0 规范(独立文件)
- 附录 E:数据库 DDL(独立文件,见设计文档第七章)
附录 A:需求追溯矩阵
| 需求 ID | 需求简述 | 设计文档章节 | 优先级 |
|---|---|---|---|
| FR-01-01 ~ FR-01-05 | 集群管理 | §3.1, §4 Module 1 | P0/P1 |
| FR-02-01 ~ FR-02-06 | 域管理 | §3.1, §4 Module 2 | P0/P1 |
| FR-03-01 ~ FR-03-05 | 标签管理 | §3.4, §4 Module 2 | P0/P1/P2 |
| FR-04-01 ~ FR-04-16 | 应用管理 | §3.2, §4 Module 3 | P0-P2 |
| FR-05-01 ~ FR-05-07 | 智能看板 | §4 Module 4 | P0-P2 |
| FR-06-01 ~ FR-06-09 | 监控告警 | §4 Module 5 | P0-P2 |
| FR-07-01 ~ FR-07-06 | RBAC & 审计 | §4 Module 6 | P0/P1 |
| FR-08-01 ~ FR-08-09 | AI Copilot | §4 Module 7, §9 | P0-P2 |
| FR-09-01 ~ FR-09-08 | AI 排障 | §4 Module 8, §9.4 | P1/P2 |
| FR-10-01 ~ FR-10-10 | 性能优化 | §5, §10, §附录F | P0 |
| FR-11-01 ~ FR-11-10 | 负责人 & 飞书 | §6, §10 | P0-P2 |