互联网技术 / 互联网资讯 · 2024年3月9日

Swarm 模式下的任务调度与运行原理

任务是集群中被调度的最小原子单元。当你通过创建或更新服务来声明所需的服务状态时,编排器通过调度任务来实现目标状态。例如,若你定义一个服务,指示协调器始终让 HTTP 监听器的三个实例在运行。协调器因此创建三个任务来响应。每个任务对应一个槽位,调度器通过启动一个容器来填充它。容器即是任务的实例化。如果某个 HTTP 监听器任务随后未通过健康检查或发生崩溃,协调器会再创建一个副本任务来生成新的容器。

任务是一种单向推进的机制。它通过一组状态的单调前进来实现:分配、准备、运行等。如果任务失败,协调器会删除该任务及其容器,并按服务所需状态创建一个新任务来替代它。

Swarm 模式的底层逻辑是通用的调度与编排组件。服务和任务的抽象本身并不绑定到具体的容器类型。理论上,你也可以实现其他类型的任务,例如虚拟机任务或非容器化进程任务。调度器和协调器对任务的具体类型并不敏感。不过,当前版本通常仅支持容器任务。

下图展示 Swarm 模式如何接收服务创建请求并将任务调度到工作节点。

云计算核心技术Docker教程:Docker Swarm 任务和日程安排运行原理

待定服务

服务可以被配置为在当前群集中的任意节点都不能运行其任务。在这种情况下,服务保持在状态 pending。以下是一些情形,服务可能处于 pending 状态的示例。

注意:如果你的目标仅是阻止部署,请将服务规模扩展到 0,而不是尝试让其保留在 pending。

如果所有节点都暂停或资源耗尽,且你创建了一个服务,则该服务将处于挂起状态,直到出现可用节点。实际上,第一個可用的节点会获得所有任务,因此在生产环境中这通常不是理想情形。

你可以为服务保留固定数量的内存。如果 Swarm 中没有节点具备所需的内存,该服务将保持挂起状态,直到有一个可以运行其任务的节点可用。如果你指定一个非常大的值,例如 500 GB,除非确实有一个节点能够满足它,否则任务将永远处于挂起状态。

你可以对服务施加放置约束,并且在某些时刻可能无法满足这些约束。

此行为表明你的任务需求和配置与集群的当前状态并非紧密相关。作为 Swarm 的管理员,你声明了所需的状态,调度器会与集群中的节点共同创建该状态。你无需对 Swarm 上的任务进行微观管理。