Docker Swarm 集群管理与维护指南
Swarm 集群日常运维:验证集群状态、扩容加节点、提升 worker 为 manager、drain 暂停节点派活、优雅缩容。扩缩容全流程命令与注意事项一篇讲清。
直接回答:Swarm 集群管理的核心动作——docker node ls 查状态、docker node update --availability drain 让节点拒收新任务(任务自动漂走)、docker node promote/demote 调整 manager 角色、扩容直接 join 新节点。优雅缩容的标准姿势:先 drain、验证业务,再退出和移除;不保证零中断。
先查集群状态
docker node ls # 节点角色与状态
docker service ls # 服务与副本分布
docker node inspect <node> # 单节点细节
扩缩容前先确认 manager 仲裁健康——通常用 3/5 个 manager;偶数可运行,但相比前一个奇数不增加容错能力。
扩容(Scaling out)
在现有 manager 执行 docker swarm join-token worker,把返回的 join 命令安全交给新节点执行。加入节点不会自动迁移既有任务;新增或被重调度的任务才可能落到新节点。
调整角色与隔离节点
docker node promote worker3 # worker 升 manager
docker node update --availability drain node2 # 排干:不再派新任务,存量任务迁移
drain 用于维护与缩容,不是安全隔离:它不关闭网络,也不停止独立的 docker run 容器。疑似入侵还需隔离网络、撤销凭证和保全证据。
优雅缩容(Scaling in)
docker node update --availability drain node3
# 确认任务迁移完成后
docker node demote node3 # 若为 manager 先降级
# 在 node3 执行 docker swarm leave 后,回 manager 执行:
docker node rm node3
先确认剩余 manager 保持多数仲裁且其他节点容量足够。运行中节点通常不能直接 rm,不要把 --force 当常规缩容步骤。
任务迁移后还要验证对外接口。可以在变更前配置观测云的 HTTP 拨测,指定业务 URL、预期状态码和响应时间条件,比较 drain 前后的结果;服务副本和调度状态仍用上述 Swarm 命令核对。
常见问题(FAQ)
Q:manager 节点挂了一个怎么办?
A:3 manager 挂 1 不影响仲裁;尽快恢复或补位。挂 2 个则失去仲裁,不能管理或重调度任务,既有 worker 上任务通常仍继续运行——这是 manager 要奇数且分散部署的原因。
Q:drain 后任务不迁移?
A:检查服务是否有放置约束(placement constraints)把任务钉在特定节点;global 服务在 drain 节点上的任务也会停止,不会在其他节点额外补一份;独立容器不受 drain 管理。
Q:Swarm 还值得用吗(对比 K8s)?
A:中小规模、团队小的场景 Swarm 简单够用;生态与长期演进看 K8s。存量 Swarm 集群维护好即可,不必盲目迁移。
官方参考
本文依据官方文档整理,示例未在本文中进行运行验证。生产部署需按所用版本、权限和实际负载验证。