第一台执行:
$ docker swarm init
Swarm initialized: current node (qgowushrnwa87hul908vicsph) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5kk5jzz8rnjh0wctnsdm19yuvnvayw6eik9k3udyg4pupkklbx-0opd5tey2uxdplbzibg9uw104 172.17.0.14:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
在第二台主机上执行下面的命令,将它作为一个worker添加到集群中。
token=$(ssh -o StrictHostKeyChecking=no 172.17.0.14 "docker swarm join-token -q worker") && docker swarm join 172.17.0.14:2377 --token $token
首先在两个集群模式节点上部署一个带有两个副本的HTTP服务器。部署将导致在每个节点上部署一个容器。
$ docker service create --name lbapp1 --replicas 2 -p 80:80 katacoda/docker-http-server
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ud5scjjdmsu2 lbapp1 replicated 2/2 katacoda/docker-http-server:latest *:80->80/tcp
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d584747866f1 katacoda/docker-http-server:latest "/app" 45
当需要维护时,正确管理流程以确保可靠性是很重要的。第一个操作是从负载平衡器中删除节点,并让所有活动会话都完成。这将确保没有请求被发送到主机。其次,需要重新部署系统上的工作负载,以确保容量得到维护。
Docker Swarm将在设置节点的可用性时为你管理这一点,设置可用性需要知道集群模式的IP。
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
qgowushrnwa87hul908vicsph * host01 Ready Active Leader 19.03.13
ksjozt8473y0vwpvsg2uxxyue host02 Ready Active 19.03.13
$ worker=$(docker node ls | grep -v "Leader" | awk '{print $1}' | tail -n1); echo $worker
ksjozt8473y0vwpvsg2uxxyue
通过更新节点来设置可用性
$ docker node update $worker --availability=drain
ksjozt8473y0vwpvsg2uxxyue
容器现在应该都运行在单个管理器节点上。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
342a28429e8c katacoda/docker-http-server:latest "/app" 33 seconds ago Up 27 seconds 80/tcp lbapp1.2.c1rpw4q1lnohsdi12eclvzn9f
d584747866f1 katacoda/docker-http-server:latest "/app" 7 minutes ago Up 7 minutes 80/tcp lbapp1.1.qevzgg0osytfsp0l6jfqryrq1
当查看所有节点时,可用性将发生变化
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
qgowushrnwa87hul908vicsph * host01 Ready Active Leader 19.03.13
ksjozt8473y0vwpvsg2uxxyue host02 Ready Drain 19.03.13
一旦完成了工作,节点应该可以用于未来的工作负载。这是通过设置可用性为活动。
$ docker node update $worker --availability=active
ksjozt8473y0vwpvsg2uxxyue
现在可用性又变回来了
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
qgowushrnwa87hul908vicsph * host01 Ready Active Leader 19.03.13
ksjozt8473y0vwpvsg2uxxyue host02 Ready Active 19.03.13
值得注意的是,Docker不会重新安排现有的工作负载。查看这些容器,您将看到它们仍然运行在单个主机上。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
342a28429e8c katacoda/docker-http-server:latest "/app" 2 minutes ago Up 2 minutes 80/tcp lbapp1.2.c1rpw4q1lnohsdi12eclvzn9f
d584747866f1 katacoda/docker-http-server:latest "/app" 10 minutes ago Up 9 minutes 80/tcp lbapp1.1.qevzgg0osytfsp0l6jfqryrq1
相反,Swarm只会将新的工作负载安排到新可用的主机上。这可以通过扩展所需的副本数量进行测试。
$ docker service scale lbapp1=3
lbapp1 scaled to 3
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
新容器将被调度到第二个节点。
参考: