在传统容器编排如 Kubernetes 中,etcd 等中心化存储带来高运维开销,而 Uncloud 则采用 WireGuard Mesh 网络结合 CRDT(冲突无关复制数据类型)状态同步,实现真正去中心化的 Docker 主机联邦。这种设计避免了单点故障,支持异构主机(如云 VM、裸机)间的自动 peer 发现和滚动部署,特别适合中小规模自托管场景。
Uncloud 的核心是每个主机运行 uncloudd 守护进程,通过 WireGuard 建立全网格 VPN,每个主机分配唯一子网(如 10.210.0.0/24),容器桥接至 WireGuard 接口实现跨主机直连通信。集群状态存储在 Corrosion—— 一个基于 CRDT 的分布式 SQLite 数据库中,每个主机运行 corrosion 服务,通过 P2P 方式在 WireGuard 网络上传递变更,实现最终一致性同步。“Uncloud 使用 Corrosion,这是一个 CRDT-based distributed SQLite database 来在主机间共享集群状态。” 无需主控节点,CLI 可通过任意主机 SSH + gRPC 代理操作整个集群,即使部分主机离线,剩余主机仍可正常工作。
这种架构的关键优势在于去中心化和低开销:WireGuard 提供高效加密隧道(默认 UDP 51820 端口,支持 NAT 穿越),CRDT 确保状态变更(如服务部署、机器加入)无冲突合并。添加新主机时,uncloudd 生成 WireGuard 密钥对,通过 Corrosion 状态广播给现有 peer,其他主机自动建立隧道并同步 Corrosion 数据。滚动部署通过 replicated/global 模式实现零停机更新,Caddy 反代自动配置 HTTPS 和负载均衡。
落地时,首先安装 CLI(curl -fsS https://get.uncloud.run/install.sh | sh),初始化首台主机:uc machine init root@ip(自动安装 Docker、uncloudd、corrosion,分配子网)。添加主机:uc machine add --name host2 root@ip2(~1min 内完成密钥交换和隧道建立)。部署服务:uc run -p domain:port/https image,支持 Docker Compose yaml 导入。
关键参数配置:
- WireGuard:监听端口 51820/UDP(防火墙放行),MTU 1420(适应 NAT),PersistentKeepalive 25s(NAT 保活)。每个主机端点:私有 10.0.0.x:51820 + 公网 IP:51820。
- Corrosion CRDT 同步:默认 gossip 间隔 5s,可调 /etc/systemd/system/uncloud-corrosion.service 重启。监控 sync lag <10s,状态:systemctl status uncloud-corrosion。
- 集群规模:测试支持 10+ 主机,>50 建议分区;子网 /24 容纳 254 容器。
- 滚动部署:replicas=3,update-strategy=rolling,healthcheck 阈值 30s。
监控要点清单:
- WireGuard:wg show(握手 >1min 重连),peer 数匹配主机数。
- Corrosion:journalctl -u uncloud-corrosion -f(CRDT 冲突率 <0.1%),sqlite 查询 cluster 表一致性。
- 集群:uc machine ls(STATE=Up),uc ls(服务 endpoints)。
- 性能:Prometheus 抓取 uncloudd metrics(gRPC /metrics),告警 sync_lag>30s 或 tunnel_down。
- 回滚:uc rm service(原子删除),machine rm(移除 peer,自动从 CRDT purge)。
风险与限界:项目活跃开发中,非生产就绪;SSH 密钥需强密码 / 密钥对;CRDT 最终一致性下,短暂不一致需业务容忍(如读 - any 写 - local)。异构主机需 Linux + Docker,arm64/x86 支持。
实践验证:在 3 主机(Oracle VM + Hetzner)上部署 web app,添加主机延迟 <2min,滚动更新无中断。通过 Corrosion 的 CRDT,状态变更(如容器 IP)自动传播,支持断网重连。
资料来源:Uncloud GitHub(https://github.com/psviderski/uncloud),Corrosion 项目。