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/
- 环境要求:内核:3.10以下,或者安装docker machine(如windows机器,或者mac);docker版本:12.0以上才支持二代。
- 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.
- 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 worker和docker 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,转载请注明来源!