Docker_05_Docker Swarm
@
Docker Swarm
Docker Swarm:Docker原生的集群管理工具
1)将若干个Docker主机虚拟成一个Docker主机进行管理
2)集群中的所有Docker主机必须在1.4.0版本以上;
3)所有Docker节点必须运行同一版本的Docker;
4)Swarm 的配置和状态信息保存在一套位于所有manager节点上的分布式 etcd数据库中(该数据库运行于内存中,并保持数据的最新状态);
5)Swarm 默认占用 2337
端口
Node(节点):加入到swarm集群中的一个docker引擎实体
1)Swarm本质就是由多个Node组成的集群;
2)一个宿主机上可运行多个Node;
3)分为worker节点和manager节点,manager节点可相互通信;
4)worker节点需将其分配的Task的当前状态通知manager节点,以便manager节点可以保持每个worker节点的所需状态
如:manager节点下管理的worker节点
Service(服务):节点上单个或多个容器(副本)组成对外的服务
1)服务是Swarm 中的最小调度单元;
2)在worker节点或manager节点上运行,但仅在worker节点上执行Task;
3)默认情况下,manager节点也可运行服务
//可配置为以独占方式运行,且仅作为manager节点
如:服务根据Task运行实际的container
所有的服务都会被 Swarm 持续监控,Swarm会在后台进行轮训检查,持续比较服务的实际状态和期望状态是否一致,以确保实际状态能够满足期望状态的要求,若一致,则无须任何额外操作;若不一致,Swarm 会使其一致
如:指定web服务需要5个web-fe副本的运行,若运行 web-fe副本的某个worker节点宕机了,则 web-fe 的实际状态从 5 个副本降为 4个,从而不能满足期望状态的要求,Swarm会在其他节点启动一个新的 web-fe副本,使实际状态与期望状态保持一致
Task(任务): 一个运行的容器和其需执行的命令
1)Task就是Service的执行实体;
2)manager节点根据调度策略分配Task给各个worker节点
3)Task一旦分配给一个节点,就不能移动到另一个节点,只能在指定的节点上运行,否则将失败
如:Task的调度
容器的调度策略分为:平铺策略、紧凑策略和随机策略
1)平铺策略(Spread):选择已运行容器数量最少的节点(默认策略);
2)紧凑策略(BinPacking):根据每个节点上CPU和内存资源为节点打分,选择使用最紧凑的节点,保证节点最大限度地被使用(避免碎片化);
3)随机策略(Random):随机选择一个节点运行容器
安装
安装命令:docker pull swarm
卸载命令:docker rmi swarm的镜像ID
如:在当前系统上安装Docker Swarm
命令
swarm命令:生成/管理集群
指令格式:docker swarm 选项
选项 | 含义 |
---|---|
init | 初始化节点 |
join | 加入节点 |
join-token | 生成令牌 |
leave | 离开节点 |
unlock | 锁定节点 |
unlock-key | 解锁节点 |
update | 更新节点 |
1)init选项:docker swarm init --advertise-addr Docker主机IP:端口号
2)join选项:docker swarm join --token 身份令牌
3)join-token选项:docker swarm join-token 参数
参数 | 说明 |
---|---|
worker | 生成worker节点令牌 |
manager | 生成manager节点令牌 |
//生成指定身份节点的令牌,用于让其他节点加入生成令牌的节点,且仅有manager节点可生成令牌
node命令:管理swarm的节点
指令格式:docker node 选项
选项 | 含义 |
---|---|
ls | 列出当前swarm中所有节点 |
inspect | 显示指定节点的详细信息 |
demote | 降级指定节点(成为worker) |
promote | 升级指定节点(成为manager) |
ps | 列出节点上正在运行的任务 |
update | 更新指定节点 |
rm | 删除指定节点 |
1)update选项:docker node update 参数
参数 | 说明 |
---|---|
-role | 更新节点的身份(worker或manger) |
-availablity | 更新节点的可用性 (active、pause、drain) |
-label-add | 添加/更新节点标签 (方式:key=value) |
-label-rm | 删除节点标签 |
service命令:创建/管理服务
指令格式:docker service 选项
选项 | 含义 |
---|---|
create | 创建服务 |
ls | 列出所有正在运行的服务 |
ps | 查看指定服务的状态 |
inspect | 查看指定服务的详细信息 |
logs | 查看指定服务的日志信息 |
scale | 对指定服务进行扩缩容 |
rm | 删除指定服务 |
//创建服务时,可用类似run命令一样的选项进行配置
Swarm集群
创建Swarm集群流程:
1)初始化第一个manager节点;
2)加入额外的manager节点;
3)加入worker节点
4)创建服务;
1)不包含在任何 Swarm 中的节点,称为运行于单引擎(Single-Engine)模式;
2)一旦被加入 Swarm 集群,则切换为 Swarm 模式;
3)在单引擎模式下的 Docker 主机上运行 docker swarm init会将其切换到 Swarm
模式,并创建一个新的 Swarm,将自身设置为Swarm的第一个管理节点;
4)更多的节点可以作为管理节点或工作节点加入进来,并且会将新加入的节点切换为
Swarm 模式
1)即使有多个manager节点,但仅有一个节点处于活动状态;
2)处于活动状态的manager节点被称为“主节点”(leader);
3)而主节点也是唯一一个会对 Swarm 发送控制命令的节点;
4)若备用(非活动)manager节点接收到Swarm 命令,则会将其转发给主节点
1)部署奇数个管理节点;
2)不要部署太多管理节点(建议 3 或 5 个);
3)绝对不要多于 7 个,因为需要花费更长的时间来达成共识;
4)部署奇数个管理节点有利于减少脑裂(Split-Brain)情况的出现机会;
5)虽然在脑裂情况下集群依然在运行,但是无法变更配置和管理应用负载了
如:搭建Swarm集群
(1)初始化
1)查看主机IP
2)根据主机IP,对其初始化(IP为192.168.184.130)
(2)生成worker节点和manager节点令牌
(3)其他节点加入
1)加入第二个管理节点(IP为192.168.184.128)
2)加入第三个管理节点(IP为192.168.184.131)
3)加入第一个worker节点(IP为192.168.184.129)
4)加入第二个worker节点(IP为192.168.184.132)
(4)查看节点状态
(5)创建服务(manager节点和worker节点均可创建服务)
1)在manager节点创建mynginx服务,并查看状态
2)该服务的nginx容器在第三个manager节点上运行
(6)指定服务扩缩容
1)对mynginx服务进行扩容,并查看状态
2)对mynginx服务进行缩容,并查看状态
(7)当Swarm集群中有manager节点宕机时
1)关闭主节点的docker服务(模拟宕机)
2)到其他manager节点,查看当前节点状况
3)再次启动docker服务
(8)删除指定节点
1)退出Swarm集群
2)从集群中删除该节点