当堆栈上的数量小于限制 256 时,为什么会发生 docker IP 耗尽的情况?

Cia*_*hue 5 docker docker-swarm

我有一个集群,目前有 135 个容器在 my-stack 堆栈上运行,这已经从 156 个下降了,因为 IP 耗尽问题不断出现,但由于子网配置为 /24,理论上它应该有 100 个可用 IP使用。在所有 docker 节点上执行 docker system prune --all 并没有带回任何可用的 IP 来使用。

在一个实例中,其中一个 docker 节点由于内存问题而停机,并且由于 IP 耗尽,某些服务的容器无法恢复在线状态。该节点必须从 swarm 中删除,并且我必须删除 /var/lib/docker/swarm 的内容才能将该节点重新加入到 swarm 中。在我完成此应用程序后,可以将 IP 分配给该节点。

IP 分配如何与 docker 堆栈配合使用?有没有办法检查分配给容器的 IP 以及距离发生 IP 耗尽还有多远?当我将节点添加回群后,我没想到它会解决 IP 耗尽问题。

码头工人版本:

Client:
 Version:      18.03.1-ce
 API version:  1.37
 Go version:   go1.9.5
 Git commit:   9ee9f40
 Built:        Thu Apr 26 07:17:20 2018
 OS/Arch:      linux/amd64
 Experimental: false
 Orchestrator: swarm

Server:
 Engine:
  Version:      18.03.1-ce
  API version:  1.37 (minimum version 1.12)
  Go version:   go1.9.5
  Git commit:   9ee9f40
  Built:        Thu Apr 26 07:15:30 2018
  OS/Arch:      linux/amd64
  Experimental: false

Run Code Online (Sandbox Code Playgroud)

乌班图版本:

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.4 LTS
Release:    16.04
Codename:   xenial
Run Code Online (Sandbox Code Playgroud)

Lin*_*nPy 2

我可以提供一个解决方法:

创建更大的网络:

docker network create --driver overlay --subnet=192.168.0.0/16 new_net
Run Code Online (Sandbox Code Playgroud)

更新你的stack

docker service update MYSERVICE --network-rm old_net --network-add new_net
Run Code Online (Sandbox Code Playgroud)

如果你真的退出了IPs,你应该在日志中看到类似这样的内容daemon

level=error msg="任务分配失败" error="无法为任务taskid网络networkid分配网络IP:找不到可用的IP" module=node level=error msg="无法为节点nodeid分配网络资源" 错误="找不到可用的IP" module=node node.id=nodeid

我认为docker需要一段时间来租赁未使用的网络IPs,因此使用更大的网络将在这方面有所帮助。