Swarm简介
1、Swarm是一个集群化任务编排工具,使用声明式的配置,配置文件接近docker-compose
2、Swarm是Docker引擎内置(原生)的集群管理和编排工具,Docker Swarm是Docker官方三剑客项目之一(但现在用的不是特别多了)
Docker swarm的特点:
1、集群化任务编排工具
2、声明式配置方式
3、支持扩缩容
4、支持故障自愈
Docker swarm的概念图:
·task:最小部署单元(一个task代表一个实例)
·services:一个运行中的服务可以有多个task(副本)
·stack:Services服务的集合
Swarm运行机制
Swarm集群需要至少一个manager节点,manager将任务分配个woker节点,manager节点本身也可以处理任务
Swarm节点类型:
manager节点:管理集群
worker节点:运行容器任务
Swarm运行原理:
·manager节点收到任务会将任务调度到work节点
·work节点收到命令后启动任务
·如果任务数量少于期望值,会自动重建任务
Swarm应用部署模式:
Swarm有两种应用部署模式,副本应用和全局副本应用,下图显示三个副本服务(黄色)和全局服务(灰色)
副本服务:任何节点都可以部署满足期望值即可
全局副本:不需要指定期望值每一个节点自动会启用全局副本
Swarm集群搭建
准备环境
服务器准备
我的三台测试机
IP地址 | 角色 | 主机名 |
---|---|---|
IP1 | manager | node1 |
IP2 | worker | node2 |
IP3 | worker | node3 |
1、服务器端口开放:
在创建集群前,如果开启了防火墙,需要确认三台主机的防火墙能让swarm需求的端口开放,需要打开主机之间的端口,以下端口必须可用。在某些系统上,这些端口默认为打开。
2377:TCP端口2377用于集群管理通信
7946:TCP和UDP端口7946用于节点之间的通信
4789:TCP和UDP端口4789用于覆盖网络流量
2、测试环境直接禁用防火墙
systemctl stop firewalld(立即生效)
systemctl disable firewalld(重启生效)
3、初始化Swarm集群
#初始化Swarm集群
docker swarm init --advertise-addr 【本机IP地址】
#查看swarm节点
docker node ls
因为hostName不好区分,修改hostName
#修改主机名
hostnamectl set-hostname master
# 查看主机名
hostnamectl status
4、将其他节点加入master节点
docker swarm join --token SWMTKN-1-53p5t2rt9ud5j0owkl14boj2z8im6r60ddlzotgc4a8y93u1c2-8f6crxgyc9umayhxva1jv9t1w 【master节点IP】:2377
5、查看Swarm节点
docker node ls
AVAILABILITY状态说明
Active 意味着调度程序可以将任务分配给节点。
Pause 意味着调度程序不会将新任务分配给节点,但现有任务仍在运行。
Drain 意味着调度程序不会向节点分配新任务,调度程序关闭所有现有任务并在可用节点上调度它们。
MANAGER STATUS状态说明
显示节点是属于manager或者worker
没有值 :表示不参与群管理的工作节点。
Leader :意味着该节点是使得群的所有群管理和编排决策的主要管理器节点。
Reachable: 意味着节点是管理者节点正在参与Raft共识,如果领导节点不可用,则该节点有资格被选为新领导者。
Unavailable :意味着节点是不能与其他管理器通信的管理器,如果管理器节点不可用,您应该将新的管理器节点加入群集,或者将工作器节点升级为管理器。
5、添加节点标签
因为用到了节点约束,所以在启动服务之前需要添加节点标签
使用节点约束的意义:
比如某个节点下部署了mysql,当这个mysql容器异常时,Swarm会自动启动一个新的但是如果节点的位置从node1到了node2会造成数据丢失这种问题
所以需要添加节点约束,确保重新启动的节点只在有指点标签的节点上部署。这样mysql就跟节点进行了绑定确保不会出现异常问题
#添加标签
docker node update --label-add role=data node1
#查看节点标签信息
docker node inspect node1|grep role