节点架构
无标题

swarm node

从物理上讲,一个swarm 就是若干个安装了Docker的物理机或虚拟机,这些主机上的Docker 都采用Swarm 模式运行。

从逻辑上讲,一个Swarm 由若干个节点node组成,每个node会落实在一个物理Docker主机上,但是一个物理Docker主机不一定就是一个node,也可能一个主机上有多个node节点,即swarm node与Docker主机不是一对一关系。

swarm node 有两种类型:manager和worker。

Manager

Manager节点用于维护swarm集群状态、调试service、处理swarm集群管理任务。为了防止单点故障,一个swarm集群一般包含多个manager,这些Manager通过Raft算法为维护着一致性。

Worker

Worker节点用于在其Container 中运行task任务,即对外提供service服务。默认manager 同时也充当worker角色,可以运行task任务。

角色转换

manager 和Worker 的角色不是一成不变的,他们之间可以相互转换。

manager–》worker 称为节点降级

worker–》manager 称为节点升级

服务架构
无标2题

无标3题

service

搭建docker swarm的目的是为了在swarm集群中运行应用,提供更强抗压能力的服务。

service服务是一个逻辑概念,表示对外提供的服务。

task

一个service是通过task的形式出现在swarm 的各个节点中,每个节点的task是通过容器对外提供服务。

编排器

在swarm manager中有一个编排器,用来管理task的创建与停止。比如:

searm manager 中定义一个有3个task的service时,

编排器会先创建3个task,每个task有一个taskID,通过分配器为每个task分配一个虚拟IP。
再讲task注册到内置的DNS中。当某个task不可用时,编排器会在DNS中注销该task。
分发器

swarm manager中有一个分发器,用于对task的监听、调度等操作。

在前面的例子中,当编排器创建3个task后,会调用分发器为每个task分配节点,

分发器会现在swarm集群的所有节点中找到3个 available node,每个node分配一个task。每个task像是一个“插槽”,分发器会在每个“插槽”中放入一个容器,一个容器就是一个task实例。

一旦容器运行,分发器就能监测其运行状态,即task的运行状态。

如果容器不可用或被终止,task也会被终止。此时编排器会立即在DNS中注销该task,然后编排器再生成一个新的task,并在DNS中注册,然后分发器分配一个新的available node ,然后在此节点上运行容器。

分发器除了为task分配节点外,还实现对访问请求的负载均衡。当请求到来时,会被manager处理:根据内置的DNS,实现访问的负载均衡。

服务部署模式
无4标题

常见的service部署模式有两种:replicated模式与global模式

replicated模式:副本模式,service的默认部署模式,需要指定task数量。当task数量不等于swarm 的节点数量时,需要使用replicated模式。

manager 中的分发器会找到task个数的available node,为每个节点分配一个或若干个task。

global模式:全局模式,分发器为每个节点都分配一个task。不能指定task数量。swarm集群每增加一个节点,编排器就会创建一个task,通过分发器分配到新的节点上。

swarm集群搭建
现在搭建一个swarm集群,包括5个swarm节点。

无5标题

准备5个主机,主机名分别是docker1、docker2、docker3、docker4、docker5

查看swarm激活状态

通过docker info命令查看swarm的激活状态。

无标6题

上图表示swarm未激活。

swarm初始化

在“docker1”主机上运行docker swarm init 命令。创建并初始化一个swarm

添加worker节点

复制上面执行命令的结果中添加worker节点命令在docker4和docker5中运行,将这两个节点添加未docker节点

无7标题

添加manager节点

执行docker swarm join-token manager命令

复制上面的响应结果,在docker2和docker3中运行,将这两个节点添加为manager节点

无8标题

查看swarm节点

在manager 节点docker1、docker2、docker3 上执行docker node ls 查看当前节点数据,但是在worker节点不能运行docker node ls 命令

无9标题

swarm集群维护
退出swarm集群
worker 退群:直接运行docker swarm leave 即可

worker 重新加入:先在manager运行docker swarm join-token worker

然后复制生成的命令,在新worker节点上运行,就添加到swarm集群了。

查看节点情况,发现原来的docker5是down,新的docker5节点是Ready

无标10题

删除down节点:在manager节点上运行docker node rm
manager 退群
对于manager节点,原则上不推荐直接退群,这样会导致swarm集群的一致性受到损坏。

可在docker swarm leave 命令后添加-f 或–force选项进行强制退群。

swarm自动锁定
swarm集群自动锁定原理

在manager集群中,swarm童话该国Raft日志方式维护manager集群中数据的一致性。

即每个节点通过manager间通信方式维护自己的Raft日志。

但在通信过程中有一种风险:攻击者通过Raft日志数据的传递来访问、篡改manager节点中的数据。为了防止被攻击,swarm开启了一种集群自动锁定功能,为通信启用TLS加密。加密解密的公钥与私钥全部维护在各个节点的Docker内存中。一旦节点的Docker 重启,则密钥丢失。

swarm通过autolock 标志来设置集群的自动锁定功能:true表示开启,false表示关闭。

设置自动锁定

在manager节点通过docker swarm update -autolock=true开启

此时查看manager的docker info,可以看到autolock设为true。

查看解锁密钥

在manager中运行docker swarm unlock-key查看

无标题11

关闭一个manager

直接关闭docker3 的docker引擎,模拟宕机情况

systemctl stop docker
加入manager ,启用docker3 的docker引擎

systemctl start docker
此时查看节点docker info,可以看到Swarm值为locked,若要加入,必须先解锁。

在docker3中执行docker swarm unlock命令解锁

输入密钥就完成解锁了。

swarm节点维护
角色转换
worker升级为manager

通过docker node promote命令可以将worker升级为manager。

下面的命令是将docker4和docker5升级为manager

无12标题

manager降级为worker

通过docker node demote命令将manager降级为worker

无标13题

docker node update 变更角色

通过docker node update --role [manager|worker] [node]也可以变更角色

将docker2和docker3变为manager

docker node update --role manager docker2
docker node update --role manager docker3

将docker4和docker5变为worker

docker node update --role worker docker4
docker node update --role worker docker5
节点标签
swarm可以为节点添加描述性标签,以便于更加了解节点。

添加/修改节点标签

通过docker node update --label-add命令为指定node添加key=value的标签。如果key已经存在,则修改value。如果要添加或修改多个标签,需要多个–label-add 选项指定。

docker node update --label-add auth=zs --label-add email=zs@163.com docker2
通过docker node inspect 查看该节点的标签

无标14题

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