Swarm 是 Docker 公司推出的用来管理docker集群的平台,Swarm 是 Docker 官方容器编排项目,可以在多个服务器或主机上创建容器集群服务,Swarm 自己不运行容器,它只是接受 Docker 客户端发来的请求,调度适合的节点来运行容器,
Swarm 是典型的master-slave结构,通过发现服务来选举manager。manager是中心管理节点,各个node上运行agent接受manager的统一管理,集群会自动通过Raft协议分布式选举出manager节点,无需额外的发现服务支持,
避免了单点的瓶颈问题,同时也内置了DNS的负载均衡和对外部负载均衡机制的集成支持
2、概念
swarm:集群管理和编排
node:节点,一个节点就是docker集群中的一个实例,我们可以在单台服务器上运行一个或多个节点。
service:应用编排,一个服务是任务的定义,管理机或工作节点上执行。
task:应用实例,任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点
# 使用方法
docker swarm:集群管理,子命令有init, join, leave, update。(docker swarm --help查看帮助)
docker service:服务创建,子命令有create, inspect, update, remove, tasks。(docker service--help查看帮助)
docker node:节点管理,子命令有accept, promote, demote, inspect, update, tasks, ls, rm。(docker node --help查看帮助)
node是加入到swarm集群中的一个docker引擎实体,可以在一台物理机上运行多个node,node分为:
manager nodes,管理节点
worker nodes,工作节点
*
1)manager node管理节点:执行集群的管理功能,维护集群的状态,选举一个leader节点去执行调度任务。
2)worker node工作节点:接收和执行任务。参与容器集群负载调度,仅用于承载task。
3)service服务:一个服务是工作节点上执行任务的定义。创建一个服务,指定了容器所使用的镜像和容器运行的命令。
service是运行在worker nodes上的task的描述,service的描述包括使用哪个docker 镜像,以及在使用该镜像的容器中执行什么命令。
4)task任务:一个任务包含了一个容器及其运行的命令。task是service的执行实体,task启动docker容器并在容器中执行任务。
*
3、Swarm的调度策略
swarm在调度(scheduler)节点(leader节点)运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread,binpack,random
*
1)Random
随机选择一个Node来运行容器,一般用作调试用,spread和binpack策略会根据各个节点的可用的CPU, RAM以及正在运
行的容器的数量来计算应该运行容器的节点。
*
2)Spread
在同等条件下,Spread策略会选择运行容器最少的那台节点来运行新的容器,binpack策略会选择运行容器最集中的那台机器来运行新的节点。
使用Spread策略会使得容器会均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器。
*
3)Binpack
Binpack策略最大化的避免容器碎片化,就是说binpack策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在
一个节点上面。
*
*
Swarm Manager:
● API:接受命令并创建 service 对象(创建对象)
● orchestrator:为 service 对象创建的 task 进行编排工作(服务编排)
● allocater:为各个 task 分配 IP 地址(分配 IP)
● dispatcher:将 task 分发到 nodes(分发任务)
● scheduler:安排一个 worker 节点运行 task(运行任务)
Worker Node:
● worker:连接到调度器,检查分配的 task(检查任务)
● executor:执行分配给 worker 节点的 task(执行任务)
4、Docker Swarm集群部署
机器环境(三台机器,centos系统)
IP:192.168.31.43 主机名:manager43 担任角色:swarm manager
IP:192.168.31.188 主机名:node188 担任角色:swarm node
IP:192.168.31.139 主机名:node139 担任角色:swarm node
修改主机名,关闭防火墙
- #修改主机名
- hostnamectl set-hostname manager43
- hostnamectl set-hostname node188
- hostnamectl set-hostname node139
-
- #关闭三台服务器上的防火墙
- systemctl stop firewalld.service
- systemctl disable firewalld.service
创建 Swarm 集群
- # Step 1: 在 192.168.31.43 主服务器上创建 Swarm 集群
- docker swarm init --advertise-addr 192.168.31.43
-
- # 这就是添加节点的方式(要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥)
- docker swarm join --token SWMTKN-1-4kdb7ysckerhxc6gxc3bpltkxtm8o45yq1ikyv1kie825zibhh-bhwazb9y8i3s92v8mpv5c06so 192.168.31.43:2377
- # 可能会遇到一个小小的问题:提示This node is already part of a swarm. Use "docker swarm leave" to leave this swarm and join another one.
- # 解决方法,这里的leave就是在集群中删除节点,-f参数强制删除,执行完在重新执行OK
- docker swarm leave -f
- docker swarm init --advertise-addr 192.168.31.43
-
- # Step 2: 查看集群相关信息
- docker info
-
- # Step 3: 查看集群节点信息,集群中的机器
- docker node ls
-
- # Step 4: 添加节点主机到Swarm集群
- # 在 192.168.31.188 主机上执行
- docker swarm join --token SWMTKN-1-2lefzq18zohy9yr1vskutf1sfb2a590xz9d0mjj2m15zu9eprw-2938j5f50t35ycut0vbj2sx0s 192.168.31.43:2377
- # 在 192.168.31.139 主机上执行
- docker swarm join --token SWMTKN-1-2lefzq18zohy9yr1vskutf1sfb2a590xz9d0mjj2m15zu9eprw-2938j5f50t35ycut0vbj2sx0s 192.168.31.43:2377
- # 查看集群节点信息,集群中的机器
- docker node ls
- # 参数说明
- active状态下,node可以接受来自manager节点的任务分派;
- drain状态下,node节点会结束task,且不再接受来自manager节点的任务分派(也就是下线节点)
-
- # Step 5: 在Swarm中部署服务(nginx为例)
- # 创建网络
- docker network create -d overlay nginx_net
- docker network ls | grep nginx_net
-
- # 部署服务
- # 创建一个具有一个副本(--replicas 1 )的nginx服务,使用镜像nginx
- docker service create --replicas 1 --network nginx_net --name my_nginx -p 80:80 nginx
- # 参数说明
- --replicas 参数指定服务由几个实例组成
-
- # 查看正在运行服务的列表
- docker service ls
-
- # 查询Swarm中服务的信息
- docker service inspect --pretty my_nginx
-
- # 查询到哪个节点正在运行该服务
- docker service ps my_nginx
-
- # 在Swarm中动态扩展服务(scale)
- docker service scale my_nginx=4
- docker service ps my_nginx
*
*
*