Docker集群(docker swarm)

docker ginotang 2248℃ 0评论

简介

swarm mode是Docker的集群模式。集群模式的好处是多台主机提供相同的服务,它们看起来像是一个整体,Docker对用户的网络请求自动分发到合适的节点上面,最大的好处是故障转义,负载均衡。

在Docker 1.12.0之前,swarm是一个独立的组件,但之后被集成到Docker中,无需另外安装。

swarm mode有以下好处:

  • 集中管理 swarm mode包括manager节点和worker节点,所有的worker节点由manager节点统一管理,manager节点同时也是一个特殊的worker节点。
  • 弹性伸缩 swarm mode可以根据集群的负载情况动态调整节点数量,合理利用资源
  • 故障转义 某个节点出现故障,Docker会自动选择某个合适的节点启动新的服务
  • 负载均衡 swarm默认自动分发流量,但也可以提供外部负载均衡方案
  • 服务发现 swarm为每个服务提供一个唯一的DNS名称,可以通过这个名称访问容器
  • 滚动更新 允许我们在不停止服务的情况下更新容器

相关概念

  • Manager Node

    manager node即管理节点,用于管理其他worker节点,一个swarm集群中可以有多个管理节点,多个管理节点会自动选举一个leader。

  • Worker Node

    普通节点,不能在普通节点上执行相关的swarm管理命令

  • Service

    一个service就是一个容器,service由manager node创建,运行于worker node上面

搭建swarm环境

docker swarm

创建manager节点

manager节点的创建非常简单,只需要一条命令

命令执行完毕,显示当前节点是一个管理节点,且会提示应该如何添加worker节点:

只要把这条命令复制到要加入到集群中的主机执行。如果以后忘记了这条命令,可以使用以下命令查询

查看节点信息

使用docker node ls命令检查节点状态

目前只有一个管理节点。

加入worker节点

在创建manager节点的时候,已经提示了如何加入worker节点,在剩下的主机中运行下面的命令

再次检查节点信息

所有的节点准备就绪

创建service

创建service就是创建容器,不同的是所有worker中的service都由manager节点负责管理。

使用docker service create创建service

查看集群中的所有服务

查看服务的状态

集群管理

集群管理主要是对service的管理,包括service间的互相通讯、数据保存、故障转移等。

弹性伸缩

我们可以根据服务器的负载对service的数量进行调整,当service创建的时候,它默认只有一个副本,即REPLICAS等于1。

添加副本

使用service scale命令添加和减少副本,只需要为service设置一个数字。

完成后查看service状态

REPLICAS现在等于3,三个service分布在不同的服务器上面,manager节点也是一个worker节点,因此它也会被安排运行service。如果希望排除某个节点,可以使用下面的命令

那么问题来了,当节点被排除之后,它上面的service会如何处理呢?使用docker service ps查看一下:

很明显,节点上原本的service被shutdown,迁移到其他节点上面运行,例子中的service被迁移到nas-share节点上面。

减少副本

当负载不高的情况下,我们决定减少service的数量,只需要设置一个比原先小的数目即可。

再次检查service状态

其中一个节点上的service被移除了。

使用update进行弹性伸缩

它们的原理一样,只不过使用的是不一样的命令

故障转移

swarm内置了故障转移策略,一般不需要人工干预。现在我们关闭其中一个节点观察转移的过程

查看service情况

原先centos74vm上的webapp.2标记为shutdown。由于我们关闭了centos74vm节点,centos7-server被我们drain掉,所以service只能迁移到nas-share这个唯一可用的节点上面。

滚动更新

滚动更新保证我们在更新期间可以继续对外提供服务。滚动更新的原理是分批更新,更新期间由等待更新的service继续提供服务。同样地,swarm的滚动更新无需人工干预,但我们可以设置更新参数。

先移除原先的service,重新部署5个副本的webserver。

检查它们的状态

使用docker service update命令,把service的镜像更新到1.15版本

在service更新的过程中,我们可以新开一个终端观察它们的情况

可以清晰见到它们并不是同时更新,而是一个个进行更新,因此等待中的service可以继续对外提供服务。

Swarm 将按照如下步骤执行滚动更新:

  1. 停止第一个准备更新的副本。
  2. 根据负载情况选择 worker node。
  3. 在选择的worker 上用新的镜像启动副本。
  4. 如果副本(容器)运行成功,继续更新下一个副本;如果失败,暂停整个更新过程。

默认情况下,swarm每次更新一个副本,且副本间的更新时间间隔为0,即更新成功一个副本马上更新下一个。可以通过参数控制这些行为,它们是

  • –update-parallelism 每次更新多少副本
  • –update-delay 副本间的更新时间间隔

副本从5个减少到3个,每次更新2个部分,间隔为1分30秒。

可以使用docker service inspect命令查看相关设置

inspect docker service

回滚更新

如果更新有问题,可以回滚到上一个版

也可以通过下面的命令进行回滚

限制每个节点运行一个副本

swarm默认会根据节点的负载情况进行service的部署,一个节点可能会运行一个或多个service,这是swarm的运行模式replicated决定的,可以使用docker service inspect命令查看目前使用的模式。可以改变这个模式,让每个节点只能运行一个副本,也就是global模式。

查看运行情况

约束service的运行位置

除了可以限制每个节点运行一个service,还可以指定service在某个特定节点运行,使用label即可。

  • 首先为每个节点使用label打上印记
  • 然后设置service运行在指定label的node

lable实际上是一个键值对,可以任意指定它们的值,有意义即可。例如:

指定开发机:

指定生产机:

然后部署service时指定label即可

约束的添加和移除

转载请注明:Pure nonsense » Docker集群(docker swarm)

喜欢 (0)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x