Docker Swarm 生产高可用搭建指南
Swarm 生产 HA 全流程:3 manager 仲裁、worker 扩容、节点 drain、高可用 Nginx 服务部署、故障转移演练方法。从初始化到 failover 演练一篇走完。
直接回答:Swarm 高可用的要点——奇数个 manager(生产 3 个,Raft 仲裁容忍 1 个故障)、worker 按需扩展、服务多副本跨节点分布、drain 优雅维护节点。可通过 drain 演练任务重调度,但 drain 不等于 manager 故障,不能证明仲裁故障转移或零中断。
术语与要求
- manager:管集群状态(Raft 共识),也跑任务
- worker:只跑任务
- HA 底线:3 manager(挂 1 不影响仲裁)、服务副本 ≥2 且跨节点
搭建流程
# 节点1
docker swarm init --advertise-addr <IP1>
docker swarm join-token manager # 拿 manager 令牌
docker swarm join-token worker # 拿 worker 令牌
# 其余节点分别按角色 join
docker node ls # 验证集群
部署高可用服务
docker service create --name web --replicas 3 --replicas-max-per-node 1 -p 80:80 nginx
该示例需要至少 3 个满足约束且容量足够的可调度节点;max-per-node 强制每节点最多一份,不足则 Pending。ingress 可让存活节点接收发布端口流量,但客户端若只连故障节点 IP 仍会失败,入口需要负载均衡与健康检查。仅向可信节点开放 2377/TCP、7946/TCP/UDP、4789/UDP 等集群端口,不把 VXLAN 端口暴露公网。
故障转移演练
docker node update --availability drain <manager2>
在隔离测试环境观察重调度耗时、错误率和长连接中断;另用受控关机/断网演练 manager 故障及入口故障。同时记录期望与实际副本数、节点状态、入口请求结果,按同一时间线核对恢复过程。没有负载、时间线和观测记录,不能声明 HA 已验证。
常见问题(FAQ)
Q:manager 也跑业务任务好吗?
A:小集群可以;大集群建议 manager 专用(--availability drain 常驻),控制面与业务负载隔离。
Q:Raft 日志会撑爆磁盘吗?
A:应监控 Swarm 数据目录容量,并按官方管理指南在保持仲裁的前提下备份。不要直接删除 raft 文件以释放空间。
Q:HA 能跨机房吗?
A:可以但注意延迟——Raft 对网络 RTT 敏感,跨地域建议 federation 思路(多集群)而非单集群拉伸。
官方参考
本文依据官方文档整理,示例未在本文中进行运行验证。生产部署需按所用版本、权限和实际负载验证。