Swarm 模式核心概念

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

什么是集群?

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

一个 Swarm(集群)由多个运行在 Swarm 模式下的 Docker 主机组成,这些主机充当管理器(用于管理成员身份和任务委派)和工作节点(用于运行 Swarm 服务)。给定的 Docker 主机可以是管理器、工作节点,或同时承担这两种角色。当您创建服务时,需要定义其理想状态——包括副本数量、可用的网络和存储资源、服务对外暴露的端口等。Docker 会努力维持这种期望状态。例如,如果某个工作节点不可用,Docker 会将该节点上的任务调度到其他节点上。任务是指作为 Swarm 服务一部分运行的容器,它由 Swarm 管理器进行管理,这与独立容器不同。

Swarm 服务相对于独立容器的一个关键优势在于,您可以修改服务的配置(包括其连接的网络和卷),而无需手动重启服务。Docker 将更新配置,停止使用过时配置的服务任务,并创建符合所需配置的新任务。

当 Docker 以 Swarm 模式运行时,您仍然可以在参与 Swarm 的任何 Docker 主机上运行独立容器以及 Swarm 服务。独立容器与 Swarm 服务之间的一个关键区别是:只有 Swarm 管理器才能管理 Swarm,而独立容器可以在任何守护进程上启动。Docker 守护进程可以作为管理器、工作节点或两者兼有地参与 Swarm。

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

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

节点

节点是参与 Swarm 集群的 Docker 引擎实例。您也可以将其视为 Docker 节点。您可以在单台物理计算机或云服务器上运行一个或多个节点,但生产环境的 Swarm 部署通常包括分布在多台物理机和云机器上的 Docker 节点。

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

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

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

服务和任务

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

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

在复制服务模型中,Swarm Manager 会根据您在期望状态中设置的规模,在各个节点间分配特定数量的副本任务。

对于全局服务,Swarm 会在集群中的每个可用节点上运行一个该服务的任务。

任务承载一个 Docker 容器以及在容器内运行的命令。它是 Swarm 的原子调度单元。管理节点根据服务规模中设置的副本数量将任务分配给工作节点。 一旦任务被分配到某个节点,它就不能迁移到另一个节点。它只能在分配的节点上运行或失败。

负载均衡

Swarm 管理器使用入口负载均衡来暴露您希望对外提供的服务。Swarm 管理器可以自动为服务分配一个发布端口,或者您可以手动配置服务的发布端口。您可以指定任何未使用的端口。如果您未指定端口,Swarm 管理器将为服务分配 30000-32767 范围内的一个端口。

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

Swarm 模式拥有一个内部 DNS 组件,可自动为集群中的每个服务分配一个 DNS 条目。Swarm 管理器利用内部负载均衡,根据服务的 DNS 名称在集群内的各服务间分发请求。

接下来是什么?