Docker Swarm 笔记
作为容器集群管理器,Swarm 最大的优势之一就是原生支持 Docker API。各种基于标准 API 的工具比如 Compose、Docker SDK、各种管理软件,甚至 Docker 本身等都可以很容易的与 Swarm 进行集成,这大大方便了用户将原先基于单节点的系统移植到 Swarm 上。同时 Swarm 内置了对 Docker 网络插件的支持,这样就可以很容易地部署跨主机的容器集群服务。
Swarm 采用了典型的主从结构,通过 Raft 协议来在多个管理节点中实现共识。工作节点 上运行 agent 接受管理节点的统一管理和任务分配。用户提交服务请求只需要发给管理节点即可,管理节点会按照调度策略在集群中分配节点来运行服务相关的任务。
1 基本概念
1.1 Swarm集群
Swarm集群为一组被统一管理起来的 Docker 主机。集群是 Swarm 所管理的对象。这些主机通过 Docker 引擎的 Swarm 模式相互沟通,其中部分主机可能作为管理节点响应外部的管理请求,其他主机作为工作节点 来实际运行 Docker 容器。同一个主机也可以既作为管理节点,同时作为工作节点。
当使用 Swarm 集群时,首先定义一个服务(指定状态、复制个数、网络、存储、暴露端口等),然后通过管理节点发出启动服务的指令,管理节点随后会按照指定的服务规则进行调度,在集群中启动起来整个服务,并确保它正常运行。
1.2 节点
节点是 Swarm 集群的最小资源单位。每个节点实际上都是一台 Docker 主机。Swarm 集群中节点分为两种:
- 管理节点:负责响应外部对集群的操作请求,并维持集群中资源,分发任务给工作节点。同时,多个管理节点之间通过Raft协议构成共识。一般推荐每个集群设置5个或7个管理节点。
- 工作节点:负责执行管理节点安排的具体任务。默认情况下,管理节点自身也同时是工作节点。每个工作节点上运行代理(agent)来汇报任务完成情况。
可以通过docker node promote
命令来提升一个工作节点为管理节点;或者通过docker node demote
命令来将一个管理节点降级为工作节点。
1.3 服务
一个服务可以由若干个任务组成,每个任务为某个具体的应用。服务还包括对应的存储、网络、端口映射、副本个数、访问配置、升级配置等附加参数。
一般来说,服务需要面向特定的场景,例如一个典型的 Web 服务可能包括前端应用、后端应用,以及数据库等。这些应用都属于该服务的管理范畴。
Swarm 集群中服务类型也分为两种(可以通过-mode
指定):
-
复制服务模式:默认模式,每个任务在集群中会存在若干副本,这些副本会被管理节点按照调度策略分发到集群中的工作节点上。此模式下可以使用
-replicas
参数设置副本数量。 -
全局服务模式:调度器将在每个可用节点都执行一个相同的任务。该模式适合运行节点的检查,如监控应用等
1.4 任务
任务是 Swarm 集群中最小的调度单位,即一个指定的应用容器。例如仅仅运行前端业务的前端容器。任务从生命周期上将可能处于创建、等待 、分配、接受、准备、开始、运行、完成、失败 、关闭、拒绝、孤立等不同状态。
Swarm 集群中的管理节点会按照调度要求将任务分配到工作节点上。例如指定副本为 2 时,可能会被分配到两个不同的工作节点上。一旦当某个任务被分配到一个工作节点,将无法被转移到另外的工作节点,即 Swarm 中的任务不支持迁移。
1.5 外部访问
Swarm 集群中的服务要被集群外部访问,必须要能允许任务的响应端口映射出来。Swarm 中支持入口负载均衡的映射模式。该模式下,每个服务都会被分配一个[公开端口]^( PublishedPort),该端口在集群中任意节点上都可以访问到,并被保留给该服务。
当有请求发送到任意节点的公开端口时,该节点若并没有实际执行服务相关的容器,则会通过路由机制将请求转发给实际执行了服务容器的工作节点。
2 搭建集群
我用 VMWare 搭建了 2 台主机,IP 分别为 192.168.48.125
和 192.168.48.8
,现在将192.168.48.128
作为管理节点,将192.168.48.8
作为工作节点。
在集群中,时间同步是很重要,可以使用ntp
先同步时间。
yum -y install ntp
systemctl enable ntpd
systemctl start ntpd
2.1 创建集群
docker swarm init --advertise-addr 192.168.48.125
注意返回的 token 串,这是集群的唯一 id,加入集群的各个节点将需要这个信息。
默认的管理服务端口为 2377,需要能被工作节点访问到;另外,为了支持集群的成员发现和外部服务映射,还需要再所有节点上开启 7946 TCP/UDP 端口和 4789 UDP 端口。
关于 Centos7.x 开放端口可以参考https://blog.csdn.net/qq_39007083/article/details/106875997 。
2.2 加入集群
在所有要加入集群的普通节点上面执行swarm join
命令,表示把这台机器加入指定集群当中。例如,在192.168.48.8
工作节点上,将其加入刚创建的集群,则可以通过:
docker swarm join --token SWMTKN-1-15692f3ho3t3oi68ljnv0fi5nxerox2jsuplmhv0qzerzqpfh1-er9ufvvh4bym5o3iifummtvnf 192.168.48.125:2377
此时在管理节点可以看到刚加进来的192.168.48.8
工作节点:
2.3 使用集群服务
搭建成功的集群,可以使用使用docker service
命令使用 Swarm 提供的服务。
可以在管理节点上执行如下命令来快速创建一个应用服务,并制定服务的复制份数为 2。如下命令所示,默认会自动检查确认服务状态都正常:
docker service create --replicas 2 --name ping_app debian:jessie ping docker.com
在管理节点上使用 docker service ls
可以查看集群中服务情况:
可以看到,管理节点和工作节点上都运行了一个容器,镜像为debian:jessie
:
2.4 扩展服务
可以通过
docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>
命令来对服务进行伸缩,例如将服务复制个数从 2 改为 1。
2.5 离开集群
节点可以在任何时候通过swarm leave
命令离开一个集群。命令格式为dockerswarm leave [OPTIONS]
,支持-f
, --force
意味着强制离开集群。
2.6 常用命令
Docker 通过 service 命令来管理应用服务,主要包括create
、inspect
、logs
、ls
、ps
、rm
、rollback
、scale
、update
等若干子命令: