任务是集群内调度的原子单元。当您通过创建或更新服务声明所需的服务状态时,编排器通过调度任务来实现所需的状态。例如,您定义了一个服务,该服务指示协调器始终保持 HTTP 侦听器的三个实例运行。协调器通过创建三个任务来响应。每个任务都是一个槽,调度程序通过生成一个容器来填充它。容器是任务的实例化。如果 HTTP 侦听器任务随后未能通过其健康检查或崩溃,那么协调器会创建一个新的副本任务来生成新的容器。
任务是一种单向机制。它通过一系列状态单调前进:分配、准备、运行等。如果任务失败,协调器将删除任务及其容器,然后根据服务指定的所需状态创建一个新任务来替换它。
Docker swarm 模式的底层逻辑是一个通用的调度器和编排器。服务和任务抽象本身不知道它们实现的容器。假设您可以实现其他类型的任务,例如虚拟机任务或非容器化进程任务。调度器和协调器不知道任务的类型。但是,当前版本的 Docker 仅支持容器任务。
下图显示了 swarm 模式如何接受服务创建请求并将任务调度到工作节点。
待定服务
服务可以以这样的方式配置,即当前群中的任何节点都不能运行其任务。在这种情况下,服务保持在状态pending。以下是一些服务何时可能保持在 state 中的示例pending。
注意:如果您的唯一目的是阻止部署服务,请将服务扩展到 0,而不是尝试以保留在pending.
如果所有节点都已暂停或耗尽,并且您创建了一个服务,则该服务将处于挂起状态,直到节点变为可用为止。实际上,第一个可用的节点会获得所有任务,因此在生产环境中这不是一件好事。
您可以为服务保留特定数量的内存。如果 swarm 中没有节点具有所需的内存量,则服务将保持挂起状态,直到有一个可以运行其任务的节点可用。如果您指定一个非常大的值,例如 500 GB,则任务将永远处于挂起状态,除非您确实有一个可以满足它的节点。
您可以对服务施加放置约束,并且可能无法在给定时间遵守这些约束。
此行为说明您的任务的要求和配置与群的当前状态没有紧密联系。作为 swarm 的管理员,您声明了您的 swarm 所需的状态,并且管理器与 swarm 中的节点一起创建该状态。您不需要对 swarm 上的任务进行微观管理。