Uncloud:没有控制平面的 Docker 集群,用 WireGuard 组网 + CRDT 同步状态
Uncloud 是一个轻量级的集群与容器编排工具,目标是在云 VM 和裸金属上部署、管理 Web 应用,同时把集群本身的运维开销压到最低。它在你已有的 Docker 主机之间建立一张 WireGuard 加密网格,然后在外层提供自动服务发现、负载均衡、带 HTTPS 的入口,以及一组简单 CLI。
和传统编排器的关键差别在架构:Uncloud 没有中心控制平面,也没有需要维护的 quorum。每台机器通过点对点通信各自持有一份同步的集群状态副本,因此部分机器掉线时,集群操作仍然可用。
特性
- 部署位置不受限:云 VM、独立服务器、裸金属都可以。
- Docker Compose 格式:沿用 compose 描述服务。
- 零停机部署:滚动更新;自动回滚(automatic rollback)尚在开发中。
- Unregistry 集成:可以把镜像直接构建并推送到机器上,不依赖外部 registry,且只传输缺失的镜像层。
- 服务发现:内置 DNS。
- 持久化存储:跨机器的 Docker volume。
- 零配置私有网络:WireGuard mesh、NAT 穿透,容器拿到唯一 IP。
- 无控制平面。
- 命令式优先于声明式(imperative over declarative)。
- 托管 DNS:
*.xxxxxx.uncld.dev,由 Uncloud DNS 提供。 - 自动 HTTPS:内置 Caddy,使用 Let's Encrypt。
- 类 Docker 的 CLI。
- 远程管理:可以 SSH 到任意一台机器上操作。
快速开始
安装(二选一):
brew install psviderski/tap/uncloud
curl -fsS https://get.uncloud.run/install.sh | sh
初始化第一台机器,然后跑一个服务:
uc machine init root@your-server-ip
uc run -p app.example.com:8000/https image/my-app
再为 app.example.com 建一条指向服务器 IP 的 DNS A 记录。
常用操作:
uc ls # 查看服务
uc rm my-app-name # 删除服务
uncloud-uninstall # 卸载
工作原理
没有中心控制平面
集群状态不存在某个 master 节点上。每台机器通过点对点通信持有一份同步副本,底层用的是 corrosion——来自 Fly.io 的、基于 CRDT 的分布式 SQLite。因为没有控制平面和 quorum 要维护,任意一台机器都是控制平面的完整备份。
初始化一台机器
CLI 通过 SSH 连上目标机器,然后:
- 安装 Docker 和
uncloudd守护进程,后者由 systemd 管理(单元为uncloud.socket、uncloud.service); - 生成 WireGuard 密钥对;
- 分配子网
10.210.0.0/24; - CLI 与
uncloudd之间通过 SSH 上的 gRPC 通信; - 启动 corrosion 容器,用于共享集群状态;
- 创建一个桥接网络并连接到 WireGuard 接口。
这台机器随即成为集群入口点,其地址被写入本机的 ~/.config/uncloud/config.yaml。
加入新机器
新机器会被分配一个新子网 10.210.1.0/24,双方交换 WireGuard 密钥、建立隧道,然后启动 uncloud-corrosion 容器。新机器只需要与一台已有机器建立 WireGuard 连接即可,其余节点信息通过共享状态获知。
运行一个服务
CLI 先挑一台机器,uncloudd 用 grpc-proxy(siderolabs)把请求转发过去;目标机器在桥接网络中启动 Docker 容器,容器拿到集群内唯一的 IP,范围是 10.210.X.2-254。
每台机器上以 global 模式运行的 Caddy 反向代理会监听集群状态变化,并据此更新路由配置。整条链路上没有控制平面或 master 节点。
项目状态
项目处于 pre-1.0,会有偶发的破坏性变更;核心的 build / push / deploy 工作流相对稳定。运行时依赖 Docker、Caddy、WireGuard 和 Corrosion。
设计上的灵感来源:Kamal(37signals)、Fly.io、Tailscale、Talos Linux / KubeSpan、Docker Swarm Classic、Rancher 1.x。
仓库与文档
- 主仓库:
- 文档:
- unregistry:
- uncloud-recipes:
- uncloud-dns:
- corrosion:
- grpc-proxy:
- 设计文档:
misc/design.md