一、Swarm 简介
Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。
Swarm 也采用了典型的“主从”结构,通过Raft 协议来在多个管理节点( Manager )中实现共识。工作节点( Worker )上运行agent 接受管理节点的统一管理和任务分配。用户提交服务请求只需要发给管理节点即可,管理节点会按照调度策略在集群中分配节点来运行服务相关的任务。在Swarm 中,集群中会自动通过Raft 协议分布式选举出Manager 节点,无须额外的发现服务支持,避免了单点瓶颈。同时,Swarm中内置了基于DNS 的负载均衡和对外部负载均衡机制的集成支持。
二、基本概念
Swarm 在Docker 基础上扩展了支持多节点的能力,同时兼容了大部分的Docker 操作。
Swarm 中以集群为单位进行管理,支持服务层面的操作。
1.Swarm 集群
Swarm 集群( Cluster )为一组被统一管理起来的Docker 主机。集群是Swarm 所管理的对象。这些主机通过Docker 引擎的Swarm 模式相互沟通,其中部分主机可能作为管理节点(manager)响应外部的管理请求,其他主机作为工作节点( worker )来实际运行Docker 容器。当然,同一个主机也可以即作为管理节点,同时作为工作节点。当用户使用Swarm 集群时,首先定义一个服务(指定状态、复制个数、网络、存储、暴露端口等),然后通过管理节点发出启动服务的指令,管理节点随后会按照指定的服务规则进行调度,在集群中启动起来整个服务,并确保它正常运行。
2 . 节点
节点( Node )是Swarm 集群的最小资源单位。每个节点实际上都是一台Docker 主机。
Swarm 集群中节点分为两种:
2.1管理节点( manager node ):负责响应外部对集群的操作请求,并维持集群中资源,分发任务给工作节点。同时,多个管理节点之间通过Raft 协议构成共识。一般推荐每个集群设置5 个或7 个管理节点;
2.2工作节点( worker node ) : 负责执行管理节点安排的具体任务。默认情况下,管理节点自身也同时是工作节点。每个工作节点上运行代理( agent)来汇报任务完成情况。用户可以通过docker node promote 命令来提升一个工作节点为管理节点;或者通过docker node demote 命令来将一个管理节点降级为工作节点。
3 . 服务
服务( Service )是Docker 支持复杂多容器协作场景的利器。一个服务可以由若干个任务组成,每个任务为某个具体的应用。服务还包括对应的存储、网络、端口映射、副本个数、访问配置、升级配置等附加参数。一般来说,服务需要面向特定的场景,例如一个典型的Web 服务可能包括前端应用、后端应用,以及数据库等。这些应用都属于该服务的管理范畴。
Swarm 集群中服务类型也分为两种(可以通过-mode 指定):
3.1复制服务( replicated services )模式: 默认模式,每个任务在集群中会存在若干副本,这些副本会被管理节点按照调度策略分发到集群中的工作节点上。此模式下可以使用-replicas 参数设置副本数量;
3.2全局服务( global services )模式: 调度器将在每个可用节点都执行一个相同的任务。该模式适合运行节点的检查,如监控应用等。
4 . 任务
任务是Swarm 集群中最小的调度单位,即一个指定的应用容器。例如仅仅运行前端业务的前端容器。任务从生命周期上将可能处于创建( NEW ) 、等待( PENDING ) 、分配( ASSIGNED ) 、接受( ACCEPTED ) 、准备( PREPARING )、开始( STARTING ) 、运行(RUNNING )、完成COMPLETE )、失败(FAILED ) 、关闭( SHUTDOWN )、拒绝(REJECTED )、孤立( ORPHANED )等不同状态。
Swarm 集群中的管理节点会按照调度要求将任务分配到工作节点上。例如指定副本为2时,可能会被分配到两个不同的工作节点上。一旦当某个任务被分配到一个工作节点,将无法被转移到另外的工作节点,即Swarm 中的任务不支持迁移。
5 . 服务的外部访问
Swarm 集群中的服务要被集群外部访问,必须要能允许任务的响应端口映射出来。Swarm 中支持人口负载均衡( ingress load balancing )的映射模式。该模式下,每个服务都会被分配一个公开端口( PublishedPort ),该端口在集群中任意节点上都可以访问到,并被保留给该服务。
当有请求发送到任意节点的公开端口时,该节点若并没有实际执行服务相关的容器,则会通过路由机制将请求转发给实际执行了服务容器的工作节点。
三、Swarm的使用
Swarm 集群的主要操作,包括:
swarm init 在管理节点上创建一个集群;
node list 列出集群中的节点信息;
swarm join 加入一个新的节点到已有集群中;
swarm leave 离开一个Swarm集群;
swarm update 更新一个Swarm 集群;
可以使用docker service 命令部署Docker 应用服务到集群中;
3.1创建集群
在管理节点上执行如下命令来创建一个新的Swarm 集群
docker swarm init --advertise-addr [manager ip]
注意返回的token串,这是集群的唯一id,加人集群的各个节点将需要这个信息。另外,默认的管理服务端口为2377 ,需要能被工作节点访问到;另外,为了支持集群的成员发现和外部服务映射,还需要再所有节点上开启7946 TCP/UDP 端口和4789 UDP 端口。
3.2查看集群信息
通过docker info
命令可以查看到集群的信息。
查看集群中已经加入的节点情况
docker node ls
查看swarm worker的连接令牌
docker swarm join-token worker
查看swarm manager的连接令牌
docker swarm join-token manager
3.3加入集群
在工作节点上,将其加入刚创建的集群
docker swarm join --token SWMTKN-1-1next4gw4m7yx3j6q1f4z4ooimvp3pc1ahsnnwifu5w1h6b247-f10wphfpnyyunzphr1qp4kew1 manager ip:2377
在管理节点上,查看新加入集群中工作节点情况
docker node ls
将节点升级为manager
docker node promote work-node1
将节点降级为worker
docker node demote work-node1
3.4使用集群服务
那么,怎么使用Swarm 提供的服务呢?实际上有两种方法,一种是使用Docker 原来的客户端命令,只要指定使用Swarm manager 服务的监昕地址即可。例如, manager 服务监听的地址为<manager ip >:2377,则可以通过指定-H< manager ip >:2377选项来继续使用Docker 客户端,执行任意Docker 命令,例如ps 、info 、run等。
另外一种方法,也是推荐的做法,是使用新的docker service 命令,可以获得包括多主机网络等更高级的特性支持。
创建好Swarm 集群后,可以在管理节点上执行如下命令来快速创建一个名web应用服务,并制定服务的复制份数为2,开放端口为80的nginx 。如下命令所示,默认会自动检查确认服务状态都正常:
docker service create --name web --replicas 2 -p 80:80 nginx
3.4.1此时使用docker service ls
查看集群中服务情况
还可以通过docker service inspect --pretty web或docker service ps web
查看服务的具体信息:
docker service inspect --pretty <SERVICE-ID>/<SERVICE-NAME>
3.4.2扩展服务
用户还可以通过docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>
命令来对服务进行伸缩, 例如将服务复制个数从2 改为1:
docker service scale web=1
服务使用完成后可以通过docker service rm <SERVICE-ID >
命令来进行删除。
docker service rm web
服务命令更多的参数可以通过docker service help
进行查看。
3.4.3使用外部服务地址
Swarm 通过路由机制支持服务对外映射到指定端口,该端口可以在集群中任意节点上进行访问,即使该节点上没有运行服务实例。需要在创建服务时使用–publish 参数:
格式:
docker service create \
--name <service name> \
--publish published=<pub port> , target=<container port> \
<IMAGE>
例如:创建一个Nginx并应用这个配置
docker service create \
--name nginx \
--config source=site.conf,target=/etc/nginx/conf.d/site.conf \
--publish 8080:80 \
nginx
之后,用户访问集群中任意节点的,都会被Swarm 的负载均衡器代理到对应的服务实例。用户也可以配置独立的负载均衡服务,后端指向集群中各个节点对应的外部端口, 获取高可用特性。
3.5更新集群
用户可以使用docker swarm update [OPTIONS]
命令来更新一个集群。
--autolock 启动或关闭自动锁定(true|false)
--cert-expiry duration 根证书的过期时长 (ns|us|ms|s|m|h),默认为90 天 (default 2160h0m0s)
--dispatcher-heartbeat duration 分配组件的心跳时长, (ns|us|ms|s|m|h) 默认为5 秒;(default 5s)
--external-ca external-ca 指定使用外部的证书签名服务地址;
--max-snapshots uint Ra玩协议快照保留的个数;
--snapshot-interval uint Raft 协议进行快照的间隔(单位为事务个数),默认为10000 个事物;
--task-history-limit int 任务历史的保留个数, 默认为5
3.6离开集群
节点可以在任何时候通过swarm leave
命令离开一个集群。命令格式为
docker swarm leave [OPTIONS]
支持-f,–force意味着强制离开集群。
节点离开群集后,可以docker node rm在管理器节点上运行命令以从节点列表中删除该节点。
例如:
docker node rm node-2
四、使用服务命令
Swarm 提供了对应用服务的良好的支持,使用Swarm 集群可以充分满足应用服务可扩展、高可用的需求。Docker 通过servic e 命令来管理应用服务,主要包括create、inspect、logs 、ls 、ps 、rm 、rollback 、scale 、update 等若干子命令。详细用法请参考https://docs.docker.com/engine/swarm/services/
create 创建应用
inspect 查看应用的详细信息
logs 获取某个服务或任务的日志信息
ls 列出服务的信息
ps 列出服务中包括的任务信息
rm 删除指定的若干服务
rollback 回滚服务的配置
scale 对服务进行横向扩展调整
update 更新一个服务
五、小结
通过使用Swarm ,用户可以将若干Docker 主机节点组成的集群当作一个大的虚拟Docker 主机使用。并且,原先基于单机的Docker 应用,可以无缝地迁移到Swarm 上来。通过使用服务, Swarm 集群可以支持多个应用构建的复杂业务,并很容易对其进行升级等操作。
在生产环境中, Swarm 的管理节点要考虑高可用性和安全保护,一方面多个管理节点应该分配到不同的容灾区域,另一方面服务节点应该配合数字证书等手段限制访问。