Наложенная сеть Docker Swarm не работает между узлами

Я пытаюсь подключить свои службы докеров вместе в рое докеров.

сеть состоит из 2 малиновых пи.

я могу создать оверлейную сеть под названием test-overlay, и я вижу, что службы на любом узле Raspberry Pi могут подключаться к сети.

моя проблема:

Я не могу подключиться к службам между узлами с оверлейной сетью.

учитывая следующую конфигурацию узлов и служб, service1 может использовать адрес http://service2 для подключения к service2. но это НЕ работает для http://service3. однако http://service3 доступен из service4.

node1:
  - service1
  - service2
node2:
  - service3
  - service4

Я новичок в Docker Swarm, и любая помощь приветствуется.

проверка наложения

Я выполнил команду sudo docker inspect network test-overlay на обоих узлах.

на главном узле это возвращает следующее:

[
    {
        "Name": "test-overlay",
        "Id": "skxhz8sb3f82dhh9jt9t3j5yl",
        "Created": "2018-04-15T20:31:20.629719732Z",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.0.0/24",
                    "Gateway": "10.0.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "3acb436a0cc9a4d584d537edb1546988d334afa4793cc4fae4dd6ac9b48828ea": {
                "Name": "docker-registry.1.la1myuodpkq0x5h39pqo6lt7f",
                "EndpointID": "66887fb1f5f253c6cbec149aa51ab85168903fdd2290719f26d2bcd8d6c68dc8",
                "MacAddress": "02:42:0a:00:00:04",
                "IPv4Address": "10.0.0.4/24",
                "IPv6Address": ""
            },
            "786e1fee538f81fe41ccd082800c646a0e191b0fd912e5c15530e61c248e81ac": {
                "Name": "portainer.1.qyvvlcdqo5sewuku3eiykaplz",
                "EndpointID": "0d29e5452c208ed637ae2e7dcec026f39d2431e8e0e20765a9e0e6d6dfdc60ca",
                "MacAddress": "02:42:0a:00:00:15",
                "IPv4Address": "10.0.0.21/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4101"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "d049fc8f8ae1",
                "IP": "192.168.1.2"
            },
            {
                "Name": "6c0da128f308",
                "IP": "192.168.1.3"
            }
        ]
    }
]

на рабочем узле это возвращает следующее:

[
    {
        "Name": "test-overlay",
        "Id": "skxhz8sb3f82dhh9jt9t3j5yl",
        "Created": "2018-04-20T14:04:57.870696195Z",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.0.0/24",
                    "Gateway": "10.0.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "4cb50161119e4b58a472e1b5c380c301bbb00a23fc99fc2e0712a8c4bde6d9d4": {
                "Name": "minio.1.fo2su2quv8herbmnxqfi3g8w2",
                "EndpointID": "3e85786304ed08f02c09b8e1ed6a153a3b4c2ef7afe503a1b0ca6cf341521645",
                "MacAddress": "02:42:0a:00:00:d6",
                "IPv4Address": "10.0.0.214/24",
                "IPv6Address": ""
            },
            "ce99b3788a4f9438e276e0f52a8f4d29fa09179e3e93b31b14f45339ce3c5315": {
                "Name": "load-balancer.1.j64h1eecsc05b7d397ejvedv3",
                "EndpointID": "3b7e73d27fe30151f2dc2a0ba8a5afc7f74fd283159a03a592be10e297f58d51",
                "MacAddress": "02:42:0a:00:00:d0",
                "IPv4Address": "10.0.0.208/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4101"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "d049fc8f8ae1",
                "IP": "192.168.1.2"
            },
            {
                "Name": "6c0da128f308",
                "IP": "192.168.1.3"
            }
        ]
    }
]

