管理 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(可用性)列显示调度程序是否可以将任务分配给该节点
Active(活动)表示调度程序可以将任务分配给该节点。Pause(暂停)表示调度程序不会将新任务分配给该节点,但现有任务仍将继续运行。Drain(排空)表示调度程序不会将新任务分配给该节点。调度程序会关闭任何现有任务,并将其调度到可用节点上。
MANAGER STATUS(管理器状态)列显示节点在 Raft 共识中的参与情况
- 无值表示不参与 Swarm 管理的 worker 节点。
Leader(领导者)表示该节点是主要的管理器节点,负责 Swarm 的所有 Swarm 管理和编排决策。Reachable(可达)表示该节点是参与 Raft 共识仲裁的管理器节点。如果领导者节点变得不可用,该节点有资格被选举为新的领导者。Unavailable(不可用)表示该节点是一个无法与其他管理器通信的管理器。如果管理器节点变得不可用,您应该将新的管理器节点加入 Swarm,或者将 worker 节点提升为管理器。
有关 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 合规性的机器)的机器上进行调度。
受损的 worker 无法损害这些特殊工作负载,因为它无法更改节点标签。
然而,引擎标签仍然有用,因为一些不影响容器安全编排的功能最好以分散的方式设置。例如,引擎可以有一个标签来指示它具有某种类型的磁盘设备,这可能与安全没有直接关系。这些标签更容易被 Swarm 编排器“信任”。
有关服务约束的更多信息,请参阅 docker service create CLI 参考。
提升或降级节点
您可以将 worker 节点提升为管理器角色。当管理器节点不可用或您想让管理器离线进行维护时,这很有用。同样,您可以将管理器节点降级为 worker 角色。
注意无论您提升或降级节点的原因是什么,您都必须始终在 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 promote 和 docker node demote 分别是 docker node update --role manager 和 docker node update --role worker 的便捷命令。
在 Swarm 节点上安装插件
如果您的 Swarm 服务依赖于一个或多个插件,则这些插件需要可在服务可能部署的每个节点上使用。您可以手动在每个节点上安装插件或编写安装脚本。您还可以通过指定 PluginSpec 而不是 ContainerSpec,以类似于全局服务的方式使用 Docker API 部署插件。
注意目前无法使用 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 模式下运行。编排器不再向该节点调度任务。
如果该节点是管理器节点,您会收到关于维护仲裁的警告。要覆盖该警告,请传递 --force 标志。如果最后一个管理器节点离开 Swarm,Swarm 将变得不可用,需要您采取灾难恢复措施。
有关维护仲裁和灾难恢复的信息,请参阅 Swarm 管理指南。
节点离开 Swarm 后,您可以在管理器节点上运行 docker node rm 将该节点从节点列表中移除。
例如
$ docker node rm node-2