创建带有放置约束和偏好的服务
在这一步中,你将学习如何使用放置约束(placement constraints)和放置偏好(placement preferences)来控制 Docker Swarm 中服务任务的部署位置。放置约束是节点必须满足的硬性要求,只有满足这些要求,任务才能被调度到该节点上。放置偏好是软性要求,它会影响调度,但如果没有节点满足该偏好,也不会阻止任务被调度。
首先,让我们检查当前节点,查看其标签。标签是可以附加到节点上的键值对,用于提供元数据。
docker node inspect self --format '{{ .Spec.Labels }}'
这个命令会检查当前节点(由 self
标识),并格式化输出以显示其标签。默认情况下,可能没有任何自定义标签。
让我们为当前节点添加一个标签。我们将添加一个标签 node_type=app
。
docker node update --label-add node_type=app self
这个命令会更新当前节点,并添加标签 node_type=app
。
现在,让我们验证标签是否已添加。
docker node inspect self --format '{{ .Spec.Labels }}'
你应该会在输出中看到 map[node_type:app]
,这表明标签已成功添加。
现在,让我们创建一个名为 my-constrained-service
的副本服务,并设置一个放置约束,要求节点必须具有标签 node_type=app
。我们将使用 nginx
镜像。
docker service create \
--name my-constrained-service \
--replicas 1 \
--constraint 'node.labels.node_type == app' \
nginx:latest
这个命令创建了一个带有约束的服务。--constraint 'node.labels.node_type == app'
指定该服务的任务只能调度到标签 node_type
等于 app
的节点上。由于我们已将此标签添加到当前节点,任务应该会被调度到这里。
检查服务状态和任务:
docker service ls
docker service ps my-constrained-service
你应该会看到 my-constrained-service
被列出,并且其任务正在当前节点上运行。
现在,让我们创建另一个带有放置偏好的服务。放置偏好用于指导调度器,但不是严格强制执行的。我们将使用 busybox
镜像,并偏好具有标签 node_type=database
的节点。由于我们的当前节点没有这个标签,任务仍会被调度到当前节点,但如果有其他具有该标签的节点,调度器会优先选择它们。
首先,拉取 busybox
镜像。
docker pull busybox:latest
现在,创建带有放置偏好的服务。
docker service create \
--name my-preferred-service \
--replicas 1 \
--placement-pref 'spread=node.labels.node_type' \
busybox:latest sleep infinity
--placement-pref 'spread=node.labels.node_type'
选项告诉调度器根据 node_type
标签的值在节点之间分散任务。在具有不同 node_type
标签的多节点 Swarm 中,这将更均匀地分布任务。在这个单节点环境中,任务将简单地调度到可用节点上。
检查服务状态和任务:
docker service ls
docker service ps my-preferred-service
你应该会看到 my-preferred-service
被列出,并且其任务正在当前节点上运行。