Docker Swarm只在工作节点上运行任务

12

假设我们正在群集模式下工作,有三个节点:

  • manager1
  • worker1
  • worker2

是否可以创建一个服务并指定任务仅在工作节点(worker1和worker2)而非管理节点(manager1)中运行?

我正在运行以下命令创建服务:

docker-machine ssh manager1 "docker service create --network dognet --name dog-db redis"

当我测试该服务时:

docker-machine ssh manager1 "docker service ps dog-db"

我理解为:

ID                         NAME      IMAGE  NODE      DESIRED STATE  CURRENT STATE            ERROR
3kvfpbhl6fj0qwtglc5k7sbkw  dog-db.1  redis  manager1  Running        Preparing 4 seconds ago  
3个回答

21

虽然您可以使用约束条件(使用--constraint node.role=worker)根据节点的角色(管理者或工作者)来消除节点的子集,但我会进一步禁用管理器的工作者功能,具体方法如下:

# Disables the Manager as a Worker node

docker node update --availability drain manager1

这个想法是要保护管理器免受资源超载(CPU、RAM、fds)的影响,如果部署服务使用的资源高于管理器上可用的资源,则可能会发生故障级联情况,从而导致群集变得高度不稳定(或不再响应任何请求)。

管理器在其核心中维护关键组件(例如证书颁发和轮换、分布式数据存储、网络),如果管理器的资源耗尽,将使整个集群变得不稳定。

相关问题:

来源: 我曾是Docker Swarm的维护者,为Swarm模式编写了管理指南


这很好地保持了我的服务部署到仅工作节点,无需任何约束! - Cotton
它将跳过将任何任务分配给Swarm管理器。但是,我想使用Portainer来管理我的Swarm,Portainer可以用来管理Swarm管理器。它也不允许部署Portainer。 - Nitul
如果使用 --constraint,请注意它应该是 node.role==worker 而不仅仅是 node.role=worker - TJ Biddle

7

是的,您可以基于节点角色约束服务。将您的命令更改为:

docker service create --network dognet --constraint node.role==worker --name dog-db redis


注:该命令可根据指定的网络和节点角色创建名为“dog-db”的Redis服务。

虽然我的方法可以正常工作,但现在我更喜欢Abronan的答案。 - johnharris85

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接