服务如何运作

预计阅读时间:5分钟

要在Docker Engine处于群集模式时部署应用程序映像,请创建服务。在某些较大的应用程序上下文中,服务通常是微服务的映像。服务示例可能包括HTTP服务器,数据库或您希望在分布式环境中运行的任何其他类型的可执行程序。

创建服务时,您可以指定要使用的容器映像以及要在运行中的容器中执行的命令。您还定义服务的选项,包括:

  • 群在群体外提供服务的端口
  • 用于服务连接到群中其他服务的覆盖网络
  • CPU和内存限制与保留
  • 滚动更新策略
  • 群中要运行的图像的副本数

服务,任务和容器

当您将服务部署到群集时,群集管理器接受您的服务定义作为服务的所需状态。然后,它将服务安排在群集中的节点上,作为一项或多项副本任务。任务在群集中的节点上彼此独立运行。

例如,假设您要在HTTP侦听器的三个实例之间实现负载平衡。下图显示了具有三个副本的HTTP侦听器服务。侦听器的三个实例中的每个实例都是集群中的任务。

服务图

容器是一个孤立的过程。在群体模式模型中,每个任务仅调用一个容器。任务类似于调度程序在其中放置容器的“插槽”。一旦容器处于活动状态,调度程序就会识别出该任务处于运行状态。如果容器未通过运行状况检查或终止,则任务终止。

任务和计划

任务是群内调度的基本单位。当您通过创建或更新服务来声明所需的服务状态时,协调器通过调度任务来实现所需的状态。例如,您定义了一个服务,该服务指示协调器始终保持HTTP侦听器的三个实例运行。协调器通过创建三个任务来做出响应。每个任务都是调度程序通过生成容器填充的插槽。容器是任务的实例。如果HTTP侦听器任务随后无法通过其运行状况检查或崩溃,那么协调器将创建一个新的副本任务,该任务将生成一个新的容器。

任务是一种单向机制。它通过一系列状态单调进行:已分配,已准备,正在运行等。如果任务失败,协调器将删除任务及其容器,然后根据服务指定的所需状态创建一个新任务来替换它。

Docker群模式的基本逻辑是通用调度程序和协调器。服务和任务抽象本身并不知道它们实现的容器。假设地,您可以实现其他类型的任务,例如虚拟机任务或非容器化过程任务。调度程序和协调程序与任务类型无关。但是,当前版本的Docker仅支持容器任务。

下图显示了群集模式如何接受服务创建请求以及如何将任务调度到工作者节点。

服务流程

待定服务

可以以一种方式配置服务,以使群集中当前没有节点可以运行其任务。在这种情况下,服务保持状态pending。以下是一些有关何时可以保持服务状态的示例pending

注意:如果您唯一的目的是阻止服务部署,请将该服务缩放为0,而不要尝试以使其保留在的方式对其进行配置pending

  • 如果所有节点都已暂停或耗尽,并且您创建了服务,则该服务将处于待处理状态,直到某个节点变为可用。实际上,第一个可用的节点将获得所有任务,因此在生产环境中这样做不是一件好事。

  • 您可以为服务保留特定的内存量。如果群集中没有节点具有所需的内存量,则该服务将保持待处理状态,直到有一个可以运行其任务的节点可用为止。如果您指定一个非常大的值(例如500 GB),除非您确实有一个可以满足要求的节点,否则该任务将永远处于待处理状态。

  • 您可以在服务上施加放置约束,并且在给定时间可能无法兑现约束。

此行为说明,任务的要求和配置与群集的当前状态没有紧密联系。作为群集的管理员,您可以声明群集的所需状态,而管理器则与群集中的节点一起创建该状态。您无需对群组中的任务进行微管理。

复制和全局服务

服务部署有两种类型,即复制的和全局的。

对于复制的服务,您可以指定要运行的相同任务的数量。例如,您决定部署一个具有三个副本的HTTP服务,每个副本提供相同的内容。

全局服务是在每个节点上运行一个任务的服务。没有预先指定的任务数。每次将节点添加到群集时,协调器都会创建一个任务,调度程序会将任务分配给新节点。全局服务的最佳选择是监视代理,防病毒扫描程序或要在群集中每个节点上运行的其他类型的容器。

下图以黄色显示了三个服务的副本,以灰色显示了全局服务。

全局服务与复制服务

学到更多

  • 阅读有关群模式节点如何工作的信息。
  • 了解PKI如何在群体模式下工作。
码头工人集装箱集群群模式节点