【问题标题】:Docker service stuck in New state (Swarm)Docker 服务卡在新状态(Swarm)
【发布时间】:2018-06-28 09:01:34
【问题描述】:

我的 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 状态并且它们在2个相同的网络上。

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

注意:我现在不想更新 Docker。

编辑 1:

我再次阅读了Docker documentation about networks,他们提到了 Moby 的 Github 项目 Swarm Mode at Scale #30820 上的一个未解决问题。

Overlay 网络限制

当您使用默认的基于 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:

基于问题Swarm Mode at Scale #30820上的Flavio 'fcrisciani' Crisciani's comment,我将尝试在我的服务中添加选项--endpoint-mode=dnsrr

【问题讨论】:

    标签: docker networking docker-swarm


    【解决方案1】:

    每个服务和任务都有 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】:

      似乎覆盖 IP 地址的资源限制相当于这些 swarm 任务。 您可以创建一个子网范围更大的 Docker 网络,例如 10.10.0.0/16。 然后,在您的撰写文件中使用它来创建服务。 我认为这可以解决这个问题。

      【讨论】:

      • 对我来说,这比推荐 --endpoint-mode=dnsrr 的答案更好,因为该选项需要设置外部负载平衡器。通过创建更大的子网(例如 /16),我无需更改部署中的任何内容。
      • 我同意。我接受了另一个答案,因为有关于如何创建网络的解释。另外,问题是关于 Docker Swarm 而不是 docker-compose,但这是一个细节。
      【解决方案3】:

      每个服务上的选项--endpoint-mode=dnsrr 似乎可以解决这个问题。

      【讨论】:

        【解决方案4】:

        这通常是由于 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-02
          相关资源
          最近更新 更多