我的 Docker Swarm(由 3 个管理器和 5 个工作器组成的集群)面临一个奇怪的问题。我现在有许多正在运行的服务,当我接近大约 100 个服务(并且复制超过 110 个服务)时,我想要运行的新服务将无法启动。
当我列出服务时,我有这个:
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
alam7whfn1xe service_name.1 some_image Running New 22 hours ago
您可以看到当前状态== 22 小时前的新状态
。如果我尝试检查日志,它们是空的。检查该服务也无济于事(无关)。
如果我停止某些服务,标记为“New”状态的服务可能会在第一次重试后自行启动。看来我无论如何都已经达到了极限。
我在网上跟踪了一些文档,但没有关于这个问题的明确信息。 如果您能给我一些链接,我们将不胜感激。
今天,在我看来,我怀疑我在 Swarm 中创建的网络 (--driver=overlay
) 的 IP 范围不足,无法为容器提供足够的 IP。这些网络是 /24
子网。有没有什么方法可以“刷新”IP 保留,以便重新初始化网络而不重新创建 Docker 网络?
经过调查,有两种类型的服务可以达到此 New
状态,并且它们位于 2 个相同的网络上。
docker网络检查
的结果:
[
{
"Name": "network_name",
"Id": "okbrl5twyheq32ht3zw5l00gs",
"Created": "0001-01-01T00:00:00Z", <- this is the real date, strange isn't it?
"Scope": "swarm",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.16.2.0/24",
"Gateway": "172.16.2.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": null,
"Options": {
"com.docker.network.driver.overlay.vxlanid_list": "4097"
},
"Labels": null
}
]
此外,docker 版本
:
Client:
Version: 17.06.2-ce
API version: 1.30
Go version: go1.8.3
Git commit: cec0b72
Built: Tue Sep 5 20:00:06 2017
OS/Arch: linux/amd64
Server:
Version: 17.06.2-ce
API version: 1.30 (minimum version 1.12)
Go version: go1.8.3
Git commit: cec0b72
Built: Tue Sep 5 19:58:57 2017
OS/Arch: linux/amd64
Experimental: false
注意:我现在不想更新 Docker。
编辑1:
我又读了一遍Docker documentation about networks他们提到了 Moby 的 Github 项目 Swarm Mode at Scale #30820 上的一个未解决问题.
Overlay network limitations
You should create overlay networks with /24 blocks (the default), which limits you to 256 IP addresses, when you create networks using the default VIP-based endpoint-mode. This recommendation addresses limitations with swarm mode. If you need more than 256 IP addresses, do not increase the IP block size. You can either use dnsrr endpoint mode with an external load balancer, or use multiple smaller overlay networks. See Configure service discovery for more information about different endpoint modes.
-- https://docs.docker.com/engine/reference/commandline/network_create/#overlay-network-limitations
编辑2:
基于Flavio 'fcrisciani' Crisciani's comment关于这个问题Swarm Mode at Scale #30820 ,我将尝试在我的服务上添加选项 --endpoint-mode=dnsrr
。
最佳答案
每个服务和任务都会获取 IP 地址,因此服务连接的覆盖网络应该具有可以支持足够 IP 地址的子网。
使用以下命令创建具有更大范围支持的 IP 的 docker 网络:
docker network create --driver=overlay --subnet=10.10.0.0/16 <network_name>
引用: https://github.com/docker/for-aws/issues/104#issuecomment-331563445 https://docs.docker.com/engine/reference/commandline/network_create/
关于Docker 服务陷入新状态(Swarm),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51078764/