能否为Docker Swarm服务指定节点优先部署策略?
Docker Swarm 节点优先部署实现方案
你原来写的 constraints 配置逻辑不对——Swarm 的 constraints 是逻辑与关系,节点必须同时满足所有约束条件才会被选中,所以你写的两个node.labels.service == xxx会导致没有节点符合要求,根本部署不了。
要实现你要的「优先部署到 postgres 节点,故障时 fallback 到 postgres_2,恢复后迁回」的逻辑,得结合constraints和preferences配置,具体如下:
正确的 Stack 配置示例
deploy: replicas: 1 placement: # 限定服务只能部署在带有postgres或postgres_2标签的节点上 constraints: - node.labels.service in (postgres, postgres_2) # 设置优先级:优先选择带有postgres标签的节点 preferences: - spread: node.labels.service==postgres # 可选:确保同一节点只跑一个服务副本 max_replicas_per_node: 1
逻辑说明
- 正常状态:Swarm 会优先将服务调度到带有
service==postgres标签的节点上。 - 故障转移:当 postgres 节点故障(脱离集群、状态不可用),Swarm 会自动在
service==postgres_2的节点上启动服务副本。 - 恢复回迁:Swarm 本身不会自动把服务从 postgres_2 迁回恢复后的 postgres 节点,你需要手动执行以下命令触发重新调度:
docker service update --force <你的服务名称>
执行后,Swarm 会重新评估节点优先级,将服务迁移到 postgres 节点,并自动删除 postgres_2 上的旧副本。
如果想要完全自动化回迁,可以写个简单脚本监控 postgres 节点的状态,当节点重新加入集群时自动执行上面的docker service update命令。
内容的提问来源于stack exchange,提问作者Zach Smith
相关产品推荐
相关产品推荐

