docker - Docker 约束,直到节点关闭
问题描述
我在一个集群 [swarm] 中有 5 个 Docker 节点。假设我将约束 NGINX [它与 nginx 无关,它只是一个示例] 仅部署在 Docker 节点 1 上。我能否以这样的方式创建该约束,即如果 Docker 节点 1 出现问题,则约束不会不再可用?
就像,只有在节点可达时才具有该约束,当它不是时,自动删除约束?
解决方案
是的,您可以使用placement-ref 在此处https://docs.docker.com/engine/reference/commandline/service_create/#specify-service-placement-preferences---placement-中将传播策略放置到您的node.hostname=your.node1.hostname
as 文档中
首选项
如果某一类别中的节点(例如,具有 node.labels.datacenter=south 的节点)由于约束或资源限制而无法处理其公平份额的任务,则如果可能,额外的任务将被分配给其他节点。
不利的一面是,当您的节点 1 重新联机时,服务将不会更新和重新平衡,直到服务再次更新(手动或服务关闭)。
此外,如果您的服务必须放在一个特殊的节点上,这不是一个好的设计,但它应该被设计为能够在任何地方工作,这样您就可以平衡所有节点的服务器负载。关于 NGINX,它是无状态的,您可以将其部署到所有节点,并让 docker 路由混乱来进行负载平衡。如果您的服务是有状态的,即使它重新部署到第二个节点,您的数据也将不可用,并且您的整个服务也会中断。所以我真正的答案是你的问题是可能的,但不是对 Docker Swarm 设计方式的期望,也可能不是很好。
如果您有充分的理由坚持您的问题解决方案。您可以考虑在您的 NGINX(或其他)前面安装一个负载均衡器,例如另一个 NGINX 或 HAProxy,这将允许您更多地控制将您的请求路由到主节点并使用辅助节点或更多节点仅用于备份目的,依此类推。设计将是您在全局模式下部署无状态负载均衡器,并且您的核心服务在 LB 后面运行。当您的节点 1 关闭或服务正在更新或重新定位时,这种设计不会给您带来停机时间。
推荐阅读
- algorithm - 给定数字 n,如何打印大小为 m 的所有子序列?
- docker - 码头网络?它是持久的吗?
- visual-studio - 在 3 个不同的 IIS 上发布 Web 服务得到不同的结果,此服务的元数据发布当前被禁用
- ios - 使用 SwiftUI 自动计算填充以填充整个视图的框架
- python - Python 无法通过将文件夹名称设置为输入来创建子文件夹
- python - 我只能打印 e[i] 而没有别的。即使我注释掉该行,它仍然会被打印出来,但没有其他打印调用起作用
- javascript - Typescript tapAsync 函数无法设置正确的类型
- c# - 在特定情况下,LinkLabel 宽度不够
- email - 与 office365 的 SMTP 连接延迟
- javascript - 错误类型 -parseerror 和状态码 - 200 发生错误