管理集群中的节点

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

列出节点

docker node ls要从管理节点查看 swarm 中的节点列表:

$ 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 做出所有 swarm 管理和编排决策。
  • Reachable表示该节点是参与 Raft 共识仲裁的管理节点。如果领导节点不可用,则该节点有资格选举为新的领导者。
  • Unavailable表示该节点是一个管理器,不能与其他管理器通信。如果管理节点不可用,您应该将新的管理节点加入到 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 管理任务,并且不可用于任务分配。
  • 排空节点,以便您可以将其取下进行维护。
  • 暂停节点,使其无法接收新任务。
  • 恢复不可用或暂停的节点可用性状态。

例如,要将管理器节点更改为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 内的节点实体。不要将它们与 dockerd的 docker 守护进程标签混淆。

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

受损的工作线程无法危害这些特殊工作负载,因为它无法更改节点标签。

然而,引擎标签仍然有用,因为一些不影响容器安全编排的功能可能更好地以分散的方式设置。例如,引擎可以有一个标签来指示它具有某种类型的磁盘设备,这可能与安全性不直接相关。这些标签更容易被群体协调器“信任”。

有关服务限制的更多信息,请参阅docker service create CLI 参考。

提升或降级节点

您可以将工作节点提升为管理者角色。当管理器节点不可用或您想要使管理器脱机进行维护时,这非常有用。同样,您可以将管理节点降级为工作角色。

笔记

无论您出于何种原因升级或降级节点,您都必须始终维持集群中管理器节点的法定数量。有关详细信息,请参阅 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 promote和分别是和的docker node demote便捷命令 。docker node update --role managerdocker node update --role worker

在 swarm 节点上安装插件

如果您的 swarm 服务依赖于一个或多个 插件,则这些插件需要在可能部署该服务的每个节点上可用。您可以在每个节点上手动安装插件或编写安装脚本。您还可以使用 Docker API 以与全局服务类似的方式部署插件,只需PluginSpec指定ContainerSpec.

笔记

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

PluginSpec 由插件开发人员定义。 要将插件添加到所有 Docker 节点,请使用 API service/createPluginSpec传递TaskTemplate.

离开蜂群

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

例如,将集群留在工作节点上:

$ docker swarm leave

Node left the swarm.

当节点离开 Swarm 时,Docker Engine 停止以 Swarm 模式运行。 Orchestrator 不再将任务调度到节点。

如果该节点是管理节点,您会收到有关维持仲裁的警告。要忽略警告,请传递--force标志。如果最后一个管理节点离开集群,集群将变得不可用,需要您采取灾难恢复措施。

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

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

例如:

$ docker node rm node-2

了解更多