细说docker系列之集群swarm上篇

从本篇正式开始,我们将接触docker的高级部分,也就是docker的集群,那么关于docker的集群方案也有很多, 我知道的有 kubernetes(k8s)、Mesos、swarm, 其中k8s是谷歌开发一款集群管理工具,现在公司一般都要求会k8s,所以在集群的方案中占有比较重要的地位,Mesos是apache下开源的一款工具,Swarm是docker官方提供的一种集群解决方案, 那本文中主要就是讨论和学习Swarm,其它两种不在今天的讨论范围,会在以后陆续介绍,集群属于docker的高级部分,建议读者熟悉docker的基础部分,这样在学习集群方面会事半功倍,如果不太了解,可以看我写的docker基础部分, 好了,话不多说,上干货 ^_^

一、学习目标

  • 了解swarm的特性以及架构等

  • swarm集群的管理

  • swarm服务的管理

二、swarm的理论部分

2.1、swarm介绍

swarm在docker1.12版本之后就内置了swarm,所以集群不需要安装(本篇不介绍1.12之前的版本,建议使用1.13或者更高的版本,我用的是1.13),所以docker的集群相对来说比较简单,只要通过docker提供的命令行工具就可以创建集群

2.2、为什么用集群

集群就相当于一群人去干一件事, 那效率上是不是要比一个干活快呢,答案是不一定的,因为一个人干活,只要专心致志的干就行了,而一群人干一件事的时候如果没有任何的规则和管理就相当于一盘散沙,只有按着统一的规则和制度才能把一群人的力量发挥到最大,所以集群就是一群人按着一定的规则和制度,更能够有条不紊的、以及良好的管理来完成任务,这就是集群,所以总结成一句话,团结就是力量。

2.3、swarm特性

  • 创建集群简单, 可以通过docker-cli工具直接创建一个集群,不需要额外的配置,只用一条命令搞定

  • 管理集群方便, swarm集群中包含两种角色 manager 和 worker, 我们把这种角色都称为node, 可以往集群中添加任意类型的node。在集群运行其间,我们可以随时对集群做出改变, 比如添加一个新的节点或者删除一个节点,而且不需要集群重启

  • 灵活的服务, 集群是基石, 有了集群我们可以用在很多地方, 比如我想用web服务、db等, 那我们就可以在集群中创建很多服务,比如说创建web服务

  • 服务扩容缩容, 一个服务可以由N多任务去运行, 而任务其实就是docker容器, 对于一个服务我们可以指定由多少个容器去运行它,可以很方便的指定容器

  • 负载均衡 , swarm本身是有负载均衡的功能, 通过暴露服务的端口,外部可以访问集群里的内容

2.4、架构

  • manager node (管理节点)

manager node 是负责管理集群和编排容器的, 所有的管理命令都从manager节点发出,比如说想要查看集群中的节点、增加节点、删减节点操作等, 相当于现实生活中的领导的角色, 但是也同时担任工作者的角色,相当于又是领导,还得干活(领导比较悲惨,哈哈),这里有一个问题,就是万一领导挂了怎么办,领导挂了这个集群也就运转不了, 不用担心,swarm也充份考虑了这种情况 , 一般来说,领导分为大领导和副领导,如果大领导挂了, 那就从一堆副领导选举一个大领导继续领导大家, 那swarm也是如此

  • worker node (工作节点)

worker节点负责接收manager的指令, 并指定task,启动一个docker容器来执行, 相当于现实生活中干活的,只接收领导的命令去完成任务,但是可能一个人要干很多活,如果干的好,还可以将它提升为副领导,在swarm中,我们指定某个worker节点升为manager节点

  • 服务

服务是运行在集群上的,我们可以在集群中创建很多服务,每个服务可以有N多任务, 具体的执行都是通过任务来执行的

  • 任务

任务才是实际干活的, 每个服务包括N多任务, 任务其实就是docker上的实例,我们可以在N个节点的集群创建运行N个任务的服务

