管理群集中的节点

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

列出节点

要查看群集中的节点列表,请从管理节点运行 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 管理。
  • Leader 表示该节点是主要管理器节点,负责为整个集群做出所有 Swarm 管理和编排决策。
  • Reachable 表示该节点是参与 Raft 共识多数派的 Manager 节点。如果 Leader 节点不可用,则该节点有资格被选举为新的 Leader。
  • Unavailable 表示该节点是一个无法与其他管理节点通信的管理节点。如果管理节点变得不可用,您应该要么向集群加入一个新的管理节点,要么将一个工作节点提升为管理节点。

有关 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 管理任务,并不可用于任务分配。
  • 使节点进入不可调度状态,以便将其下线进行维护。
  • 暂停节点,使其无法接收新任务。
  • 恢复不可用或已暂停节点的可用状态。

例如,要将管理节点更改为 Drain 可用性:

$ 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 中的节点实体。请勿将其与 Docker 守护进程(dockerd)的标签混淆。

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

由于无法更改节点标签,被攻破的 Worker 节点将无法破坏这些特殊工作负载。

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

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

提升或降级节点

您可以将工作节点提升为管理器角色。这在某个管理器节点不可用,或您需要将某个管理器离线进行维护时非常有用。同样,您也可以将管理器节点降职为工作节点。

注意

无论您提升或降低节点角色的原因是什么,都必须始终在集群中维护一个管理节点的法定人数(quorum)。有关更多信息,请参阅 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。此外,也无法从私有仓库安装插件。

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

离开集群

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

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

$ docker swarm leave

Node left the swarm.

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

如果节点是管理节点,您将收到关于维护法定人数(quorum)的警告。要覆盖此警告,请传递 --force 标志。如果最后一个管理节点离开集群,集群将变得不可用,您需要采取灾难恢复措施。

有关维护法定人数和灾难恢复的信息,请参阅 Swarm 管理指南

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

例如:

$ docker node rm node-2

了解更多