person X0r0N    schedule 12.04.2018    source источник
comment
Можете ли вы убедиться, что ваш узел2 является рабочим узлом узла1? docker node ls   -  person Varcorb    schedule 13.04.2018
comment
Находятся ли два узла в одном рое?   -  person Constantin Galbenu    schedule 13.04.2018
comment
node2 определенно является рабочим node1 и находится в том же рое. Я могу подтвердить это, потому что могу развертывать службы от мастера к работнику с ограничением размещения node.role == worker. sudo docker node ls, как и ожидалось, возвращает таблицу с обоими узлами.   -  person X0r0N    schedule 13.04.2018
comment
Что docker network inspect test-overlay отображается на обоих узлах? Особенно в Peers и Containers.   -  person Izydorr    schedule 20.04.2018
comment
Я обновил вопрос, указав запрошенную отладочную информацию. оба Peers перечислены на обоих узлах, но в разделе Containers отображаются только контейнеры, работающие на этом конкретном узле.   -  person X0r0N    schedule 20.04.2018
comment
@ X0r0N - вы решили проблему? У меня недавно был похожий - он работал довольно хорошо, но через некоторое время оверлейная сеть разделилась, и контейнеры из узла-менеджера не могли взаимодействовать с рабочим узлом. Удивительно, но перезагрузка рабочего узла помогла, но этого не должно было произойти. Вы проводили какие-либо дополнительные исследования по этому поводу?   -  person Miq    schedule 17.05.2018
comment
@Miq, к сожалению, у меня вообще не заработало. в отличие от вашего решения, мои узлы роя никогда не могли связываться друг с другом через оверлейную сеть. Я исправил свои проблемы, сделав запись в hosts файле, который Portainer позволяет вам настраивать непосредственно в пользовательском интерфейсе (так что без монтирования тома). это не очень хорошее решение, но оно должно сработать.   -  person X0r0N    schedule 17.05.2018
comment
Что дает docker network inspect test-overlay -v? -v предоставит вам сетевую информацию по каждой из служб ... были случаи, когда служба была недоступна на 1 узле, но работала нормально для всех остальных. Эта команда должна помочь отладить это.   -  person Ryan Smith    schedule 27.06.2018


Ответы (3)


похоже, эта проблема была из-за того, что узлы не могли подключиться друг к другу на требуемых портах.

TCP port 2377 for cluster management communications
TCP and UDP port 7946 for communication among nodes
UDP port 4789 for overlay network traffic

прежде чем открывать эти порты.

Лучшее и более простое решение - использовать образ докера portainer/agent. как говорится в документации,

The Portainer Agent is a workaround for a Docker API limitation when using the Docker API to manage a Docker environment.

https://portainer.readthedocs.io/en/stable/agent.html

Я надеюсь, что это поможет кому-нибудь еще, столкнувшемуся с этой проблемой.

person X0r0N    schedule 28.06.2018
comment
Большое спасибо, X0r0N. Это был намек, который мне нужен для решения моей проблемы. Для записи, я наткнулся на этот учебник, в котором упоминаются те же порты и как их добавить, например. FirewallD: digitalocean.com/community/tutorials/ - person natterstefan; 17.12.2018
comment
Извините, не могу понять, рекламируемые адреса и открытые порты, развернутые с помощью portainer .readthedocs.io / en / stable / deployment.html # quick-start, и в сети портейнера по-прежнему не видны одноранговые узлы, но можно получить доступ к одноранговым узлам из пользовательского интерфейса - person Alex Dembo; 13.12.2019
comment
Хорошо, помогла перезагрузка. Потратил на это 6ч. Злой аф. - person Alex Dembo; 13.12.2019
comment
У меня это не сработало, поэтому я отключил брандмауэр ufw disable - person Chenna; 19.05.2020
comment
Я предполагаю, что вы также можете использовать ufw allow, чтобы явно разрешить порты (упомянутые выше) вместо отключения всего брандмауэра. - person X0r0N; 25.05.2020
comment
Агент Portainer бесполезен, если вы не открыли порты для оверлейной входной сети, которая используется агентом. Вы не сможете заставить service1 подключиться к service2, просто добавив агента в рой. - person Kavinda Gayashan; 09.09.2020

Я пока не могу оставить комментарий, но мне удалось решить эту проблему с помощью решения, предоставленного X0r0N, и я оставляю этот комментарий, чтобы помочь людям в моем положении найти решение в будущем.

Я развертывал 10 капель в DigitalOcean, используя образ Docker по умолчанию, предоставленный Docker. В описании сказано, что закрываются все порты, кроме Docker. Это явно не входит в варианты использования Swarm.

После разрешения портов 2377, 4789 и 7946 в ufw Docker Swarm теперь работает должным образом.

Чтобы этот ответ стоял сам по себе, порты соответствуют следующим функциям:

TCP-порт 2377: обмен данными при управлении кластером TCP и UDP-порт 7649: обмен данными между узлами UDP-порт 4789: наложение сетевого трафика

person Christoffer Nissen    schedule 27.03.2020

Проверьте, правильно ли открыты порты ваших узлов, необходимые для работы роя, как описано здесь https://docs.docker.com/network/overlay/ в разделе «Требования»:

TCP port 2377 for cluster management communications
TCP and UDP port 7946 for communication among nodes
UDP port 4789 for overlay network traffic
person Izydorr    schedule 19.04.2018
comment
Спасибо за ваш ответ. Я уже видел эту страницу в документации и открыл эти порты с помощью UFW. это не решает проблему. - person X0r0N; 19.04.2018
comment
это действительно кажется проблемой. Мое решение состояло в том, чтобы использовать docker image portainer / agent. - person X0r0N; 28.06.2018