Swarm资源管理
Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。
Swarm的基本架构如下图所示
这个图作为一个整体实际上都处于一个所谓的集群中,它可能对应了一到多台的实际服务器。每台服务器上都装有Docker并且开启了基于HTTP的DockerAPI。这个集群中有一个SwarmManager的管理者,用来管理集群中的容器资源。管理者的管理对象不是服务器层面而是集群层面的,也就是说通过Manager,我们只能笼统地向集群发出指令而不能具体到某台具体的服务器上要干什么(这也是Swarm的根本所在)。至于具体的管理实现方式,Manager向外暴露了一个HTTP接口,外部用户通过这个HTTP接口来实现对集群的管理。对于稍微大一点的集群,最好是拿出一台实际的服务器作为专门的管理者,作为学习而言,也可以把管理者和被管理者放在一台服务器上。
构建swarm集群和节点
启动一个swarm集群
docker swarm init --listen-addr 172.16.218.146:8888 --advertise-addr 172.16.218.146
- –listen-addr指出的是这个集群暴露给外界调用的HTTPAPI的socket地址。
- –advertise-addr如果你的Docker主机有多个网上,拥有多个IP,必须使用—advertise-addr指定IP。
命令执行成功会提示一串类似于这样的信息
docker swarm join --token SWMTKN-1-4exqiy0mat3d1sy7yff3cdqr1h8huz88tng253bj7id3tttlfk-e5dns1ykhe74pllubpvy4vrv6 172.16.218.146:8888
为方便下面称管理者角色的机器为Master,另两台为Node1、Node2。
在Node1,Node2执行了上面这个命令后,在Master上执行命令docker node ls
列出Docker节点信息
[root@k8s-master ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
qs3re8fwfadofgamifcm1w1dt * k8s-master Ready Active Leader 18.06.3-ce
tsrjx3bxnykmi41vddwkcl4vf k8s-node1 Ready Active 18.06.3-ce
gzfsco0lufbf7bvpiikfu8wvd k8s-node2 Ready Active 18.06.3-ce
构建服务
docker service create --replicas 1 --name swarmTomcat consol/tomcat-7.0:latest
- docker service create创建服务
- –replicas参数指出希望保持这个服务始终有多少容器在运行
- –name参数指定的是服务的名字而非容器的名字
查看swarmTomcat这个service的各个容器到底在哪个节点运行且运行状态如何。
[root@k8s-master ~]# docker service ps swarmTomcat
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vlwlvfp35lny swarmTomcat.1 consol/tomcat-7.0:latest k8s-master Running Running 25 seconds ago
容器扩展
[root@k8s-master ~]# docker service scale swarmTomcat=3
swarmTomcat scaled to 3
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
docker service scale swarmTomcat=3,可以将服务现有的replica为1的状态扩展到3,期间已经启动的容器不受影响。
此时再查看swarmTomcat这个服务的节点信息及状态
[root@k8s-master ~]# docker service ps swarmTomcat
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vlwlvfp35lny swarmTomcat.1 consol/tomcat-7.0:latest k8s-master Running Running 38 minutes ago
kpf4vo0h7ff0 swarmTomcat.2 consol/tomcat-7.0:latest k8s-node2 Running Running 2 minutes ago
i4nwm9bvpnjt swarmTomcat.3 consol/tomcat-7.0:latest k8s-node1 Running Running 25 minutes ago
节点管理
之前的演示中,三个节点始终都保持着Active的可用性。Swarm管理器会自动根据算法将任务(启停容器等)分配给Active的节点。
除了Active,其它常见的可用性状态还有Drain,处于Drain的节点不会被分配新任务,而且当前运行的容器也会被停止,swarm管理器则会在其它节点上创建这些任务。
运行命令
docker node update --availability drain k8s-node2
演示
[root@k8s-master ~]# docker node update --availability drain k8s-node2
k8s-node2
[root@k8s-master ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
qs3re8fwfadofgamifcm1w1dt * k8s-master Ready Active Leader 18.06.3-ce
tsrjx3bxnykmi41vddwkcl4vf k8s-node1 Ready Active 18.06.3-ce
gzfsco0lufbf7bvpiikfu8wvd k8s-node2 Ready Drain 18.06.3-ce
[root@k8s-master ~]# docker service ps swarmTomcat
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vlwlvfp35lny swarmTomcat.1 consol/tomcat-7.0:latest k8s-master Running Running about an hour ago
rv2y10e9x8xy swarmTomcat.2 consol/tomcat-7.0:latest k8s-master Running Running 3 seconds ago
kpf4vo0h7ff0 \_ swarmTomcat.2 consol/tomcat-7.0:latest k8s-node2 Shutdown Shutdown 19 seconds ago
i4nwm9bvpnjt swarmTomcat.3 consol/tomcat-7.0:latest k8s-node1 Running Running 39 minutes ago
由于k8s-node2不再接受 任务并关停了现有任务,所以swarmTomcat.2这个容器被转移到k8s-master节点上。
如果再次将k8s-node2的可用性更改为active,那么k8s-node2节点就可以再次获取任务了,PS:刚才被转移到k8s-master上的任务是不传再转回来的,所以k8s-node2的任务只有在接下来的分配中获得。
最后,一个处于Active状态的节点可能收到新的任务,当服务规模扩大时,滚动更新时,其它节点被设置为Darin而本节点需要担当时,其它节点上的任务启动失败时。
docker node update --availability active k8s-node2