首页 » docker » docker swarm mode

docker swarm mode

 
文章目录

docker swarm mode

docker swarm mode安装

一代 Swarm 是 Docker 团队最早的集群编排的尝试,以容器形式运行,需要外置键值库(如 etcd, consul, zookeeper),需要手动配置 overlay 网络。其配置比 kubernetes 要简单,但是相比后面的第二代来说还是稍显复杂。
二代 Swarm,既 Docker Swarm Mode,是自 1.12 之后引入的原生的 Docker 集群编排机制。吸取一代 Swarm 的问题,大幅改变了架构,并且大大简化了集群构建。内置了分布式数据库,不在需要配置外置键值库;内置了内核级负载均衡;内置了边界负载均衡。

安装参考: https://docs.docker.com/engine/swarm/

  1. 环境要求:内核:3.10以下,或者安装docker machine(如windows机器,或者mac);docker版本:12.0以上才支持二代。
  2. docker swarm init –advertise-addr <MANAGER-IP>这个命令会生成一个token,这就相当于创建了一个集群,非常简单。
docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.

To add a worker to this swarm, run the following command:
    docker swarm join \
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
  1. worker node加入到集群:docker swarm join –token 上面生成的token放这,managerIP:2377
$ docker swarm join \
  --token  SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
  192.168.99.100:2377
This node joined a swarm as a worker.

增加worker和manager节点

在管理节点运行 docker swarm join-token workerdocker swarm join-token manager 会弹出增加节点和增加管理节点的命令,也不需要记token是多少,因为这个命令会弹出来。增加work和manager的命令是一样的,只是token不同一般高可用的话,防止管理节点坏了,我们可以增加管理节点数量,一般的管理节点数据是奇数,由于使用的是raft算法导致的,官方建议一般3个管理节点,最多是7个管理节点,在太也会影响性能,3个可以允许一个管理节点坏了,不影响整体使用,(允许坏的数量是这样算的:(manager-1)/2),管理节点也是可以运行service的啊。

