在 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
` 来移除已分配任务的节点。 $ docker node update --availability drain worker1 worker1
检查节点以检查其可用性。
$ docker node inspect --pretty worker1 ID: 38ciaotwjuritcdtn9npbnkuz Hostname: worker1 Status: State: Ready Availability: Drain ...snip...
已移除的节点显示 `Drain` 作为 `Availability`。
运行 `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
` 将已移除的节点恢复到活动状态。 $ 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 模式路由网格。