Skip to content

[Feature] 支持 Kubernetes 部署与控制面多副本水平扩容 #648

Open

Description

@liubing0806

提交前自查

当前使用的版本

需求评估基于原仓库 main 源码:eee8f6ecb6ca04455e6edef0c8e498fb3be21f21,VERSION=1.3.207。

使用场景 / 痛点

希望控制面支持 Kubernetes(K8s)部署,在多个节点上运行至少两个副本,并根据请求量水平扩容,支持滚动更新、缩容和故障接管。现有远端 VM/槽位继续承担执行任务,这里关注控制面自身的扩展能力。

当前 Compose 使用单个控制面容器、host 网络、宿主 Docker socket 与本地目录。账号并发和每分钟请求数限制还使用 进程内 Map,调度占位和等待队列也有 实例本地状态。因此,多个 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

  1. liubing0806 commented on Oct 21, 2026

    @liubing0806
    Author

    已在 fork 的独立分支实现 Kubernetes 部署基础,并向原仓库提交 Draft PR:#651。

    依赖 #649(#647 的 PostgreSQL 迁移)。本次提供 Kustomize 部署、非 root 容器、持久卷、PG 独占控制面锁、PG 面板会话、就绪检查和 HTTP/SSE/WebSocket/终端排空。修复了真实容器中 Go API kernel 缓冲 SSE 小帧的问题,并补充旧 PG 快照恢复与跨 schema 保护。

    源码验证提交 6589eab3ca1179250a24c6ee5a5fee5e738e7f47,交付 head d71f9e2d95893d891e7a164eaca83138d4cf029f(后一个提交仅补文档与脱敏证据)。本机单节点 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/安全接管,再验证不同节点上的两个活动副本同时处理请求。此次单节点测试不证明多节点存储或无损故障接管;未使用真实供应商凭据,未执行生产切换或规模压测。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions