docker swarm 中的服务分布

How services are distributed in docker swarm

我能以某种方式配置主节点如何在 docker 群中分发服务吗?我想,它应该看到工作节点的空闲资源并将其分发到 "freest" 节点。

目前我有问题,该服务被分配到一个节点,该节点已满(90% RAM)并且开始有延迟,但同时第二个节点的服务很少并且它可以处理另一个。

docker node ls 
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
wdkklpy6065zxckxyuj000ei4 *   docker-master       Ready               Drain               Leader              18.09.6
sk45rol2whdr5eh2jqozy0035     docker-node01       Ready               Active              Reachable           18.09.6
o4zwwbwwcrbwo4tsd00pxkfuc     docker-node02       Ready               Active                                  18.09.6

现在我有 36 个(非常相似的)服务,docker-node01 上有 28 个 运行,docker-node02 上有 8 个。我想,理想状态是两个节点上都有 16 个服务。 两个 docker 节点相同。

  1. swarm 如何docker 知道运行 服务在哪里?它使用什么算法?
  2. 可以change/update选择节点的算法吗?

根据 swarmkit 项目 README 唯一可用的策略是 spread 因此它在最小负载模式下安排任务。

请注意,swarm 不会移动节点来维持此策略,因此如果您在 node01 已满后添加 node02,则 node02 将大部分保持为空。您可以耗尽两个节点然后激活它们以查看它是否更好地分配负载。

您可以在项目文档中找到关于调度算法的更详细描述:scheduling-algorithm

对于较旧的 swarm 管理器,此属性是可配置的: https://docs.docker.com/swarm/reference/manage/#--strategy--scheduler-placement-strategy

我还发现了https://docs.docker.com/swarm/scheduler/strategy/,它解释了很多关于Docker集群策略的内容。