我可以为docker swarm容器分配核心吗?

时间:2018-08-24 17:27:58

标签: docker docker-compose docker-swarm docker-swarm-mode

我正在部署带有耦合服务的堆栈文件(每个服务只有一个副本),并且我需要限制每个容器以使用不同的CPU核心子集。我在网上https://console.developers.google.com/apis/api/dialogflow.googleapis.com/overview?project=发现swarm的堆栈文件(撰写v3)不支持cpuset。我尝试了cpu limit,但这只会指定cpu资源的百分比而不是核心。这种情况下可以解决吗?我需要分配内核来支持软件许可限制。

3 个答案:

答案 0 :(得分:1)

是的,您可以限制CPU份额。例如:

with

答案 1 :(得分:1)

不幸的是,正如您已经发现的那样,目前还没有办法将任务限制为运行具有堆栈和/或服务的群集模式的给定核心或一组核心。

一个合理的选择是在过程中绕过Swarm手动启动希望运行它们的机器上的那些容器。因此,将您的机器用作“普通的”泊坞窗守护程序并使用--cpuset-cpus标志。

唯一的问题是,容器默认情况下可以访问所有cpus ,除非上述单个容器受上述标志限制。因此,您需要小心并从Swarm中排除这些节点,否则它将安排容器并使用您希望限制许可软件使用的内核。

另一种选择是运行确实支持--cpuset-cpus标志的旧Swarm。因此,您可以在由Swarm模式管理的Docker舰队上运行一个旧的Swarm。只需确保Swarm模式不会访问托管固定和受CPU限制的容器的计算机,例如,可以选择以下选项:

                        +-------------+
                        | Swarm Mode  |
       +----------------+   Primary   |
       |                |             |
       |                +------+------+
       |                       |
       |                       |
       |                       |                       +----------------+
       |                       |                       |  Containers    |
       |                       |                       |  with          |
       |                       |                       |  pinned cores  |
+------v------+         +------v------+         +------+------+---------+
|             |         |             |         |             |
|   Agent     |         |   Agent     |         |   Agent     |
|             |         |             |         |             |
+------+------+         +------^------+         +------^------+
       ^                       |                       |
       |                       |                       |
       |                       |                       |
       |                       |                       |
       |                       |                       |
       |                       |                       |
       |                +------+------+                |
       |                |   Swarm     |                |
       +----------------+  Primary    +----------------+
                        |             |
                        +-------------+

总而言之,到目前为止,仅使用Docker Swarm模式还没有合理的解决方法。将来仍有希望看到这片土地。

答案 2 :(得分:0)

另一个选择可能是在容器内使用任务集。您可以在堆栈文件中更改服务容器命令,以便将其包装在任务集中(您可能需要自定义映像)。 例如:taskset -c 2,3启动脚本