Docker服务处于新状态(Swarm)

时间:2018-06-28 09:01:35

标签: docker networking docker-swarm

我的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

6 个答案:

答案 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