我应该将群服务限制到工作者节点吗?

时间:2018-09-07 18:24:14

标签: docker docker-swarm

说我有一个由单独的工人和经理组成的码头工人群。我是否必须指定放置约束以确保给定服务仅在工作程序节点上运行?

就像这个docker-compose文件一样:

version "3.1"

services: 
  foo:
    image: hello-world
    deploy:
      placement:
         - node.role==worker

Swarm会自动限制服务在工作者节点上运行吗?

1 个答案:

答案 0 :(得分:3)

如果您来自Kubernetes,那么有一个污染节点的概念,该节点需要为每个管理器完成,然后在管理器上运行工作负载,您需要配置该pod使其在具有该污染的节点上运行。在Swarm模式下并不完全存在。但是,您有两种选择可以自己实现。

最常见的方法就是您所描述的,对您只想在工作者vs经理上运行的每个服务,在node.role==worker上设置放置约束。这需要您计划在群集上计划的每个服务上进行一些工作,但这也是更灵活的选择之一,因为您可以指定确实需要在管理器上运行的某些工作负载(例如,需要管理管理器的任何实用程序服务)。集群或可以访问集群的管理器详细信息,例如自配置反向代理。

下一个方法是更改​​管理器的可用性:

$ docker node update --help
Usage:  docker node update [OPTIONS] NODE
Options:
      --availability string   Availability of the node ("active"|"pause"|"drain")
...

默认情况下,所有节点均处于活动状态。但是,您可以通过更改节点的可用性来暂停在节点上计划新的工作负载,或将现有工作负载从节点上排出。这不会影响在群集模式之外(使用docker container rundocker-compose而不是群集模式的docker stackdocker service命令部署的容器)。但是,它是不灵活的,并且不允许您在管理人员上运行一些集群容器,而在工作人员上运行其他容器。更改可用性设置的最常见用途是使节点停止服务以进行维护,而不是控制管理器上的调度。我唯一使用过的方法是,将第三个管理器添加到HA的两节点群集中,在该群集上永远不应安排任何工作负载。

实现此目标的第三种方法是Docker EE产品的一部分。使用Docker UCP调度作业时,它充当用户运行命令和Docker节点之间的安全层。 UCP的功能之一是控制用户可以在其上计划其工作负载的节点,并且有一个顶级开关可以启用或禁用用户甚至管理员在管理器上的调度作业。即使您不使用Docker EE,也可以编写用户可以访问的自己的Docker API代理,这会给正在部署的服务增加其他调度约束。但是考虑到第一种选择的简便性,我还没有看到有人这样做。