因此,撰写3.6版和部署群集服务时遇到问题。我想要实现的是仅根据应用于节点的标签值部署服务A或服务B。 发生的事情是两种服务都已部署(或者一种已经部署,而第二种由于端口使用而失败)。
serviceA:
image: serviceA:v1
deploy:
mode: global
restart_policy:
condition: on-failure
placement:
constraints:
- node.labels.faces == cpu
networks:
- mynet
ports:
- "8888:8888"
serviceB:
image: serviceB:v1
deploy:
mode: global
restart_policy:
condition: on-failure
placement:
constraints:
- node.labels.faces == gpu
networks:
- mynet
ports:
- "8888:8888"
在我的单个节点上,我定义了如下标签
# docker node inspect swarm-manager --pretty
ID: 0cpco8658ap5xxvxxblpqggpq
Labels:
- faces=cpu
Hostname: swarm-manager
这种配置是否可能?仅应实例化具有匹配标签的服务。
我想使用全局节点而不是复制节点,因为我们无需前往主节点即可自动添加其他节点,但是我在另一个论坛中读到这两个节点可能不兼容。
但是,如果我使用CLI手动创建所有内容,它将按预期工作
docker node update --label-add faces=cpu swarm-manager
docker service create -d --name serviceA --constraint node.labels.faces==cpu -p 8888 --mode global serviceA:v1
docker service create -d --name serviceB --constraint node.labels.faces==gpu -p 8888 --mode global serviceB:v1
# docker service ls | grep service
c30y50ez605p serviceA global 1/1 service:v1 *:30009->8888/tcp
uxjw41v42vzh serviceB global 0/0 serviceB:v1 *:30010->8888/tcp
您可以看到使用CPU约束创建的服务可以正常工作,并且没有实例化具有GPU的服务(处于挂起状态)。