综合 Uncloud:没有控制平面的 Docker 集群,用 WireGuard 组网 + CRDT 同步状态

2026-09-18 21:30:57

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 连上目标机器,然后:

  1. 安装 Docker 和 uncloudd 守护进程,后者由 systemd 管理(单元为 uncloud.socketuncloud.service);
  2. 生成 WireGuard 密钥对;
  3. 分配子网 10.210.0.0/24
  4. CLI 与 uncloudd 之间通过 SSH 上的 gRPC 通信;
  5. 启动 corrosion 容器,用于共享集群状态;
  6. 创建一个桥接网络并连接到 WireGuard 接口。

这台机器随即成为集群入口点,其地址被写入本机的 ~/.config/uncloud/config.yaml

加入新机器

新机器会被分配一个新子网 10.210.1.0/24,双方交换 WireGuard 密钥、建立隧道,然后启动 uncloud-corrosion 容器。新机器只需要与一台已有机器建立 WireGuard 连接即可,其余节点信息通过共享状态获知。

运行一个服务

CLI 先挑一台机器,unclouddgrpc-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
复制全文 生成海报 Uncloud Docker 容器编排 WireGuard 运维部署

推荐文章

程序员茄子在线接单