生产环境横向扩展 Docker Swarm 服务
Swarm 服务水平扩缩容实战:查任务分布、scale 到 5 副本、回滚扩缩容、放置约束(按节点标签/AZ 分布)、自动伸缩思路。负载与冗余双视角讲清。
直接回答:Swarm 横向扩展的核心命令是 docker service scale 服务=N——调度器在满足资源和约束的节点间安排新增副本;扩展前先看任务分布(docker service ps),用 constraint 限制候选节点,用 placement-pref spread 表达跨可用区分布偏好;缩容即反向 scale,Swarm 负责优雅回收。
为什么扩
- 扛负载:更多实例均摊流量
- 抗故障:副本跨可用区分布,消除单点
- 提密度:资源利用不均时重新分布任务
实操流程
docker service ps web # 当前任务分布
docker service scale web=5 # 扩到 5 副本
docker service ps web # 验证分布
docker service scale web=3 # 缩回 3 副本
docker service rollback web # 回滚上一次服务变更
放置约束
docker node update --label-add az=cn-north-1a node1
docker node update --label-add az=cn-north-1b node2
docker service update --placement-pref-add 'spread=node.labels.az' web
所有候选节点应有正确 AZ 标签;spread 是显式、尽力而为的偏好,不是默认硬反亲和。constraint az==某区只会把任务限制到该区。需要每节点最多一份时另设 replicas-max-per-node,并检查剩余容量。
自动伸缩的思路
Swarm 无内置 autoscaler——实现路径:监控指标驱动外部脚本/CI 调 docker service scale(QPS 超阈值 +2 副本)。脚本必须设置最小/最大副本数、冷却时间、并发保护与故障回退,先在测试环境验证。QPS、延迟和错误率应来自应用指标或请求记录,与副本数同时观察;扩容后用相同负载复测,确认瓶颈没有转移到数据库或其他依赖。
常见问题(FAQ)
Q:扩容后流量立刻均衡吗?
A:ingress 路由网格对新副本即时生效;长连接场景旧连接不迁移——逐步均衡,对延迟敏感服务注意预热。
Q:scale 和 update --replicas 有什么区别?
A:效果相同;scale 是多服务批量操作的便捷写法,update 是通用服务变更入口。
Q:有状态服务能 scale 吗?
A:必须按数据库/应用自己的复制或分片协议扩容;多个数据库实例不能因为挂了同一 NFS 数据目录就安全并发写入。
官方参考
本文依据官方文档整理,示例未在本文中进行运行验证。生产部署需按所用版本、权限和实际负载验证。