在 Swarm 中管理节点

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

列出节点

要查看 Swarm 中的节点列表,请从管理器节点运行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 列显示调度程序是否可以为节点分配任务。

  • 活动 表示调度程序可以为节点分配任务。
  • 暂停 表示调度程序不会为节点分配新任务,但现有任务仍将继续运行。
  • 移除 表示调度程序不会为节点分配新任务。调度程序将关闭任何现有任务并在可用节点上对其进行调度。

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

  • 无值表示不参与 Swarm 管理的工作节点。
  • 领导者 表示该节点是主要管理器节点,负责为 Swarm 做出所有 Swarm 管理和编排决策。
  • 可达 表示该节点是参与 Raft 共识仲裁的管理器节点。如果领导者节点不可用,则该节点有资格当选为新的领导者。
  • 不可用 表示该节点是一个无法与其他管理器节点通信的管理器。如果管理器节点不可用,您应该将新的管理器节点加入 Swarm 或将工作节点提升为管理器。

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

检查单个节点

您可以在管理器节点上运行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

更新节点

您可以修改节点属性以:

更改节点可用性

更改节点可用性允许您:

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

例如,要将管理器节点的可用性更改为移除

$ docker node update --availability drain node-1

node-1

请参阅列出节点以了解不同可用性选项的说明。

添加或删除标签元数据

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

在管理器节点上运行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 合规性的机器。

受损的工作人员无法破坏这些特殊工作负载,因为它无法更改节点标签。

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

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

提升或降级节点

您可以将工作节点提升到管理器角色。当管理器节点不可用或您想将管理器下线进行维护时,这很有用。类似地,您可以将管理器节点降级为工作节点角色。

注意

无论您提升或降级节点的原因是什么,都必须始终在 Swarm 中维护管理器节点的仲裁。有关更多信息,请参阅Swarm 管理指南

要提升一个或一组节点,请从管理器节点运行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.

要降级一个或一组节点,请从管理器节点运行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,以类似于全局服务的方式部署插件。

注意

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

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

离开 Swarm

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

例如,要在工作节点上离开 Swarm

$ docker swarm leave

Node left the swarm.

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

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

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

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

例如

$ docker node rm node-2

了解更多