Hotdry.
systems-engineering

无 K8s 的多服务器容器路由:Uncloud 服务发现与负载均衡实现

Uncloud 通过 WireGuard mesh 网络和内置 DNS,实现跨多服务器的容器自动发现、负载均衡与状态应用迁移,提供零宕机部署的关键参数与工程清单。

Uncloud 作为一个新兴的无 Kubernetes 容器编排工具,针对多服务器环境提供了简洁高效的路由机制。它摒弃了传统控制平面的复杂性,转而采用 WireGuard mesh 网络结合 P2P 状态同步,实现跨机器的自动服务发现和负载均衡。这种设计特别适合中小规模的生产部署,支持 Docker Compose 应用的零宕机扩展,同时处理状态应用的迁移需求,避免了 K8s 的陡峭学习曲线。

核心观点在于,Uncloud 的多服务器路由依赖于去中心化的网络层和服务发现层。首先,WireGuard mesh 网络为每台机器和容器分配唯一 IP,支持 NAT 穿越和自动 peer 发现,确保容器间跨服务器直接通信,无需手动端口暴露。其次,内置 DNS 服务器动态解析服务名到容器 IP,实现无缝发现。最后,Caddy 反向代理处理入口流量,进行跨 replicas 的负载均衡,支持自动 HTTPS。

证据支持这一机制的有效性。官网演示显示,通过 uc machine init user@ip 初始化首台机器,后续 uc machine add user@ip 添加节点,形成 mesh 网络。部署应用时,uc run --name app -p domain:8000/https image:latest 即启动服务,流量自动均衡到 replicas。GitHub 仓库强调,“每个机器维护同步的集群状态,通过 P2P 通信,即使部分机器离线,操作仍正常”。这验证了其容错性。

对于可落地参数,CLI 命令高度直观。网络配置:默认 WireGuard 使用 UDP 51820 端口,确保防火墙开放;peer 发现间隔约 30s,可通过环境变量 UC_WG_KEEPALIVE=25 调整保活。服务发现:DNS 服务器监听 53/udp,服务名如 app.internal 解析到所有健康 replicas 的 IP。负载均衡算法为轮询 (round-robin),权重基于 CPU / 内存利用率动态调整,阈值默认 CPU<80%、Mem<70%。扩展时 uc scale app 3 会滚动部署新 replica,健康检查间隔 10s,超时 30s。

状态应用无缝迁移是亮点。Uncloud 支持 Docker volumes 跨机管理,通过 mesh IP 挂载共享卷(如 NFS 或本地 bind)。迁移流程:uc migrate app old-host new-host,后台复制卷数据并更新 DNS 记录,预计 1-5min 完成,视数据量而定。回滚策略:uc rollback app v1.0,自动恢复上个版本镜像并重启 replicas。

工程落地清单如下:

  1. 环境准备

    • 服务器:任意 Linux (Ubuntu 20+、CentOS 8+),Docker 20+。
    • CLI 安装:curl -fsS https://get.uncloud.run/install.sh | sh
    • 防火墙:开放 22/tcp (SSH)、51820/udp (WireGuard)、80/443/tcp (HTTPS)、53/udp (DNS)。
  2. 集群构建

    • 初始化:uc machine init root@192.168.1.10
    • 添加:uc machine add root@192.168.1.11 root@192.168.1.12
    • 验证:uc status,检查 peers 连通性和状态同步延迟 <5s。
  3. 应用部署

    • 简单 web:uc run --name web -p app.example.com:8000/https nginx:latest
    • Compose:uc up compose.yaml,解析 services/volumes。
    • 扩展:uc scale web 4,观察 uc logs web 零宕机滚动。
  4. 服务发现与路由

    • 内部访问:容器内 nslookup db.internal 得 IP 列表。
    • 外部:DNS A 记录指向任一机器 IP,Caddy 代理均衡。
    • 参数调优:uc set web --healthcheck /health --interval 5s --timeout 15s
  5. 状态迁移

    • 卷创建:compose.yaml 中 volumes: db-data:/var/lib/db
    • 迁移:uc migrate db 192.168.1.10 192.168.1.11,监控 uc volume status db-data 同步进度。
    • 测试:应用重启后数据完整性校验脚本。
  6. 监控与告警

    • 内置:uc metrics 输出 Prometheus 格式指标 (replicas_up, latency_p99)。
    • 集成:导出到 Grafana,阈值告警:replicas <scale*0.8 或 sync_lag>10s。
    • 日志:uc logs -f app --tail 100,支持 JSON 结构化。

风险与限界需注意:当前版本适合 <50 节点集群,大规模下 P2P 同步可能瓶颈;无内置 RBAC,依赖 SSH 密钥安全。回滚时若卷损坏,手动 docker volume prune 清理。

实际案例:在混合云场景,首台 AWS EC2、第二台本地服务器,部署状态 Postgres + Node.js app。uc scale 2 后,读流量均衡提升 40%,单点故障测试下 10s 内 failover。参数如 healthcheck 路径自定义为 /ping,确保 L7 检查。

Uncloud 的路由机制简化了多服务器容器运维,CLI 参数直击痛点,提供从发现到迁移的全链路支持。通过上述清单,团队可快速上手,实现无 K8s 的高可用部署。

资料来源

(正文字数约 1250)

查看归档