Swarm 服务提供了几种不同的方式来控制服务在不同节点上的规模和位置。
1.您可以指定服务是需要运行特定数量的副本还是应该在每个工作节点上全局运行。请参阅 复制或全局服务。
2.您可以配置服务的 CPU 或内存要求,并且该服务仅在满足这些要求的节点上运行。
3.放置约束使您可以将服务配置为仅在具有特定(任意)元数据集的节点上运行,如果不存在适当的节点,则会导致部署失败。例如,您可以指定您的服务应仅在任意标签pci_compliant设置为 的节点上运行 true。
4.放置首选项允许您将具有一定范围值的任意标签应用于每个节点,并使用算法将服务的任务分布在这些节点之间。目前,唯一支持的算法是spread,它试图将它们均匀放置。例如,如果您使用一个rack值为 1-10的标签来标记每个节点,然后指定一个键为 的放置首选项rack,则rack在采用其他放置约束后,服务任务将尽可能均匀地放置在所有带有标签的节点上,放置首选项,以及其他特定于节点的限制。
与约束不同,放置首选项是尽力而为的,如果没有节点可以满足首选项,则服务不会部署失败。如果您为服务指定放置首选项,则当群管理器决定哪些节点应该运行服务任务时,与该首选项匹配的节点排名更高。其他因素,例如服务的高可用性,也会影响调度运行服务任务的节点。例如,如果您有 N 个带有机架标签的节点(然后是其他一些节点),并且您的服务被配置为运行 N+1 个副本,那么 +1 将被安排在一个还没有该服务的节点上,如果有一个,不管那个节点是否有rack标签。
复制或全局服务
Swarm 模式有两种类型的服务:复制和全局。对于复制服务,您可以指定集群管理器在可用节点上调度的副本任务数量。对于全局服务,调度器在每个可用节点上放置一项任务,以满足服务的 放置约束和 资源需求。
您可以使用该--mode标志来控制服务类型。如果您不指定模式,则服务默认为replicated。对于复制服务,您可以使用该--replicas标志指定要启动的副本任务数。例如,要启动具有 3 个副本任务的复制 nginx 服务:
$ docker service create
--name my_web
--replicas 3
nginx
要在每个可用节点上启动全局服务,请传递--mode global到 docker service create. 每次有新节点可用时,调度程序都会在新节点上为全局服务放置一个任务。例如,启动一个在 swarm 中的每个节点上运行 alpine 的服务:
$ docker service create
--name myservice
--mode global
alpine top
服务约束允许您在调度程序将服务部署到节点之前为节点设置要满足的条件。您可以根据节点属性和元数据或引擎元数据对服务应用约束。有关约束的更多信息,请参阅docker service create CLI 参考。
为服务预留内存或 CPU
要为服务保留给定的内存量或 CPU 数量,请使用 --reserve-memory或--reserve-cpu标志。如果没有可用的节点可以满足要求(例如,如果您请求 4 个 CPU,而 swarm 中没有一个节点有 4 个 CPU),则服务将保持挂起状态,直到有合适的节点可用于运行其任务。
内存不足异常 (OOME)
如果您的服务尝试使用比 swarm 节点可用的内存更多的内存,您可能会遇到内存不足异常 (OOME),并且容器或 Docker 守护进程可能会被内核 OOM 终止进程。为防止发生这种情况,请确保您的应用程序在具有足够内存的主机上运行,并参阅了解内存不足的风险。
Swarm 服务允许您使用资源约束、放置首选项和标签来确保您的服务部署到适当的 swarm 节点。