Swarm 模式关键概念

本主题介绍 Docker Engine 1.12 中集群管理和编排功能特有的一些概念。

什么是 swarm?

Docker Engine 中内置的集群管理和编排功能是使用 swarmkit 构建的。Swarmkit 是一个独立项目,实现了 Docker 的编排层,并直接在 Docker 中使用。

一个 swarm 由多个运行在 Swarm 模式的 Docker 主机组成,这些主机充当管理节点(manager)和工作节点(worker)。管理节点负责成员管理和任务委派,工作节点负责运行 swarm 服务。一个 Docker 主机可以同时是管理节点和工作节点,也可以只承担其中一种角色。创建服务时,您需要定义其理想状态——副本数量、可用的网络和存储资源、服务对外暴露的端口等。Docker 会努力维持这一期望状态。例如,如果某个工作节点不可用,Docker 会将该节点上的任务调度到其他节点。任务(task)是 swarm 服务中的一个运行中的容器,由 swarm 管理节点管理,这与独立容器(standalone container)不同。

swarm 服务相比独立容器的一个关键优势是:您可以修改服务的配置(包括其连接的网络和卷),而无需手动重启服务。Docker 会自动更新配置,停止配置过时的服务任务,并创建符合新配置的新任务。

当 Docker 运行在 Swarm 模式时,您仍然可以在 swarm 中的任意 Docker 主机上运行独立容器和 swarm 服务。独立容器与 swarm 服务的一个关键区别是:只有 swarm 管理节点可以管理 swarm,而独立容器可以在任意 Docker 守护进程上启动。Docker 守护进程可以作为管理节点、工作节点,或同时承担两种角色参与 swarm。

与使用 Docker Compose 定义和运行容器类似,您也可以定义和运行 Swarm 服务栈。

继续阅读以了解与 Docker swarm 服务相关的概念,包括节点、服务、任务和负载均衡。

节点

节点(node)是参与 swarm 的 Docker engine 实例,也可以称为 Docker 节点。您可以在单个物理计算机或云服务器上运行一个或多个节点,但生产环境中的 swarm 部署通常会将 Docker 节点分布在多个物理和云机器上。

要将应用程序部署到 swarm,您需要向管理节点提交服务定义。管理节点会将称为 任务 的工作单元分发给工作节点。

管理节点还执行编排和集群管理功能,以维持 swarm 的期望状态。管理节点会选举出一个领导者来执行编排任务。

工作节点接收并执行管理节点分派的任务。默认情况下,管理节点也会作为工作节点运行服务,但您可以配置它们仅运行管理任务,成为纯管理节点。每个工作节点上都运行一个代理(agent),用于报告分配给它的任务。工作节点会向管理节点通知其分配任务的当前状态,以便管理节点维持每个工作节点的期望状态。

服务与任务

服务(service)是在管理节点或工作节点上执行的任务的定义。它是 swarm 系统的核心结构,也是用户与 swarm 交互的主要入口。

创建服务时,您需要指定要使用的容器镜像以及在运行中的容器内执行的命令。

复制服务模型(replicated services)中,swarm 管理节点会根据期望状态中设置的规模,将特定数量的副本任务分配给各个节点。

对于全局服务(global services),swarm 会在集群中每个可用节点上为服务运行一个任务。

任务(task)包含一个 Docker 容器和要在容器内运行的命令。它是 swarm 的原子调度单元。管理节点根据服务规模中设置的副本数量,将任务分配给工作节点。一旦任务被分配给某个节点,它就不能迁移到其他节点,只能在分配的节点上运行或失败。

负载均衡

swarm 管理节点使用入口负载均衡(ingress load balancing)来暴露您希望 swarm 外部访问的服务。swarm 管理节点可以自动为服务分配一个发布端口,您也可以手动配置服务的发布端口。您可以指定任意未使用的端口。如果不指定端口,swarm 管理节点会为服务分配一个 30000-32767 范围内的端口。

外部组件(如云负载均衡器)可以通过集群中任意节点的发布端口访问服务,无论该节点当前是否运行该服务的任务。swarm 中的所有节点都会将入口连接路由到运行中的任务实例。

Swarm 模式有一个内部 DNS 组件,会自动为 swarm 中的每个服务分配一个 DNS 条目。swarm 管理节点使用内部负载均衡,根据服务的 DNS 名称在集群内的服务之间分发请求。

下一步