排出 swarm 中的节点
在教程的早期步骤中,所有节点的可用性都设置为 Active
。swarm 管理器可以将任务分配给任何 Active
节点,因此到目前为止所有节点都可用于接收任务。
有时,例如在计划维护期间,你需要将节点的可用性设置为 Drain
。Drain
可用性会阻止节点接收来自 swarm 管理器的新任务。这也意味着管理器会停止在该节点上运行的任务,并在可用性为 Active
的节点上启动副本任务。
重要提示
将节点设置为
Drain
不会移除该节点上的独立容器,例如使用docker run
、docker compose up
或 Docker Engine API 创建的容器。节点的状体,包括Drain
,仅影响节点调度 swarm 服务工作负载的能力。
如果你还没有这样做,请打开终端并通过 ssh 连接到运行管理器节点的机器。例如,本教程使用名为
manager1
的机器。验证所有节点都处于活动可用状态。
$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 1bcef6utixb0l0ca7gxuivsj0 worker2 Ready Active 38ciaotwjuritcdtn9npbnkuz worker1 Ready Active e216jshn25ckzbvmwlnh5jr3g * manager1 Ready Active Leader
如果你还没有运行滚动更新教程中的
redis
服务,请立即启动它$ docker service create --replicas 3 --name redis --update-delay 10s redis:7.4.0 c5uo6kdmzpon37mgj9mwglcfw
运行
docker service ps redis
查看 swarm 管理器如何将任务分配给不同的节点$ docker service ps redis NAME IMAGE NODE DESIRED STATE CURRENT STATE redis.1.7q92v0nr1hcgts2amcjyqg3pq redis:7.4.0 manager1 Running Running 26 seconds redis.2.7h2l8h3q3wqy5f66hlv9ddmi6 redis:7.4.0 worker1 Running Running 26 seconds redis.3.9bg7cezvedmkgg6c8yzvbhwsd redis:7.4.0 worker2 Running Running 26 seconds
在这种情况下,swarm 管理器将一个任务分配给了每个节点。你环境中的任务分配方式可能不同。
运行
docker node update --availability drain <NODE-ID>
来排出已分配任务的节点$ docker node update --availability drain worker1 worker1
检查节点以查看其可用性
$ docker node inspect --pretty worker1 ID: 38ciaotwjuritcdtn9npbnkuz Hostname: worker1 Status: State: Ready Availability: Drain ...snip...
排出的节点在
Availability
字段显示Drain
。运行
docker service ps redis
查看 swarm 管理器如何更新redis
服务的任务分配$ docker service ps redis NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR redis.1.7q92v0nr1hcgts2amcjyqg3pq redis:7.4.0 manager1 Running Running 4 minutes redis.2.b4hovzed7id8irg1to42egue8 redis:7.4.0 worker2 Running Running About a minute \_ redis.2.7h2l8h3q3wqy5f66hlv9ddmi6 redis:7.4.0 worker1 Shutdown Shutdown 2 minutes ago redis.3.9bg7cezvedmkgg6c8yzvbhwsd redis:7.4.0 worker2 Running Running 4 minutes
swarm 管理器通过终止可用性为
Drain
的节点上的任务,并在可用性为Active
的节点上创建新任务来维持期望状态。运行
docker node update --availability active <NODE-ID>
将排出的节点恢复到活动状态$ docker node update --availability active worker1 worker1
检查节点以查看更新后的状态
$ docker node inspect --pretty worker1 ID: 38ciaotwjuritcdtn9npbnkuz Hostname: worker1 Status: State: Ready Availability: Active ...snip...
将节点设置回
Active
可用性后,它可以接收新任务- 在服务更新以进行扩容期间
- 在滚动更新期间
- 当你将另一个节点设置为
Drain
可用性时 - 当任务在另一个活动节点上失败时
下一步
接下来,你将学习如何使用 Swarm 模式路由网格