三、集群实战

3.1、准备工作

  • 准备四台机器,可以是虚拟机、云主机、以及docker-machine的机器 ,我的是四台虚拟机

  • 要求4台机器安装docker, 我安装的版本是1.13.1, 另外我服务器操作系统是Centos 7 64位

  • 关闭防火墙或者设置防火墙,需要开放的端口是 2377、4789、7946

  • 要求4台主机能够互相通信

3.2、规划集群,这是我下面实验涉及的服务器

IP主机名角色
192.168.171.129mastermanager
192.168.171.130node1worker
192.168.171.131node2worker
192.168.171.132node3worke

在对应的主机上执行相应的命令

hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3

配置hosts文件

vi /etc/hosts

192.168.171.129  master
192.168.171.130 node1
192.168.171.131 node2
193.168.171.131 node3

3.3、创建集群

创建集群的顺序是先创建一个manager节点, 在增加worker节点, 那怎么才能创建一个manager节点呢, 就是执行下面的命令,注意,这条命令在哪台机器上执行,那台机器就会成为manager节点,我的是在129机器上

docker swarm init --advertise-addr 192.168.171.129:2377

-advertise-addr 集群的广告地址,用来通过此地址加入集群 格式:< ip |interface >[:port]


结果如下:

[root@master ~]  docker swarm init --advertise-addr 192.168.171.129:2377
Swarm initialized: current node (rcy7jmw16ogqzpayinyk20fbe) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-604e53f4ne7azzt2gpda65uhmtjeqxv01bf5nuy1o06henwgnh-b5wiqeqdwuu10uitxvzqgjs8t \
    192.168.171.129:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
  • swarm在创建完manager节点之后已经给出了怎么添加worker节点和manager节点的添加方法,只要将上面的命令执行就可以添加worker节点了,

3.4  查看集群的node节点, 如果你的执行结果中出列了master节点,就说明集群已经创建好了,下一步就开始添加worker节点了

docker node ls 

[root@master ~]# docker node lsID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
rcy7jmw16ogqzpayinyk20fbe *  master    Ready   Active        Leader

3.5、添加worker节点

复制上面的添加命令在每个worker节点执行就可以了,是不是非常简单, 其实添加的是manager节点还是worker节点是根据 --token来判定的

docker swarm join \
    --token SWMTKN-1-604e53f4ne7azzt2gpda65uhmtjeqxv01bf5nuy1o06henwgnh-b5wiqeqdwuu10uitxvzqgjs8t \
    192.168.171.129:2377

[root@node1 ~] docker swarm join \
>     --token SWMTKN-1-604e53f4ne7azzt2gpda65uhmtjeqxv01bf5nuy1o06henwgnh-b5wiqeqdwuu10uitxvzqgjs8t \
>     192.168.171.129:2377
This node joined a swarm as a worker.


3.6、到这一步说明,worker节点已经添加好了,我们在去master主机上查看下node

[root@master ~] docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
2xxv0hrs5ptenq8qeded8xyo0    node1     Ready   Active        
k0ig9i6n6674t2s6203yi24um    node3     Ready   Active        
nc69fnaf4rdu1fhscogztru5w    node2     Ready   Active        
rcy7jmw16ogqzpayinyk20fbe *  master    Ready   Active        Leader

3.7、查看添加manager和worker节点的命令

刚才在创建集群的时候,结果会返回添加worker和manager节点的命令, 如果仔细观察的话, 那如果这个终端关闭了或者不见了,我怎么才能找到添加的命令呢,可以利用下面的命令来查看,命令都要在master主机上执行

#查看添加manager的命令
docker swarm join-token manager
#查看添加worker的命令
docker swarm join-token worker

3.8、将节点升级和降级的操作命令

前面已经介绍过了,manager节点可以降级为worker节点(如果当前只剩下一个manager节点, 就不能在降了), workder节点可以升为manager节点

