如何在Swarm集群中删除卷?

20

我有一个包含一个管理节点和另一个普通节点的Swarm集群,当我创建一个Swarm服务时,我使用挂载类型、挂载源和挂载目标。它在manager和node上都创建了相同名称的卷,并启动了容器,我的服务已经运行。

当我释放服务时,与服务一起创建的卷并没有被删除,这还好。

我面临的问题是,当我删除具有相同端点的卷时,它只会删除Swarm Manager中的卷,而在创建服务时在节点上创建的卷仍然存在。

我希望管理器能够删除与Swarm服务一起创建的所有卷。是否有办法实现?


Docker 的版本是多少?这是经典的 Swarm 还是 Swarm 模式?考虑到时差,我猜 OP 和悬赏者关注的是不同的事情。 - BMitch
赏金计划关注 Swarm Mode。Docker - >= 17.x。 - Rufinus
3个回答

10
经过多次分析,以下是我们的理论。
如果您指示Swarm使用卷创建服务,Swarm只在集群内部即多个节点上执行创建服务的操作。是的,当您发送卷详细信息时,它也会创建卷,但在释放服务时,它未检查工作节点中是否存在该卷,这是Docker中的错误。
我已经在Docker中提出了此问题。
目前除了手动从工作节点释放Swarm服务后的卷之外,没有其他方法。

3
你有提出问题的那个网址链接吗? - VonC
你应该关注这个问题 https://github.com/moby/moby/issues/29158#issuecomment-663793782 - Ser

4
据我所知,只有在创建容器的节点上才会创建卷。如果您的服务无法在一个节点上启动,最终在另一个节点上结束,而Swarm没有清理,这种情况是否可能发生?如果是这种情况,请在github上编写问题。

更新(来自评论):

根据docker service create documentation

命名卷是一种机制,用于将容器需要的持久数据与用于创建容器的映像和主机机器分离。命名卷由Docker创建和管理,即使没有容器正在使用它,命名卷也会持久存在。命名卷中的数据可以在容器和主机机器之间以及多个容器之间共享。Docker使用卷驱动程序来创建、管理和挂载卷。您可以使用Docker命令备份或恢复卷。

因此,如果您正在使用命名卷,则正确的答案是为什么它们被删除在管理者那里,并且它们是否曾经在那里创建?


良好的故障排除思维视角。我也是这么想的。当您指示群集创建具有副本10的服务时,它会分裂并决定每个节点上必须运行多少个容器。如果没有任何服务被分配,它只会在节点中创建卷。即使一切都进行得很顺利,容器也成功运行,但它仍无法释放工作节点中的卷,我已经手动验证了很多次。 - Vishnu Ranganathan
2
在管理器上它们被移除了吗?如果你有一个命名的卷,它应该是持久的,对吧?“命名卷是一种机制,用于将容器所需的持久数据与用于创建容器的镜像和主机机器分离。命名卷由Docker创建和管理,即使没有容器正在使用它,命名卷也会持久存在。命名卷中的数据可以在容器和主机机器之间共享,也可以在多个容器之间共享。Docker使用卷驱动程序来创建、管理和挂载卷。” - herm
你说得完全正确,Herm。我也是从Docker的角度考虑,他们将卷、网络和容器视为独立的服务。卷和网络可以在多个容器之间共享。如果是这样,那么为什么他们要在管理节点上删除呢?这是一个价值十亿美元的问题。如果他们要删除,那么应该在整个集群中删除,否则就不应该在管理节点上删除。这是我的观点。 - Vishnu Ranganathan

0
在Docker Swarm集群的其他机器上,有一种方法可以删除卷。
假设卷的名称是volume-x,您可以运行以下命令:

docker service create -d \
    --name cleaner \
    --restart-condition none \
    --mode global \
    --mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock \
    docker \
    sh -c "docker volume rm volume-x"

它将创建一个全局服务,并在集群内的每个主机上运行docker volume rm volume-x
要跟踪日志:
docker service logs --follow cleaner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接