Docker Swarm отказывается создавать контейнеры с опубликованными портами

у меня есть рой с двумя узлами (оба с докером 19.03.1), с которыми у меня проблемы - я постоянно получаю

"Pool overlaps with other one on this address space" module=node/agent/taskmanager"

сообщение при создании службы с опубликованным портом.

Рой был создан ванильным:

manager@ docker swarm init
worker@ docker swarm join...

Я создал оверлейную сеть

manager@ docker network create -d overlay ids-net --attachable

Создание простого сервиса на обоих узлах работает:

manager@ docker service create --replicas 2 --network ids-net hashicorp/http-echo -text="hello world"

результат:

image hashicorp/http-echo:latest could not be accessed on a registry to record
its digest. Each node will access hashicorp/http-echo:latest independently,
possibly leading to different nodes running different
versions of the image.

ksi39hzojsfjr4jyqck1p4rib
overall progress: 2 out of 2 tasks
1/2: running   [==================================================>]
2/2: running   [==================================================>]
verify: Service converged

Выдача следующих результатов приводит к бесконечному циклу:

manager@ docker service create --replicas 2 --publish published=5678,target=5678 --network ids-net hashicorp/http-echo -text="hello world"

показывая следующее:

image hashicorp/http-echo:latest could not be accessed on a registry to record
its digest. Each node will access hashicorp/http-echo:latest independently,
possibly leading to different nodes running different
versions of the image.

bjjxxomsgvsoitf55l7vuuz74
overall progress: 0 out of 2 tasks
1/2: Pool overlaps with other one on this address space
2/2: Pool overlaps with other one on this address space

Системный журнал показывает следующее:

Aug 01 15:47:03 docker dockerd[1106]: time="2019-08-01T15:47:03.283849008+02:00" level=debug msg="state changed" module=node/agent/taskmanager node.id=50coluxfs0lnx1kf07mhckito service.id=d3rxusuxfk18tuvi24l198btp state.desired=READY state.transition="ACCEPTED->PREPARING" task.id=wmu9898y2yl01ga5v40xfojmi
Aug 01 15:47:03 docker dockerd[1106]: time="2019-08-01T15:47:03.283977128+02:00" level=debug msg="(*Agent).UpdateTaskStatus" module=node/agent node.id=50coluxfs0lnx                   1kf07mhckito task.id=wmu9898y2yl01ga5v40xfojmi
Aug 01 15:47:03 docker dockerd[1106]: time="2019-08-01T15:47:03.284226242+02:00" level=debug msg="task status reported" module=node/agent node.id=50coluxfs0lnx1kf07mhckito
Aug 01 15:47:03 docker dockerd[1106]: time="2019-08-01T15:47:03.284870334+02:00" level=debug msg="(*Agent).UpdateTaskStatus" module=node/agent node.id=50coluxfs0lnx                   1kf07mhckito task.id=o036l4zcbzvnccjsp44fygnfr
Aug 01 15:47:03 docker dockerd[1106]: time="2019-08-01T15:47:03.285156543+02:00" level=debug msg="Allocating IPv4 pools for network ingress (ozjtk12iougu8fqjliqspvxx2)"
Aug 01 15:47:03 docker dockerd[1106]: time="2019-08-01T15:47:03.285200492+02:00" level=debug msg="RequestPool(LocalDefault, 10.255.0.0/16, , map[], false)"
Aug 01 15:47:03 docker dockerd[1106]: time="2019-08-01T15:47:03.285228022+02:00" level=error msg="fatal task error" error="Pool overlaps with other one on this address space" module=node/agent/taskmanager node.id=50coluxfs0lnx1kf07mhckito service.id=d3rxusuxfk18tuvi24l198btp task.id=wmu9898y2yl01ga5v40xfojmi
Aug 01 15:47:03 docker dockerd[1106]: time="2019-08-01T15:47:03.285265876+02:00" level=debug msg="state changed" module=node/agent/taskmanager node.id=50coluxfs0lnx1kf07mhckito service.id=d3rxusuxfk18tuvi24l198btp state.desired=READY state.transition="PREPARING->REJECTED" task.id=wmu9898y2yl01ga5v40xfojmi
Aug 01 15:47:03 docker dockerd[1106]: time="2019-08-01T15:47:03.285236079+02:00" level=debug msg="task status reported" module=node/agent node.id=50coluxfs0lnx1kf07mhckito
Aug 01 15:47:03 docker dockerd[1106]: time="2019-08-01T15:47:03.285726857+02:00" level=debug msg="(*Agent).UpdateTaskStatus" module=node/agent node.id=50coluxfs0lnx                   1kf07mhckito task.id=wmu9898y2yl01ga5v40xfojmi
Aug 01 15:47:03 docker dockerd[1106]: time="2019-08-01T15:47:03.286082096+02:00" level=debug msg="task status reported" module=node/agent node.id=50coluxfs0lnx1kf07mhckito
Aug 01 15:47:03 docker dockerd[1106]: time="2019-08-01T15:47:03.286697616+02:00" level=debug msg="(*Agent).UpdateTaskStatus" module=node/agent node.id=50coluxfs0lnx                   1kf07mhckito task.id=wmu9898y2yl01ga5v40xfojmi
Aug 01 15:47:03 docker dockerd[1106]: time="2019-08-01T15:47:03.287043607+02:00" level=debug msg="task status reported" module=node/agent node.id=50coluxfs0lnx1kf07mhckito
Aug 01 15:47:03 docker dockerd[1106]: time="2019-08-01T15:47:03.316386815+02:00" level=debug msg="state for task wmu9898y2yl01ga5v40xfojmi updated to REJECTED" method="(*Dispatcher).processUpdates" module=dispatcher node.id=50coluxfs0lnx1kf07mhckito state.transition="ASSIGNED->REJECTED" task.id=wmu9898y2yl01ga5v40xfojmi

