管理 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 promote
和 docker node demote
分别是 docker node update --role manager
和 docker 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