Uncloud 项目提供了一种轻量级多 Docker 主机编排方案,其核心在于 WireGuard 全 mesh 网络叠加 CRDT 状态同步机制。这种设计摒弃了传统 Kubernetes 等工具的中央控制平面,转而采用去中心化架构,确保集群在部分节点故障时仍能维持操作。每个 Docker 主机独立维护完整集群状态,通过 P2P 通信实现最终一致性。这种方法特别适用于混合云、边缘计算场景,能显著降低运维复杂度。
WireGuard Mesh 网络构建
WireGuard mesh 是 Uncloud 网络层的基础。它为每个主机分配专用子网(如 10.210.0.0/24),容器通过桥接网络连接 WireGuard 接口,实现跨主机直接通信。关键优势在于自动 peer 发现和 NAT 穿越,无需手动配置隧道。
部署时,CLI 通过 SSH 连接 uncloudd daemon,生成 WireGuard 密钥对并分配子网。新节点加入仅需与一个现有节点交换密钥,其他节点通过状态同步自动建立全互联。证据显示,这种 mesh 设计支持任意拓扑组合,包括云 VM、裸机和本地服务器。
可落地参数:
- 子网分配:每个主机独占 /24 子网(10.210.X.0/24),容器 IP 范围 10.210.X.2-254,避免冲突。
- 端口:默认 UDP 51820,支持自定义;Keepalive 间隔 25s,确保 NAT 绑定。
- MTU:推荐 1420,兼容大多数网络路径,防范碎片化。
- Peer 限制:上限视内核内存,实际测试 50+ 节点稳定。
监控清单:
wg show检查握手状态,延迟 >30s 视为异常。- iptables 规则:PostUp/PostDown 自动添加 FORWARD/MASQUERADE,确保流量转发。
- NAT 穿越失败时,回滚至手动 Endpoint 指定(如公网 IP:51820)。
这种 mesh 提供生产级网络性能,吞吐接近线速,同时内置加密。
CRDT 状态同步机制
状态管理采用 Corrosion(CRDT-based distributed SQLite),每个节点运行 uncloud-corrosion systemd 服务。通过 gossip 协议 P2P 同步数据库变更,实现无主最终一致性。即使节点离线,集群操作通过任意存活节点继续。
CRDT(Conflict-free Replicated Data Type)确保并发写冲突自动合并,无需锁或 quorum。例如,服务部署记录以操作日志形式追加,合并时按时间戳 / 向量钟排序。Uncloud 的设计文档强调,这种方案将状态存储为 SQLite WAL 日志,Corrosion 层处理扇出同步。
冲突解决策略:
- 幂等操作:CLI 命令优先 imperative 风格,避免声明式 reconciliation 复杂性。
- 向量钟:每个变更带因果历史,丢包重传基于 bloom 过滤器。
- 阈值:同步间隔 1-5s,缓冲区 1MB,超时 10s 后标记 stale。
参数配置:
# uncloudd 配置片段
[corrosion]
sync_interval = "1s"
max_buffer = 1048576 # 1MB
timeout = "10s"
证据:初始化新集群时,corrosion 自动启动,状态在节点间 gossip 传播,支持远程管理。
集成部署与容错实践
部署流程:uc machine init 安装 Docker + uncloudd + corrosion,生成 WireGuard 配置;uc machine add 扩展节点,自动 mesh + 同步。服务运行如 uc run -p domain:port/https image,Caddy 代理监听状态变更,动态路由。
容错设计:
- 无单点:任意节点可代理 gRPC 请求至目标(grpc-proxy)。
- 自动 failover:Caddy/DNS 只指向健康节点(互联网可达验证)。
- 回滚:容器启动失败时,CLI 检测日志重试 3 次后移除。
工程清单:
- 预检:确保内核 >=5.6(WireGuard 模块),Docker 24+。
- 规模扩展:10 节点内零配置;>50 节点调 gossip fanout=3。
- 监控指标:Prometheus 抓取 uncloudd metrics(连接数、同步延迟)。
- 恢复:离线节点重启自动 rejoin,状态从 peers 拉取(<1min)。
风险控制:
- 网络分区:CRDT 容忍,合并时优先最新因果变更。
- 密钥泄露:定期轮换,CLI 支持
--regenerate-keys。
测试验证:在 3 节点混合环境(Oracle VM + Hetzner),kill 一节点后,剩余节点无缝接管部署 / 查询。
这种组合使 Uncloud 成为 Docker 多主机编排的理想选择,远低于 K8s 资源开销(<100MB RAM / 节点)。
资料来源:
- Uncloud GitHub Repo(https://github.com/psviderski/uncloud)
- Corrosion 项目(https://github.com/superfly/corrosion)