Думаю проблема с оверлейной сетью. manager@ docker inspect <network id> у менеджера дает:

    {
        "Name": "ids-net",
        "Id": "jzvu45w1b247whq6qsx3v7fdy",
        "Created": "2019-07-31T10:10:38.436102588+02:00",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.1.0/24",
                    "Gateway": "10.0.1.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            ...
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4098"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "22a3eb7a8eec",
                "IP": "192.168.100.92"
            }
        ]
    }
]

На рабочем узле сеть не создается. (Это правильно?)

Вот вывод ip r с обеих машин по запросу @BMitch:

manager@ ip r
default via 192.168.100.11 dev ens192 onlink
10.255.0.0/24 dev docker0 proto kernel scope link src 10.255.0.1
10.255.1.0/24 dev br-686969a42803 proto kernel scope link src 10.255.1.1
10.255.23.0/24 dev docker_gwbridge proto kernel scope link src 10.255.23.1
10.255.42.0/24 dev br-c03d759e1553 proto kernel scope link src 10.255.42.1
192.168.100.0/24 dev ens192 proto kernel scope link src 192.168.100.92
worker@ ip r
default via 192.168.100.11 dev eth0 onlink
10.254.0.0/24 dev docker0 proto kernel scope link src 10.254.0.1
10.255.3.0/24 dev docker_gwbridge proto kernel scope link src 10.255.3.1
10.255.4.0/24 dev br-88f241f38441 proto kernel scope link src 10.255.4.1
192.168.100.0/24 dev eth0 proto kernel scope link src 192.168.100.106

вот /etc/docker/daemon.json из manager:

manager@ cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://repo.ids.net"],
  "default-address-pools": [
    {"base":"10.255.255.0/16","size":24}
  ]
}

тот, что для worker, выглядит иначе:

manager@ cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://repo.ids.net"],
  "default-address-pools": [
    {"base":"10.254.255.0/16","size":24}
  ]
}

А вот конфиг ingress-сети:

root@docker:/etc/nginx/conf.d# docker network inspect ozjtk12iougu
[
    {
        "Name": "ingress",
        "Id": "ozjtk12iougu8fqjliqspvxx2",
        "Created": "2019-07-31T07:36:57.368162913Z",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.255.0.0/16",
                    "Gateway": "10.255.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": true,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": null,
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4096"
        },
        "Labels": null
    }
]

Я очищал обе системы несколько раз, а также перезапускал оба сервера с нуля.

Может ли кто-нибудь направить меня, пожалуйста?

Спасибо М


person DocJones    schedule 02.08.2019    source источник
comment
Пожалуйста, включите вывод ip r в свой вопрос.   -  person BMitch    schedule 05.08.2019
comment
@BMitch - сделано так   -  person DocJones    schedule 07.08.2019
comment
@BMitch - спасибо за вашу помощь - я добавил файлы daemon.json   -  person DocJones    schedule 08.08.2019


Ответы (1)


С опубликованным портом докер пытается настроить входящую сеть:

Aug 01 15:47:03 docker dockerd[1106]: time="2019-08-01T15:47:03.285156543+02:00" level=debug msg="Allocating IPv4 pools for network ingress (ozjtk12iougu8fqjliqspvxx2)"
Aug 01 15:47:03 docker dockerd[1106]: time="2019-08-01T15:47:03.285200492+02:00" level=debug msg="RequestPool(LocalDefault, 10.255.0.0/16, , map[], false)"

Это похоже на целую /16 для входной подсети, перекрывающуюся с другими подсетями, которые докер уже выделил в этом блоке /16:

10.255.0.0/24 dev docker0 proto kernel scope link src 10.255.0.1
10.255.1.0/24 dev br-686969a42803 proto kernel scope link src 10.255.1.1
10.255.23.0/24 dev docker_gwbridge proto kernel scope link src 10.255.23.1
10.255.42.0/24 dev br-c03d759e1553 proto kernel scope link src 10.255.42.1

Скорее всего, вы настроили сети и пулы адресов по умолчанию несовместимым образом. Это могло быть сделано путем ручного создания сети ingress, а также могут быть настройки внутри файла /etc/docker/daemon.json, вызывающие эти коллизии.


Изменить: из вашего обновления это предположение кажется правильным. Вы настроили три разные части докера на использование одного и того же адресного пространства, что приведет к конфликтам. И одна из этих частей, входящая сеть, использует все адресное пространство только для себя. Вы должны настроить мостовые сети (с пулом адресов по умолчанию в daemon.json), оверлейные сети (с параметром пула адресов во время docker swarm init, который вы почти наверняка передаете) и входящую сеть (которую вы, вероятно, создали вручную) для каждого иметь отдельный неперекрывающийся блок CIDR.

person BMitch    schedule 07.08.2019
comment
Ладно, спасибо за прекрасное объяснение, мои сетевые навыки действительно паршивые. Я постараюсь это исправить. Я удалю рой, отредактирую daemon.json и воссоздам рой. Не знаю, как пересоздать интерфейс docker0 и файл docker_gwbridge. Надеюсь, это произойдет автоматически при перезапуске службы...? - person DocJones; 09.08.2019
comment
Видимо, я слишком туп, чтобы решить эту проблему - я не вижу, какой из них (мост, оверлей или вход) мне нужно изменить. Если кто-то готов направить меня, я был бы признателен ..? - person DocJones; 16.10.2019