增加worker命令
[root@7-node2 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-5bezllj5ixnfji147kqjbn9ywz4wdx7e6ry24zvz0c0fqz0du4-9jxfkyggysu02hrhwcx7cx7pk \
    192.168.7.221:2377

[root@7-node2 ~]#
增加manager命令
[root@7-node2 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-5bezllj5ixnfji147kqjbn9ywz4wdx7e6ry24zvz0c0fqz0du4-1wmfe25hnaafg93107tuk70wv \
    192.168.7.221:2377

[root@7-node2 ~]#

相关命令操作

部署一个服务(deploy a service)

假设启动3个nginx服务,并对外商 docker service create –replicas 3 –name nginx -p 80:80 nginx

[root@7-node2 ~]# docker service create --replicas 3 --name nginx nginx
c00fgdrikol62g70g5bswij4r
[root@7-node2 ~]# docker service ps nginx
ID                         NAME     IMAGE  NODE     DESIRED STATE  CURRENT STATE             ERROR
ainep29koha1lzi0ai3dbsy7y  nginx.1  nginx  7-node3  Running        Running 1 seconds ago     
21l9v24c19gcbhmqwvbkzwhbv  nginx.2  nginx  7-node4  Running        Preparing 10 seconds ago  
8tviri02ctp0hsaetpwz56i0g  nginx.3  nginx  7-node2  Running        Preparing 10 seconds ago  
[root@7-node2 ~]#

查询节点信息:docker node ls

[root@7-node2 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
4bzuwmumida3uf0kehyfaac1m    7-node3   Ready   Active        
53v0vmw94s6p3i685i88e9hnp *  7-node2   Ready   Active        Leader
dbvqviiyikmyk5e4op84q6afu    7-node4   Ready   Active        
[root@7-node2 ~]#

查看一个服务的详细信息:docer service inspect

[root@7-node2 ~]# docker service inspect --pretty nginx
ID:		c00fgdrikol62g70g5bswij4r
Name:		nginx
Mode:		Replicated
 Replicas:	3
Placement:
UpdateConfig:
 Parallelism:	1
 On failure:	pause
ContainerSpec:
 Image:		nginx
Resources:
[root@7-node2 ~]#

以上是优雅显示,如果需要更多的详细信息,它是以json格式显示的,命令是把上面的–pretty去掉就可以了:docker service inspect service-name

对一个服务扩容或缩容、状态、删除、升级、停止

扩容

docker service scale <service-id/service-name>=<number-of-tasks>
扩容一般都没有问题,但我发现把服务数量减少的时候,管理节点并没有把工作节点上的服务删除掉,只是stop了,但在增加的时候,它又不会使用刚才停止的服务,而是又重启了,这测试是这样的,所以可能还要手动去删除,或者写一个脚本去删除。

查看服务的运行状态及哪个节点命令

docker service ps <service-name>

[root@7-node2 ~]# docker service ps nginx
ID                         NAME     IMAGE  NODE     DESIRED STATE  CURRENT STATE           ERROR
ainep29koha1lzi0ai3dbsy7y  nginx.1  nginx  7-node3  Running        Running 11 minutes ago  
21l9v24c19gcbhmqwvbkzwhbv  nginx.2  nginx  7-node4  Running        Running 11 minutes ago  
8tviri02ctp0hsaetpwz56i0g  nginx.3  nginx  7-node2  Running        Running 11 minutes ago  
[root@7-node2 ~]#
删除服务

docker service rm <service-name/service-id>

升级服务版本

docker service update –image nginx:1.11 nginx 假设原来的nginx镜像版本是1.10,现在是把它升级到1.11。
升级的时候会有以下swarm会有以下操作:
1. 停掉其中一个任务
2. 升级这个任务镜像
3. 启动这个任务
4. 接着按上面步骤升级下一个任务
5. 如果升级失败,则会停止升级

停止或启动使用一个工作节点

停止一个节点暂时不使用,假设这个节点有问题,或者要维护的时候,这时我们可以暂时分享这个节点,这个分离的节点上的任务会分配到其他的节点上运行
docker node update –availability drain <node-id/node-hostname>

[root@7-node2 ~]# docker node update --availability drain 7-node3
7-node3
[root@7-node2 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
4bzuwmumida3uf0kehyfaac1m    7-node3   Ready   Drain         
53v0vmw94s6p3i685i88e9hnp *  7-node2   Ready   Active        Leader
dbvqviiyikmyk5e4op84q6afu    7-node4   Ready   Active        
[root@7-node2 ~]# docker service ps nginx
ID                         NAME         IMAGE  NODE     DESIRED STATE  CURRENT STATE            ERROR
2097iuxnclw1gks06adcb20n0  nginx.1      nginx  7-node2  Running        Running 12 seconds ago   
ainep29koha1lzi0ai3dbsy7y   \_ nginx.1  nginx  7-node3  Shutdown       Shutdown 26 seconds ago  
21l9v24c19gcbhmqwvbkzwhbv  nginx.2      nginx  7-node4  Running        Running 40 minutes ago   
8tviri02ctp0hsaetpwz56i0g  nginx.3      nginx  7-node2  Running        Running 40 minutes ago   
[root@7-node2 ~]#

把分离的节点激活,让其在使用,实践发现,激活之后,之前的服务没有回来,还是在其他节点上运行,估计这个还是与它内部调度有关
docker node update –availability active <node-ID/node-hostname>

[root@7-node2 ~]# docker node update --availability active 7-node3
7-node3
[root@7-node2 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
4bzuwmumida3uf0kehyfaac1m    7-node3   Ready   Active        
53v0vmw94s6p3i685i88e9hnp *  7-node2   Ready   Active        Leader
dbvqviiyikmyk5e4op84q6afu    7-node4   Ready   Active        
[root@7-node2 ~]# docker service ps nginx
ID                         NAME         IMAGE  NODE     DESIRED STATE  CURRENT STATE           ERROR
2097iuxnclw1gks06adcb20n0  nginx.1      nginx  7-node2  Running        Running 6 minutes ago   
ainep29koha1lzi0ai3dbsy7y   \_ nginx.1  nginx  7-node3  Shutdown       Shutdown 6 minutes ago  
21l9v24c19gcbhmqwvbkzwhbv  nginx.2      nginx  7-node4  Running        Running 46 minutes ago  
8tviri02ctp0hsaetpwz56i0g  nginx.3      nginx  7-node2  Running        Running 46 minutes ago  
[root@7-node2 ~]#

node管理

参考:https://docs.docker.com/engine/swarm/manage-nodes

docker node ls 显示节点信息

这个命令是需要在manager上执行的,在worker node上执行不了。

[root@7-node2 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
4bzuwmumida3uf0kehyfaac1m    7-node3   Ready   Active        
53v0vmw94s6p3i685i88e9hnp *  7-node2   Ready   Active        Leader
dbvqviiyikmyk5e4op84q6afu    7-node4   Ready   Active        
[root@7-node2 ~]#

Availability状态说明:
1. Active:说明节点为是活的,可以分配任务给它。
2. Pause:说明不能分配新的任务给它,但旧的任务还在运行。
3. Drain:不能分配新任务给它,关闭已经在运行的服务,并把这个服务分配给其他可通知的节点。

Manager栏说明:
1. no value:说明是一个工作节点
2. Leader:说明是primary manager,会调度其他的管理节点
3. Reachable:节点是管理节点,参与Raft算法调度,如果Leader 变成了Unavailable,该节点有机会成为primary manager。
4. Unavailable:节点是管理节点,但通信不可达,如果有这样的节点,你需要指定一个新的worker变成manager节点。

docker node update 改变节点状态

上面一节说了Availablity的三种状态,我们可以先手更改各个节点的状态及恢复。
docker node update –availability drain node-1

root@7-node2 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
4bzuwmumida3uf0kehyfaac1m    7-node3   Ready   Active        
53v0vmw94s6p3i685i88e9hnp *  7-node2   Ready   Active        Leader
dbvqviiyikmyk5e4op84q6afu    7-node4   Ready   Active        
[root@7-node2 ~]# docker node update --availability drain 7-node4
7-node4
[root@7-node2 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
4bzuwmumida3uf0kehyfaac1m    7-node3   Ready   Active        
53v0vmw94s6p3i685i88e9hnp *  7-node2   Ready   Active        Leader
dbvqviiyikmyk5e4op84q6afu    7-node4   Ready   Drain         
[root@7-node2 ~]#
恢复
[root@7-node2 ~]# docker node update --availability active 7-node4
7-node4
[root@7-node2 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
4bzuwmumida3uf0kehyfaac1m    7-node3   Ready   Active        
53v0vmw94s6p3i685i88e9hnp *  7-node2   Ready   Active        Leader
dbvqviiyikmyk5e4op84q6afu    7-node4   Ready   Active        
[root@7-node2 ~]#

升级或降级一个节点 promote or demote a node

可以升级一个worker node 成为一个manager node,也可以把manager node 降为worker node。也就是成为manager节点有两种方法,一种是通过docker swarm join –token 来添加,第二种就是升级或降级来处理
命令:docker node promote/demote <node-hostname/host-ip>

[root@7-node2 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
4bzuwmumida3uf0kehyfaac1m    7-node3   Ready   Active        
53v0vmw94s6p3i685i88e9hnp *  7-node2   Ready   Active        Leader
dbvqviiyikmyk5e4op84q6afu    7-node4   Ready   Active        
[root@7-node2 ~]# docker node promote 7-node3 7-node4
Node 7-node3 promoted to a manager in the swarm.
Node 7-node4 promoted to a manager in the swarm.
[root@7-node2 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
4bzuwmumida3uf0kehyfaac1m    7-node3   Ready   Active        Reachable
53v0vmw94s6p3i685i88e9hnp *  7-node2   Ready   Active        Leader
dbvqviiyikmyk5e4op84q6afu    7-node4   Ready   Active        Reachable
[root@7-node2 ~]# docker node demote 7-node3 7-node4
Manager 7-node3 demoted in the swarm.
Manager 7-node4 demoted in the swarm.
[root@7-node2 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
4bzuwmumida3uf0kehyfaac1m    7-node3   Ready   Active        
53v0vmw94s6p3i685i88e9hnp *  7-node2   Ready   Active        Leader
dbvqviiyikmyk5e4op84q6afu    7-node4   Ready   Active        
[root@7-node2 ~]#

节点移出集群 leave the swarm

这个命令是在需要移出的节点上执行:docker swarm leave

[root@7-node4 ~]# docker swarm leave
Node left the swarm.
[root@7-node4 ~]#

在管理节点看状态,就可以看到是down的状态

[root@7-node2 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
4bzuwmumida3uf0kehyfaac1m    7-node3   Ready   Active        
53v0vmw94s6p3i685i88e9hnp *  7-node2   Ready   Active        Leader
dbvqviiyikmyk5e4op84q6afu    7-node4   Down    Active        
[root@7-node2 ~]#

要完全全移除node list,需要在管理节点执行:
docker node rm <hostname/ip>

[root@7-node2 ~]# docker node rm 7-node4
7-node4
[root@7-node2 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
4bzuwmumida3uf0kehyfaac1m    7-node3   Ready   Active        
53v0vmw94s6p3i685i88e9hnp *  7-node2   Ready   Active        Leader
[root@7-node2 ~]#

 

原文链接:docker swarm mode,转载请注明来源!

1