首页 > 解决方案 > Docker 约束,直到节点关闭

问题描述

我在一个集群 [swarm] 中有 5 个 Docker 节点。假设我将约束 NGINX [它与 nginx 无关,它只是一个示例] 仅部署在 Docker 节点 1 上。我能否以这样的方式创建该约束,即如果 Docker 节点 1 出现问题,则约束不会不再可用?

就像,只有在节点可达时才具有该约束,当它不是时,自动删除约束?

标签: docker

解决方案


是的,您可以使用placement-ref 在此处https://docs.docker.com/engine/reference/commandline/service_create/#specify-service-placement-preferences---placement-中将传播策略放置到您的node.hostname=your.node1.hostnameas 文档中 选项

如果某一类别中的节点(例如,具有 node.labels.datacenter=south 的节点)由于约束或资源限制而无法处理其公平份额的任务,则如果可能,额外的任务将被分配给其他节点。

不利的一面是,当您的节点 1 重新联机时,服务将不会更新和重新平衡,直到服务再次更新(手动或服务关闭)。

此外,如果您的服务必须放在一个特殊的节点上,这不是一个好的设计,但它应该被设计为能够在任何地方工作,这样您就可以平衡所有节点的服务器负载。关于 NGINX,它是无状态的,您可以将其部署到所有节点,并让 docker 路由混乱来进行负载平衡。如果您的服务是有状态的,即使它重新部署到第二个节点,您的数据也将不可用,并且您的整个服务也会中断。所以我真正的答案是你的问题是可能的,但不是对 Docker Swarm 设计方式的期望,也可能不是很好。

如果您有充分的理由坚持您的问题解决方案。您可以考虑在您的 NGINX(或其他)前面安装一个负载均衡器,例如另一个 NGINX 或 HAProxy,这将允许您更多地控制将您的请求路由到主节点并使用辅助节点或更多节点仅用于备份目的,依此类推。设计将是您在全局模式下部署无状态负载均衡器,并且您的核心服务在 LB 后面运行。当您的节点 1 关闭或服务正在更新或重新定位时,这种设计不会给您带来停机时间。


推荐阅读