剑客
关注科技互联网

Swarm: Docker学习者的“救星”

毕设开题,没有什么思路,索性重新看下Docker的文档。

没想到Docker在今年6月份就已经升级到了1.12.0版本,这个版本最亮眼的更新就是Swarm集群管理功能被集成到Docker子命令中,极大地简化了搭建Docker集群步骤,在管理集群管理方面也非常灵活。

已经被Kubernetes折磨得不要不要的,后悔没有及时关注Docker的动态。

马上上手实践。

1. Swarm集群搭建

在实验室开通了三台虚拟机用于测试,系统是ubuntu 14.04:

192.168.140.52

192.168.140.55

192.168.140.56

先做好准备工作。

在三台虚拟机上分别装好docker engine,官网上(https://docs.docker.com)有非常简明的步骤。现在默认安装的版本都是1.12.2了,1.12.0以前版本的可以手动升级。

三台虚拟机时间同步。这个官方文档里没有提示,也就没注意到时间同步问题(以前都是在自己电脑上开虚拟机搭建伪分布式集群)。是在搭建集群中出现问题,很庆幸自己在一大推高票答案的小字体回复中看到了“date”,才想到可能是时间不同步的原因。

由于是自己学习用,要求没那么高,每台机子都安装ntp,使用默认的ntp服务器就可以了:

$ sudo apt-get install ntp

$ sudo /etc/init.d/ntp restart

安装好之后,一般是同步的,检查时间使用的格式是否统一:

Swarm: Docker学习者的“救星”

Swarm: Docker学习者的“救星”

可以看到一个是UTC(世界统一时间),一个是CST(本地时间,在东八区差不多早8个小时),两个统一一下就可以。

准备工作基本完成,下一步就是搭建集群。

集群的不同节点扮演不同的角色,分为manager和worker。

从字面意思就可以看出来,manager是集群的首脑,负责管理整个集群,比如维持集群的正常运行状态、服务调度和节点的任务分配等;而worker就是专门干活的(运行容器)。当然manager默认也会负责部分worker的任务。

基本的框架就是这样的:

Swarm: Docker学习者的“救星”

搭建集群先从创建一个manager开始:

$ sudo docker swarm init –advertise-addr 192.168.140.52

192.168.140.52就是该manager节点的固定ip。

这一步成功后就会提示你下一步该如何操作:

Swarm: Docker学习者的“救星”
当前节点已经是Swarm集群的manager节点了,如果要在该集群中加入一个worker节点,那就执行:

$ sudo docker swarm join /

–token SWMTKN-1-3sp76jiv6q0t9ajjjecth7ly3c9pi2f9j0ugh3ije1e05y5ulm-4hpw729qg430hm5o818vjtxel 192.168.140.52:2377

如果要在该集群中再加入一个manager节点,就执行:

$ sudo docker swarm join-token manager

可以先查看一下192.168.140.52这个manager节点的相关信息:

$ sudo docker info

Swarm: Docker学习者的“救星”
选取了swarm部分,可以看到节点id、manager属性、节点的数量和Raft等信息。

创建好了manager节点,根据上面的提示,分别将另外两台虚拟机(192.168.140.55和192.168.140.56)以worker的角色加入集群。

创建好了三节点的集群,可以在manager节点上查看集群所有节点信息:

Swarm: Docker学习者的“救星”

(原谅我没有修改虚拟机的hostname)

IP NodeID
192.168.140.52 90gra7kdg5q4d98qmx2jsnnfg
192.168.140.55 0mj0j87zsk6lln5inhxknnpbs
192.168.140.56 8dd42cw04u4b3gddjgpyn7k1p

如果需要改变节点的角色,可以在manager节点通过命令轻松更改:

promote将worker转变为manager的命令格式:

$ sudo docker node promote <node-id or node-name>

举例:

Swarm: Docker学习者的“救星”

从图中可以看出192.168.140.55节点MANAGER STATUS属性变成了Reachable。在众多的manager中,有且只有一个Leader,其余的都得听从“调遣”,如果该Leader宕机了,就会从剩下的manager中重新选举一个Leader。

相反的过程, demote
将manager转变为worker的命令格式:

Swarm: Docker学习者的“救星”

这样一个基本的Docker集群就搭建好了,整个过程清晰明了。

那么,跨主机容器间的网络连接问题是怎么解决呢?

网络问题一直是Docker的一个痛点,在较早的版本中,单主机的容器使用默认的docker0虚拟网桥进行互连。容器的跨主机连接方法方案也比较多,比如,Host网络模式可以使容器的ip和主机处在同一个网段,这样可以使同一个交换机下的不同主机中的容器实现互连。设置过程需要特别小心,尤其是在远程操作的情况下,稍一个不小心修改出错就会断开与主机的连接,其艰险过程仿佛历历在目。当然还有其他的方法,比如vSwitch、Overlay等等,但是都得需要自己配置,过程说不上复杂,但是还是觉得麻烦。

于是在新版中,Swarm集群模式原生支持overlay网络功能,省去了手动配置的过程,实现了容器到容器(container-to-container)的网络连接。

2.Swarm集群的管理

在集群上部署应用是以服务(service)为单位,一个应用就是一个服务,每个服务可以包含多个任务(task)。

在集群中创建一个服务:

–name:用于给服务命名

–replicas:设置该服务下任务的数量(一个service通常运行多个相同的任务)

“alpine”是镜像的名称,后面的“ping docker”命令用于定义容器运行的任务,视不同服务而定。

可以通过相关的命令查看当前集群中正在运行的服务列表:

Swarm: Docker学习者的“救星”

在这里有个小问题,当时输错了镜像的名称,把alpine输成了alphine,docker engine在docker hub里也没有找到镜像,如果按照创建容器的思路,没有镜像可用,应该马上提示错误,相应的应用不会被创建才是。事实上,应用还是会被创建,只不过是报错的应用。不知道是开发者有意为之,还是忽略了这个问题。

运行的任务数量也可以进行scale,比如将helloworld运行的任务数量从1个增加到5个:

Swarm: Docker学习者的“救星”

这些任务分布在三个节点上运行,因为hostname没有改看起来不是很直观,可以在各自的节点上运行docker ps命令查看并验证。

要删除一个service也非常方便:

Docker的滚动升级机制,非常适合实际业务的升级工作。比如以redis为例,将redis:3.0.6升级到3.0.7。

先创建redis服务:

Swarm: Docker学习者的“救星”

然后使用redis:3.0.7的镜像进行升级操作:

升级过程需要花一定的时间,下面是具体的升级细节:

Swarm: Docker学习者的“救星”

(1)停止第一个任务,并准备好升级;停止的任务进行升级;

Swarm: Docker学习者的“救星”

(2)启动已经升级好任务,返回RUNNING状态,等待一定的时间,然后准备下一个任务升级

Swarm: Docker学习者的“救星”

(3)最后,实现了所有的任务升级。

像这种基于镜像的滚动升级机制,升级过程服务对外而言是一个透明的过程。而且,如果升级有问题,还可以通过update回退到上一个版本。

有些功能需要综合多个服务一起实现,比如数据库加上前端等等。这时候就需要服务发现机制。

在overlay网络模式下,服务发现机制会给每一个服务中的容器分配各自的虚拟ip。在同一个overlay子网中的不同服务,可以根据虚拟ip进行连接访问。

创建一个overlay子网,命名为test-overlay:

在test-overlay子网下创建一个nginx服务:

Swarm: Docker学习者的“救星”

Swarm: Docker学习者的“救星”

在和nginx服务同一网络下增加一个busybox服务:

Swarm: Docker学习者的“救星”

在运行busybox服务的节点上进行服务发现的测试:

Swarm: Docker学习者的“救星”

Swarm: Docker学习者的“救星”

使用nslookup查看my-web服务的虚拟ip和查看my-web服务每一个运行任务容器的虚拟ip。

以上就是docker swarm集群一些简单基本的部署和管理方法。

为什么说Swarm是docker学习者的“救星”呢?这是相对于Google开源docker集群管理工具Kubernetes(简称K8s)搭建而言的。

K8s依靠Google的高大背景,从一出现就获得了广泛的关注,并获得了众多IT公司的支持,被公认为是目前最先进的集群管理工具。但是作为一个初学者而言,其安装过程简直可以用“蓝瘦、香菇”来形容,具体的可以看看以前的公众号文章。

首先是安装包的下载。Google出品,必然会因为某些原因使得获取渠道受阻,无法连接、下载速率慢、连接还老断。都不知道失败了多少次,还是在潘大师代理的帮助下才勉强下完了一个安装包,简直打击学习积极性!

集群的配置过程也比较繁琐,每台机器之间需要设置好无密码ssh登陆,集群中每台主机的功能需要写进配置文件中,修改相关的环境变量等等。

K8s在集群管理上也是非常方便的,就是安装过程太折磨人。从学习角度来讲,Swarm的方式更易于接受和理解。

未经允许不得转载:zoues » Swarm: Docker学习者的“救星”

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址