将node3提升为manager节点, 如下图所示
docker node promote node3  
在将node3降到woker节点
docker node demote node3

3.9、查看集群节点的角色

docker info

四、服务

集群我们已经搭建起来了, 我们还需要具体的服务来实现我们的业务 ,我们现在有一个4个节点的集群,现在我要在4个节点的集群中部署一个运行4个任务或者更多任务的nginx服务, 任务是集群中最小的执行单元, 其实任务也就是docker的实例

4.1、用nginx的镜像创建一个web的服务

docker service create --replicas 1 --name web --publish 80:80 --mount type=bind,src=/opt/test,dst=/usr/share/nginx/html  nginx
  • --replicas 任务数量, 我们现在有4个节点的集群, 在这4个节点的集群中部署一个运行4个nginx的服务

  • --name 服务的名称

  • --publish 该服务对外暴露的接口

  • --mount 将容器里的目录映射到宿主机上, 在我们所有的节点上必须要有/opt/test目录, 这是我绑定到容器的目录

  • nginx 镜像的名称

  • 在4个节点上分别在/opt/test目录创建index.html文件,每个节点的index.html文件写上不同的内容,分别用不同节点ip访问

4.2、查看服务

docker service ls
ID            NAME  MODE        REPLICAS  IMAGE
uag378i9vl26  web   replicated  1/1       nginx:latest
  • ID列 是服务的唯一id

  • name 是服务的名称

  • mode 是服务的模式

  • REPLICALS 运行的容器数量/总共的容器数量

  • IMAGE 镜像

4.3、查看服务的详情

[root@master ~] docker service ps web
ID            NAME   IMAGE         NODE   DESIRED STATE  CURRENT STATE          ERROR  PORTS
wqma31kre3lj  web.1  nginx:latest  node1  Running        Running 5 minutes ago

4.4、扩大集群中的副本,也就是说增加docker实例

docker service scale web=4

在翻译下, 本来nginx是在一个节点中的容器上执行的, 那现在我们起4个容器分别随机分配到其它的节点上执行,其实也就是说一个nginx服务被分配到了4个不同节点中的4个容器, 当然我们还可以起更多的实例, 在4台节点上可以增加很多的容器,总之节点就这么多, 容器你可以分配很多很多, 如下所示

[root@master ~] docker service ps web
ID            NAME   IMAGE         NODE    DESIRED STATE  CURRENT STATE           ERROR  PORTS
wqma31kre3lj  web.1  nginx:latest  node1   Running        Running 15 minutes ago         
watcwp577uk1  web.2  nginx:latest  node2   Running        Running 10 seconds ago         
qwhja2fuyl1u  web.3  nginx:latest  master  Running        Running 12 seconds ago         
scvuakdy6lux  web.4  nginx:latest  node3   Running        Running 3 seconds ago

4.5、测试集群

现在可以用集群中的任意节点上执行 curl 127.0.0.1 , 可以发现每次执行的结果都被分配到了不同节点上的容器上, 说明swarm本身有负载均衡功能,如下图所示

4.6、删除服务

docker service rm  web

五、总结

通过本篇的学习,我们了解了swarm的基础学习, 比如说创建集群、管理集群、创建服务、管理服务等等,swarm也具有负载均衡的功能, 那么在实际生产中会怎么应用swarm吗, 请听下回分解 ^_^


上一篇:细说docker第三篇

下一篇:没有了

相关推荐

  • 细说docker系列之集群swarm上篇

    从本篇正式开始,我们将接触docker的高级部分,也就是docker的集群,那么关于docker的集群方案也有很多, 我知道的有 kubernetes(k8s)...

    Border circle luohua 2020-07-19 15:51:45 0 0 31

  • 细说docker第三篇

    本篇来介绍docker的数据卷和网络相关

    Border circle luohua 2020-07-19 15:33:13 0 0 14

发表评论