我应该将 swarm 服务限制在工作节点上吗?
Should I constrain swarm services to worker nodes?
假设我有一个 docker 群,其中有独立的工人和管理者。我是否必须指定放置约束以确保给定服务仅 运行s 在工作节点上?
像这样 docker-撰写文件:
version "3.1"
services:
foo:
image: hello-world
deploy:
placement:
- node.role==worker
或者 Swarm 是否会自动将服务限制为工作节点上的 运行?
如果你来自 Kubernetes,有一个为每个管理器污染节点的概念,然后 运行 管理器上的工作负载,你需要将该 pod 配置为 运行 在具有该污点的节点上。这在 Swarm 模式中并不完全存在。但是您有几个选项可以自己实现。
最常用的方法正如您所描述的那样,对您只想 运行 工作人员与经理的每项服务在 node.role==worker
上设置放置限制。这需要对您计划在集群上调度的每个服务做一些工作,但它也是更灵活的选项之一,因为您可以指定一些工作负载确实需要 运行 在管理器上(例如,任何实用程序服务需要管理集群或有权访问集群的管理器详细信息,例如自行配置反向代理)。
下一个方法是更改管理员的可用性:
$ docker node update --help
Usage: docker node update [OPTIONS] NODE
Options:
--availability string Availability of the node ("active"|"pause"|"drain")
...
默认情况下,所有节点都处于活动状态。但是,您可以通过更改其可用性来暂停在节点上安排新的工作负载,或将现有工作负载从节点上耗尽。这不会影响在 swarm 模式之外部署的容器(使用 docker container run
或 docker-compose
而不是 Swarm 模式的 docker stack
或 docker service
命令)。但是,它不够灵活,并且不允许您 运行 轻松地将一些 swarm 容器放在 managers 和其他 worker 上。更改可用性设置的最常见用途是让节点停止服务以进行维护,而不是控制管理器的调度。我唯一一次使用它是当第三个管理器被添加到一个双节点集群以实现 HA 时,它永远不应该在其上安排任何工作负载。
实现此功能的第三种方法是 Docker 的 EE 产品的一部分。当您使用 Docker UCP 安排作业时,它充当用户 运行ning 命令和 docker 节点之间的安全层。 UCP 的一个特性是控制用户可以在哪些节点上安排他们的工作负载,并且有一个顶级开关可以启用或禁用用户甚至管理员对管理器的调度作业。即使您没有使用 Docker EE,也可以编写您自己的 docker API 用户可以访问的代理,这会给正在使用的服务增加额外的调度约束部署。但考虑到第一种选择的简便性,我还没有看到有人这样做。
假设我有一个 docker 群,其中有独立的工人和管理者。我是否必须指定放置约束以确保给定服务仅 运行s 在工作节点上?
像这样 docker-撰写文件:
version "3.1"
services:
foo:
image: hello-world
deploy:
placement:
- node.role==worker
或者 Swarm 是否会自动将服务限制为工作节点上的 运行?
如果你来自 Kubernetes,有一个为每个管理器污染节点的概念,然后 运行 管理器上的工作负载,你需要将该 pod 配置为 运行 在具有该污点的节点上。这在 Swarm 模式中并不完全存在。但是您有几个选项可以自己实现。
最常用的方法正如您所描述的那样,对您只想 运行 工作人员与经理的每项服务在 node.role==worker
上设置放置限制。这需要对您计划在集群上调度的每个服务做一些工作,但它也是更灵活的选项之一,因为您可以指定一些工作负载确实需要 运行 在管理器上(例如,任何实用程序服务需要管理集群或有权访问集群的管理器详细信息,例如自行配置反向代理)。
下一个方法是更改管理员的可用性:
$ docker node update --help
Usage: docker node update [OPTIONS] NODE
Options:
--availability string Availability of the node ("active"|"pause"|"drain")
...
默认情况下,所有节点都处于活动状态。但是,您可以通过更改其可用性来暂停在节点上安排新的工作负载,或将现有工作负载从节点上耗尽。这不会影响在 swarm 模式之外部署的容器(使用 docker container run
或 docker-compose
而不是 Swarm 模式的 docker stack
或 docker service
命令)。但是,它不够灵活,并且不允许您 运行 轻松地将一些 swarm 容器放在 managers 和其他 worker 上。更改可用性设置的最常见用途是让节点停止服务以进行维护,而不是控制管理器的调度。我唯一一次使用它是当第三个管理器被添加到一个双节点集群以实现 HA 时,它永远不应该在其上安排任何工作负载。
实现此功能的第三种方法是 Docker 的 EE 产品的一部分。当您使用 Docker UCP 安排作业时,它充当用户 运行ning 命令和 docker 节点之间的安全层。 UCP 的一个特性是控制用户可以在哪些节点上安排他们的工作负载,并且有一个顶级开关可以启用或禁用用户甚至管理员对管理器的调度作业。即使您没有使用 Docker EE,也可以编写您自己的 docker API 用户可以访问的代理,这会给正在使用的服务增加额外的调度约束部署。但考虑到第一种选择的简便性,我还没有看到有人这样做。