我的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
您可以看到CURRENT STATE == New 22 hours ago
。如果我尝试检查日志,则它们为空。检查服务也无济于事(无关紧要)。
如果我停止某些服务,则在第一次重试后,可能会自动启动标有New
状态的服务。看来我无论如何都达到了极限。
我在网上跟踪了一些文档,但是这个问题尚不清楚。 如果可以为我提供一些链接,我们将不客气。
我认为,今天,我怀疑我在Swarm(--driver=overlay
)中创建的网络的IP范围不足,并且无法为容器提供足够的IP。这些网络是/24
子网。有什么方法可以“刷新” IP保留,以便在不重新创建Docker网络的情况下重新初始化网络?
经过调查,有两种服务可以达到此New
状态,它们位于两个相同的网络上。
docker network inspect
的结果:
[
{
"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 version
的结果:
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
NB:我现在不想更新Docker。
编辑1:
我再次阅读了Docker documentation about networks,他们提到了Moby的Github项目Swarm Mode at Scale #30820上的一个未解决问题。
覆盖网络限制
使用默认的基于VIP的终结点模式创建网络时,应使用/ 24块(默认值)创建覆盖网络,这会将您限制为256个IP地址。该建议涉及limitations with swarm mode。如果您需要超过256个IP地址,请不要增加IP块的大小。您可以将dnsrr端点模式与外部负载均衡器一起使用,也可以使用多个较小的覆盖网络。有关不同端点模式的更多信息,请参见Configure service discovery。
-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
。
答案 0 :(得分:3)
这些群集任务似乎覆盖IP地址数量的资源限制。 您可以创建一个具有更大子网范围的Docker网络,例如10.10.0.0/16。 然后,在撰写文件中使用它来创建服务。 我认为这可以解决这个问题。
答案 1 :(得分:2)
每个服务和任务都获得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/
答案 2 :(得分:1)
每个服务上的选项--endpoint-mode=dnsrr
似乎可以解决此问题。
答案 3 :(得分:0)
网络似乎有问题,删除网络解决了该问题。
Set<AccessLevel> acclevels = new LinkedHashSet<>();
acclevels.add(AccessLevel.CurrentRead);
acclevels.add(AccessLevel.CurrentWrite);
acclevels.add(AccessLevel.HistoryRead);
UaVariableNode node = new UaVariableNode.UaVariableNodeBuilder(server.getNodeMap())
.setNodeId(new NodeId(namespaceIndex, "HelloWorld/Test/" + name))
.setAccessLevel(ubyte(AccessLevel.getMask(acclevels)))
.setUserAccessLevel(ubyte(AccessLevel.getMask(acclevels)))
.setBrowseName(new QualifiedName(namespaceIndex, name))
.setDisplayName(LocalizedText.english(name))
.setDataType(typeId)
.setTypeDefinition(Identifiers.BaseDataVariableType)
.setHistorizing(true)
.build();
有关更多详细信息,请仔细阅读所附的issue。
答案 4 :(得分:0)
在 docker-compose 文件中,我们还必须在端口配置上使用“模式:主机”,这需要端口定义的“长”格式:
version: '3.5'
services:
mycontainer:
image: myimage
# dnsrr requires long format, don't use ingress it won't work
ports:
- target: 1234 # choose your internal port
published: 1234 # choose your externally published port
protocol: tcp
mode: host # mode: host required for dnsrr
deploy:
endpoint_mode: dnsrr # dnsrr is required for swarm deployment
mode: replicated # replicated is required
replicas: 1
答案 5 :(得分:0)
这通常是由于 IP 地址用完造成的。您可以通过运行以下命令来增加可用地址的数量:
docker swarm init --default-addr-pool-mask-length 16 --force-new-cluster
此命令使您现有的所有服务保持运行,但首先进行备份当然是个好主意:
https://docs.docker.com/engine/swarm/admin_guide/#Back%20up%20the%20swarm