管理 Swarm 中的节点

作为 Swarm 管理生命周期的一部分,你可能需要:

列出节点

要查看 Swarm 中的节点列表,请在 manager 节点上运行 docker node ls

$ docker node ls

ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
46aqrk4e473hjbt745z53cr3t    node-5    Ready   Active        Reachable
61pi3d91s0w3b90ijw3deeb2q    node-4    Ready   Active        Reachable
a5b2m3oghd48m8eu391pefq5u    node-3    Ready   Active
e7p8btxeu3ioshyuj6lxiv6g0    node-2    Ready   Active
ehkv3bcimagdese79dn78otj5 *  node-1    Ready   Active        Leader

AVAILABILITY 列显示调度程序是否可以将任务分配给该节点

  • Active 意味着调度程序可以将任务分配给该节点。
  • Pause 意味着调度程序不会将新任务分配给该节点,但现有任务将继续运行。
  • Drain 意味着调度程序不会将新任务分配给该节点。调度程序会关闭所有现有任务并将其安排到可用节点上。

MANAGER STATUS 列显示节点在 Raft 共识中的参与情况

  • 没有值表示不参与 Swarm 管理的 worker 节点。
  • Leader 意味着该节点是主要的 manager 节点,负责 Swarm 的所有 Swarm 管理和编排决策。
  • Reachable 意味着该节点是参与 Raft 共识仲裁的 manager 节点。如果 leader 节点变得不可用,该节点有资格被选举为新的 leader。
  • Unavailable 意味着该节点是无法与其他 manager 通信的 manager。如果一个 manager 节点变得不可用,你应该将一个新的 manager 节点加入到 Swarm 中,或者将一个 worker 节点提升为 manager。

有关 Swarm 管理的更多信息,请参阅 Swarm 管理指南

检查单个节点

你可以在 manager 节点上运行 docker node inspect <NODE-ID> 来查看单个节点的详细信息。输出默认为 JSON 格式,但你可以传递 --pretty 标志以人类可读格式打印结果。例如:

$ docker node inspect self --pretty

ID:                     ehkv3bcimagdese79dn78otj5
Hostname:               node-1
Joined at:              2016-06-16 22:52:44.9910662 +0000 utc
Status:
 State:                 Ready
 Availability:          Active
Manager Status:
 Address:               172.17.0.2:2377
 Raft Status:           Reachable
 Leader:                Yes
Platform:
 Operating System:      linux
 Architecture:          x86_64
Resources:
 CPUs:                  2
 Memory:                1.954 GiB
Plugins:
  Network:              overlay, host, bridge, overlay, null
  Volume:               local
Engine Version:         1.12.0-dev

更新节点

你可以修改节点属性以:

更改节点可用性

更改节点可用性使你能够:

  • 排空 manager 节点,使其仅执行 Swarm 管理任务,并且不可用于任务分配。
  • 排空节点,以便你可以将其关闭进行维护。
  • 暂停节点,使其无法接收新任务。
  • 恢复不可用或已暂停节点的可用性状态。

例如,要将 manager 节点的可用性更改为 Drain

$ docker node update --availability drain node-1

node-1

有关不同可用性选项的说明,请参阅列出节点

添加或移除标签元数据

节点标签提供了灵活的节点组织方法。你还可以在服务约束中使用节点标签。创建服务时应用约束以限制调度程序为该服务分配任务的节点。

在 manager 节点上运行 docker node update --label-add 来向节点添加标签元数据。--label-add 标志支持 <key><key>=<value> 对。

对于要添加的每个节点标签,传递一次 --label-add 标志:

$ docker node update --label-add foo --label-add bar=baz node-1

node-1

使用 docker node update 为节点设置的标签仅适用于 swarm 中的节点实体。不要将它们与 dockerd 的 Docker 守护进程标签混淆。

因此,节点标签可用于将关键任务限制在满足特定要求的节点上运行。例如,仅在应运行特殊工作负载的机器上进行调度,例如满足 PCI-SS 合规性的机器。

一个受到损害的 worker 无法损害这些特殊工作负载,因为它不能更改节点标签。

然而,Engine 标签仍然有用,因为一些不影响容器安全编排的功能最好以去中心化的方式设置。例如,一个引擎可以有一个标签来指示它具有某种类型的磁盘设备,这可能与安全性没有直接关系。这些标签更容易被 swarm 编排器“信任”。

有关服务约束的更多信息,请参阅 docker service create CLI 参考

提升或降级节点

你可以将 worker 节点提升为 manager 角色。当 manager 节点变得不可用或如果你想让 manager 节点离线进行维护时,这非常有用。同样,你可以将 manager 节点降级为 worker 角色。

注意

无论你出于何种原因提升或降级节点,都必须始终在 swarm 中保持 manager 节点的仲裁。有关更多信息,请参阅 Swarm 管理指南

要提升一个或一组节点,请在 manager 节点上运行 docker node promote

$ docker node promote node-3 node-2

Node node-3 promoted to a manager in the swarm.
Node node-2 promoted to a manager in the swarm.

要降级一个或一组节点,请在 manager 节点上运行 docker node demote

$ docker node demote node-3 node-2

Manager node-3 demoted in the swarm.
Manager node-2 demoted in the swarm.

docker node promotedocker node demote 分别是 docker node update --role managerdocker node update --role worker 的便捷命令。

在 Swarm 节点上安装插件

如果你的 swarm 服务依赖于一个或多个插件,则这些插件需要在服务可能部署到的每个节点上都可用。你可以手动在每个节点上安装插件,或编写脚本进行安装。你还可以使用 Docker API,通过指定 PluginSpec 而不是 ContainerSpec 的方式,以类似于 global service 的方式部署插件。

注意

目前无法使用 Docker CLI 或 Docker Compose 将插件部署到 Swarm。此外,无法从私有仓库安装插件。

PluginSpec 由插件开发者定义。要将插件添加到所有 Docker 节点,请使用 service/create API,并传递 TaskTemplate 中定义的 PluginSpec JSON。

离开 Swarm

在节点上运行 docker swarm leave 命令以将其从 Swarm 中移除。

例如,在 worker 节点上离开 Swarm:

$ docker swarm leave

Node left the swarm.

当节点离开 Swarm 时,Docker Engine 将停止在 Swarm 模式下运行。编排器不再向该节点调度任务。

如果节点是 manager 节点,你将收到有关维护仲裁的警告。要覆盖警告,请传递 --force 标志。如果最后一个 manager 节点离开 Swarm,Swarm 将变得不可用,需要你采取灾难恢复措施。

有关维护仲裁和灾难恢复的信息,请参阅 Swarm 管理指南

节点离开 Swarm 后,你可以在 manager 节点上运行 docker node rm 从节点列表中移除该节点。

例如:

$ docker node rm node-2

了解更多

页面选项