假设有一个 3 节点 Docker 集群。其中一个节点的资源非常紧张。几个对 CPU 或 RAM 要求很高的服务恰好在同一台主机上启动。
Docker 是否会在任何时候检查其他节点是否有较少的工作要做,并将一个或多个服务从压力较大的节点迁移到压力较小的节点之一?
Docker 中是否有任何内置功能可以处理这个问题,或者迁移最终是否会导致 OOM 杀手取出容器?
答案1
Swarm 不会移动任务(容器)。它的目标是“不造成任何损害”,通过移动您未明确指示它移动的容器。如果您这样做,service update
它将重新创建容器,可能在其他节点上,基于以下条件:1. 确保该服务中的任务分散在各个节点上;2. 每个节点的容器密度。
但据我所知,该评估并非基于逐时资源利用率。
你能在命令中使用--limit-cpu/memory
和--reserve-cpu/memory
选项service create/update
会有所帮助。reserve
将导致 Swarm 跟踪该预留,如果您为多个服务设置预留,它将确保它们被安排在具有这些可用资源的节点上,但同样,它只是使用预留表,而不是实时利用率来确定这一点(AFAIK)。
我见过人们使用 Prometheus 来监控和启动扩展服务的警报,因此这些警报也可以启动容器的移动。