Docker Swarm 在重新部署服务时停止工作,需要系统重新启动

84次阅读
没有评论

问题描述

遇到了Docker Swarm的一个问题:在他的3个节点的Docker Swarm上,部署了大约40-50个堆栈,但现在在尝试重新部署新的更改时,集群似乎随机停止工作,服务进入了“new”模式,他对发生的原因感到困惑。

以下是他提供的一些相关信息:
– 部分服务无法正常重新部署,状态显示为“New”。
– 在正常情况下,重新部署新更改到Docker Swarm大约需要20-30秒的时间。
– 当运行“service update”命令时,部分服务的进度显示停滞。
– 问题似乎随机影响到不同的服务/容器。
– 拥有50%的磁盘空间、充足的内存和可用的CPU资源。
– Swarm集群的节点状态良好,有足够的可用性。

用户还更新说:
– 他已经添加了一个新的工作节点和3个新的管理节点到集群,但问题仍然存在。
– 目前在他的Swarm中有62个堆栈,运行了109个服务。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

根据用户提供的情况,可能有多个因素导致这个问题,但有一个可能性较大且容易解决的问题是IP数量限制。默认情况下,Docker Swarm的Ingress网络的IP数量是有限的,当创建Swarm时,它会使用一个IP范围为/24的网络。每个发布的端口都需要一个IP地址,而每个服务的复制(replica)也需要占用IP地址。

因此,当有大量的服务和副本时,可能会导致IP地址不足,从而影响重新部署。解决这个问题的方法是扩展Ingress网络的IP范围,使其能够容纳更多的IP地址。

解决方案步骤

  1. 删除现有的Ingress网络:
    shell
    docker network rm ingress

  2. 创建新的Ingress网络,指定一个更大的IP范围(/16),并设置网关和其他选项(这里假设新的IP范围为10.11.0.0/16):
    shell
    docker network create \
    --driver overlay \
    --ingress \
    --subnet=10.11.0.0/16 \
    --gateway=10.11.0.2 \
    --opt com.docker.network.driver.mtu=1200 \
    ingress

这样,Ingress网络将具有更大的IP地址范围(65k个IP),可以容纳更多的发布端口和服务复制。这有助于解决因IP地址不足导致重新部署问题的情况。

注意:在执行上述操作前,请确保备份了重要数据,并根据实际情况进行操作。这个解决方案的目的是为了解决可能的IP地址不足问题,如果问题仍然存在,可能需要进一步调查其他可能的原因。

正文完