11 Docker Swarm
11.1 简介
Docker引擎的集群,称为swarm。swarm由一个或多个节点组成,节点主要有两种类型:管理节点和工作节点,主要分为以下概念
-
Swarm: 集群的管理和编排是使用嵌入docker引擎的SwarmKit,可以在docker 初始化时启动swarm模式或者加入已存在的swarm
-
Node:
一个节点是Docker引擎集群的一个实例,可以将其视为Docker节点,在单个物理服务器或云服务器上运行一个或多个节点,但生成环境部署通常包含分布在多个物理和云服上的Docker节点。
将应用程序部署到swarm,将服务定义提交给管理器节点,管理器节点将成为任务的工作单元分配到工作节点
-
Service:
一个服务是任务的定义,管理机或工作节点上执行。他是群体系统的中心结构,是用户与群体交互的主要根源。创建服务时,你需要制定要使用的容器镜像。
-
Task:
任务是在Docker 容器中执行的命令,manager节点根据制定数量的任务副本分给任务给worker 节点
Raft协议: 一致性算法,保证大多数节点存活,才可以使用,高可用(详情请参考“Raft协议”介绍)
11.2 节点概述
管理节点:
-
维持集群状态
-
调度服务
-
服务群模式HTTP API端点
使用Raft实现,管理人员可以维护整个swarm群集及其上运行的所有服务的一致内部状态。出于测试,可以由一个管理器运行一个集群。如果单个管理器群中的管理器发生故障,那么服务将继续运行,但是需要创建一个新的集群以进行恢复。
为了利用群体模式的容错功能,建议根据组织的高可用性要求实现奇数个节点。如果有多个管理器,则可以从管理器节点的故障中恢复,而无需停机。相关的建议如下:
-
一个由三名manager组成的群体最多可以容忍一名manager的丢失。
-
五个管理器群最多可以同时丢失两个管理节点。
-
一个N管理器群集最多可以容忍管理器的丢失 (N-1)/2。
-
建议最多为七个管理节点。
工作节点:
工作节点也是Docker引擎的实例,其唯一目的是执行容器。工作节点不参与Raft分布式状态,不做调度决策,也不服务于swarm模式的httpapi。
可以创建一个由一个管理节点组成的群,但是如果没有至少一个管理器节点,就不能有一个工作节点。默认情况下,所有manager也是工作节点。在单个管理器节点集群中,可以运行docker service create等命令,调度器将所有任务放在本地引擎上
要防止调度器将任务放置在多节点群中的管理器节点上,请将管理器节点的可用性设置为“Drain”。调度器在Drain模式下优雅地停止节点上的任务,并在活动节点上调度任务。调度程序不会将新任务分配给具有可用性的节点。
11.3 服务概述
服务通常是微服务的映像。服务示例可能包括HTTP服务器,数据库或您希望在分布式环境中运行的任何其他类型的可执行程序。
创建服务时,需要指定要使用的容器映像以及要在运行中的容器中执行的命令。也定义服务的选项,包括:
-
群在群体外提供服务的端口
-
用于服务连接到群中其他服务的覆盖网络
-
CPU和内存限制与保留
-
滚动更新策略
-
群中要运行的图像的副本数
11.3.1 服务,任务和容器
将服务部署到群集时,群集管理节点接受服务定义作为服务的所需状态。然后,将服务安排在群集中的节点上,作为一项或多项副本任务。任务在群集中的节点上彼此独立运行。
示例,假设您要在HTTP侦听器的三个实例之间实现负载平衡。下图显示了具有三个副本的HTTP侦听器服务。侦听器的三个实例中的每个实例都是集群中的任务。
容器是一个孤立的过程。在群体模式模型中,每个任务仅调用一个容器。任务类似于调度程序在其中放置容器的“插槽”。一旦容器处于活动状态,调度程序就会识别出该任务处于运行状态。如果容器未通过运行状况检查或终止,则任务终止。
11.3.2 任务和计划
任务是群内调度的基本单位。当您通过创建或更新服务来声明所需的服务状态时,协调器通过调度任务来实现所需的状态。例如,您定义了一个服务,该服务指示协调器始终保持HTTP侦听器的三个实例运行。协调器通过创建三个任务来做出响应。每个任务都是调度程序通过生成容器填充的插槽。容器是任务的实例。如果HTTP侦听器任务随后无法通过其运行状况检查或崩溃,那么协调器将创建一个新的副本任务,该任务将生成一个新的容器。
任务是一种单向机制。它通过一系列状态单调进行:已分配,已准备,正在运行等。如果任务失败,协调器将删除任务及其容器,然后根据服务指定的所需状态创建一个新任务来替换它。
Docker群模式的基本逻辑是通用调度程序和协调器。服务和任务抽象本身并不知道它们实现的容器。假设地,您可以实现其他类型的任务,例如虚拟机任务或非容器化过程任务。调度程序和协调程序与任务类型无关。但是,当前版本的Docker仅支持容器任务。
下图显示了群集模式如何接受服务创建请求以及如何将任务调度到工作者节点。
11.3.3 复制和全局服务
服务部署有两种类型,即复制的和全局的。
对于复制的服务,您可以指定要运行的相同任务的数量。例如,您决定部署一个具有三个副本的HTTP服务,每个副本提供相同的内容。
全局服务是在每个节点上运行一个任务的服务。没有预先指定的任务数。每次将节点添加到群集时,协调器都会创建一个任务,调度程序会将任务分配给新节点。全局服务的最佳选择是监视代理,防病毒扫描程序或要在群集中每个节点上运行的其他类型的容器。
下图以黄色显示了三个服务的副本,以灰色显示了全局服务。
11.4 搭建集群
服务器名称 | 服务器IP | 服务器角色 |
---|---|---|
master-01 | 192.168.5.3 | manager |
master-02 | 192.168.5.4 | manager |
node-01 | 192.168.5.5 | node |
node-02 | 192.168.5.6 | node |
创建集群主要分为两步:
-
生成主节点
-
加入节点
11.4.1 初始化管理节点
docker swarm init --advertise-addr 192.168.5.3
11.4.2 加入工作节点
# 生成管理节点令牌
docker swarm join-token manager
# 生成工作节点令牌
docker swarm join-token worker
11.4.3 查看集群节点信息
11.4.4 Swarm集群弹性创建服务
# 启动一个项目服务
docker service create -p 8888:80 --name my-nginx nginx
# 查看服务
docker service ls
docker service ps my-nginx
# 更新服务副本数
docker service update --replicas 3 my-nginx