### 提交前自查 - [x] 已搜索现有 Issues 与 CHANGELOG.md。已有 #376 讨论主备高可用,本需求补充 Kubernetes 多副本同时承载请求和水平扩缩容的部署与验收要求。 ### 当前使用的版本 需求评估基于原仓库 `main` 源码:`eee8f6ecb6ca04455e6edef0c8e498fb3be21f21`,`VERSION=1.3.207`。 ### 使用场景 / 痛点 希望控制面支持 Kubernetes(K8s)部署,在多个节点上运行至少两个副本,并根据请求量水平扩容,支持滚动更新、缩容和故障接管。现有远端 VM/槽位继续承担执行任务,这里关注控制面自身的扩展能力。 当前 [Compose](https://github.com/dofastted/vm2api/blob/eee8f6ecb6ca04455e6edef0c8e498fb3be21f21/docker-compose.yml#L5-L38) 使用单个控制面容器、host 网络、宿主 Docker socket 与本地目录。账号并发和每分钟请求数限制还使用 [进程内 Map](https://github.com/dofastted/vm2api/blob/eee8f6ecb6ca04455e6edef0c8e498fb3be21f21/src/lib/pool/account-quota.mjs#L72-L80),调度占位和等待队列也有 [实例本地状态](https://github.com/dofastted/vm2api/blob/eee8f6ecb6ca04455e6edef0c8e498fb3be21f21/src/lib/pool/pool-scheduler.mjs#L341-L348)。因此,多个 Pod 同时服务时,需要配套共享状态和并发协调。 ### 建议方案 1. **官方部署资源**:提供 Helm Chart 或 Kubernetes manifests,覆盖 Deployment、Service、Ingress、ConfigMap/Secret、健康检查、资源配置,以及自动水平扩缩容和 PodDisruptionBudget 示例。明确现有 Docker socket、host 网络、本地目录依赖的处理方式及控制面与执行节点的边界。 2. **共享持久化与缓存更新**:结合 PostgreSQL 迁移,明确配置、面板登录会话、粘性会话映射、日志、运行状态和凭据文件的存储归属。副本间配置变更与缓存失效应保持一致,Pod 重建不能丢失必要状态。 3. **跨副本并发协调**:账号、VM 和 API 密钥的并发、每分钟请求数及会话占位需要全局原子协调;同一 VM 的变更需要互斥。副本异常退出后,过期占位和锁应能释放或被安全接管。 4. **后台任务协调**:备份、凭据刷新、健康检查和定时测试明确任务归属、幂等及接管机制,避免每个副本独立启动后重复执行同一任务。 5. **流式请求与滚动更新**:提供服务端事件(SSE)和 WebSocket 的 Ingress 超时/连接配置。Pod 终止时先停止接收新请求,再等待存量请求和持久化完成;明确超时及异常退出时的客户端重连行为。 ### 验收条件 - 两个控制面副本部署在不同 K8s 节点,同时承载请求;可扩容、缩容和滚动更新。 - 请求被分发到不同副本时,认证、配置、粘性会话和业务数据一致;账号及密钥的限流不会随副本数增加而失效。 - 同一计划任务不会被副本重复执行;停止或异常退出一个副本后,其余副本继续服务,锁和占位能够恢复。 - 集成测试覆盖普通 HTTP、SSE、WebSocket、跨副本并发,以及 Pod 重启、异常退出和滚动更新。 ### 现有替代做法 单控制面 Compose 加多个远端执行节点可以增加槽位容量,但控制面仍有单实例的容量与可用性限制。需要补充控制面层的 K8s 部署与多副本运行能力。 ### 关联需求 关联 #376(控制面主备高可用与平滑升级)。数据库迁移请求:https://github.com/dofastted/vm2api/issues/647。 PostgreSQL 提供共享持久化基础;本需求同时包含进程内运行状态、并发协调和 Kubernetes 生命周期适配。
Activity
liubing0806 commentedon Oct 21, 2026
已在 fork 的独立分支实现 Kubernetes 部署基础,并向原仓库提交 Draft PR:#651。
依赖 #649(#647 的 PostgreSQL 迁移)。本次提供 Kustomize 部署、非 root 容器、持久卷、PG 独占控制面锁、PG 面板会话、就绪检查和 HTTP/SSE/WebSocket/终端排空。修复了真实容器中 Go API kernel 缓冲 SSE 小帧的问题,并补充旧 PG 快照恢复与跨 schema 保护。
源码验证提交
6589eab3ca1179250a24c6ee5a5fee5e738e7f47,交付 headd71f9e2d95893d891e7a164eaca83138d4cf029f(后一个提交仅补文档与脱敏证据)。本机单节点 k3s 的 12 项运行检查全部通过:登录/PG、托管 API key 的非流式与分段 SSE、两条日志、第二实例拒绝、Recreate 重启后的 Cookie/API key/endpoint/PVC 保留。新镜像的两段正文到达间隔 999.9ms,修复前 0.1ms;实际 Pod imageID 已与候选镜像摘要核对。测试命名空间已删除。定向集成 119/119(
1366e203)、最终数据库/导入/备份 44/44、部署 33/33、Go API kernel race 通过。全量 unit 为 3350 pass/7 fail/10 skip(1366e203),全量 E2E 为 101 pass/17 fail/1 skip(6589eab3);失败断言逐摘要与原始eee8f6e一致。最后的备份边界修复通过定向回归,没有重跑全量 unit。#648 的水平多活仍未完成,因此保持 Issue 打开。 当前明确限制为
replicas: 1+ Recreate,误扩容会被锁拒绝。后续还需全局并发/RPM/座位准入、配置与缓存一致性、任务唯一执行和全局维护,以及远端执行 fencing/安全接管,再验证不同节点上的两个活动副本同时处理请求。此次单节点测试不证明多节点存储或无损故障接管;未使用真实供应商凭据,未执行生产切换或规模压测。