我在集群中有5个Docker节点。假设我将约束NGINX[这不是关于NGINX,只是一个例子]只部署在Docker节点1上。我可以创建约束以这样一种方式,如果码头工人节点1下降约束不再是可用的吗?
比如,只有当节点可达时才有那个约束,当它不可达时,自动删除约束?
是的,您可以使用place -ref将扩展策略放置到这里的node.hostname=your.node1.hostname
作为文档https://docs.docker.com/engine/reference/commandline/service_create/specify-service-placement-preferences——placement-pref。
如果一个类别中的节点(例如,那些node.labels.datacenter=south)无法处理它们的公平份额由于任务的限制或资源的限制,额外的任务将如果可能,将其分配给其他节点。
缺点是当您的节点1重新联机时,服务将不会更新和重新平衡,直到服务再次更新(手动更新或服务关闭)。
此外,如果你的服务必须放在一个特殊的节点上,这不是一个好的设计,但它应该被设计成能够在任何地方工作,这样你就可以在所有节点上平衡服务器负载。关于NGINX,它是无状态的,你可以把它部署到你所有的节点上,让docker路由混乱来做负载平衡。statefull如果你的服务,甚至是重新部署到另一个节点,您的数据将无法和你总服务流动受阻。所以我真正的回答是,你的问题是可能的,但不是期望Docker Swarm是如何设计的,可能也不好。
如果你有任何好的理由坚持你的问题解决方案。你可以在你的NGINX(或其他)前面考虑一个负载均衡器,比如另一个NGINX或HAProxy,它将允许你更多地控制将请求路由到主节点,并使用辅助或更多节点仅用于备份目的,等等。该设计将使您在全局模式下部署无状态负载均衡器,并且您的核心服务在LB后面运行。这种设计将使您在节点1关闭或服务更新或重新定位时不会停机。