Docker swarm worker node на Windows недоступен удаленно

Вопрос или проблема

Я хотел добавить свой локальный компьютер с Windows в сеть Docker Swarm на своих серверах Linux, чтобы создать локальную среду разработки для контейнера Docker на ASP.NET Core, который будет работать на узле менеджера Swarm в продакшене. Visual Studio до сих пор не поддерживает удаленную разработку через SSH, и постоянная отправка кода на сервер и сборка там слишком утомительна для разработки и тестирования.

Проблема:
Насколько я понимаю, служба Docker Swarm работает в среде Hyper-V, привязанной к сети ingress, и слушает порты Swarm 7946 / 4789. Однако эти порты не опубликованы на моем хосте Windows 10. Я даже могу привязать эти порты к 0.0.0.0 на своем хосте. Только когда я пытаюсь запустить контейнер Docker с этими опубликованными портами, он говорит мне, что они уже заняты. Есть ли способ, как я могу перенаправить порты хоста 7946 / 4789 на службу Swarm?

Что я пробовал до сих пор, так это привязка сети ingress к моему адаптеру Ethernet, удалив сеть ingress и запустив
docker network create --driver overlay --ingress --subnet=10.0.0.0/24 --gateway=10.0.0.1 --opt "com.docker.network.windowsshim.interface=Ethernet 2" ingress
но это не помогло!

Вот некоторая информация о системе:

ipconfig:

Конфигурация IP Windows


Адаптер Ethernet Ethernet 2:

   Специфический DNS-суффикс подключения  . :
   IPv6-адрес. . . . . . . . . . . : 2a00:1358:e2f1:3b00:4202:9e83:fa24:6707
   Временный IPv6-адрес. . . . . . : 2a00:1358:e2f1:3b00:92c:7ade:660f:c77d
   Временный IPv6-адрес. . . . . . : 2a00:1358:e2f1:3b00:9c95:3ae0:6431:b4da
   Локальный IPv6-адрес. . . . . . : fe80::1cb7:4e4e:a8fb:93ee%13
   IPv4-адрес. . . . . . . . . . . : 192.168.10.82
   Маска подсети . . . . . . . . . . . : 255.255.255.0
   Шлюз по умолчанию . . . . . . . . . : fe80::1%13
                                       192.168.10.254

Адаптер Ethernet vEthernet (Default Switch):

   Специфический DNS-суффикс подключения  . :
   Локальный IPv6-адрес . . . . . : fe80::eaf2:dbaf:f9d:638%35
   IPv4-адрес. . . . . . . . . . . : 172.27.128.1
   Маска подсети . . . . . . . . . . . : 255.255.240.0
   Шлюз по умолчанию . . . . . . . . . :

Адаптер Ethernet vEthernet (WSL):

   Специфический DNS-суффикс подключения  . :
   Локальный IPv6-адрес . . . . . : fe80::3ee5:43db:efc8:1705%78
   IPv4-адрес. . . . . . . . . . . : 172.22.96.1
   Маска подсети . . . . . . . . . . . : 255.255.240.0
   Шлюз по умолчанию . . . . . . . . . :

docker network inspect ingress

[
    {
        "Name": "ingress",
        "Id": "0hrgne7zeoddycvgqnwcpwhk0",
        "Created": "2024-11-12T19:36:51.519811517Z",
        "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": true,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "ingress-sbox": {
                "Name": "ingress-endpoint",
                "EndpointID": "14a6b225aada0dfc1753e8d0f9ddc410a659fef4d293bb431bed5970e4091929",
                "MacAddress": "02:42:0a:00:00:02",
                "IPv4Address": "10.0.0.2/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4096",
            "com.docker.network.windowsshim.interface": "Ethernet 2"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "3af7970abd29",
                "IP": "192.168.65.3"
            }
        ]
    }
]

hnsdiag list networks

Сеть : C08CB7B8-9B3C-408E-8E30-5E16A3AEB444
    Имя             : Default Switch
    Тип             : ICS
    Адрес подсети   : 172.27.128.0/20
    Шлюз          : 172.27.128.1

Сеть : B95D0C5E-57D4-412B-B571-18A81A16E005
    Имя             : WSL
    Тип             : ICS
    Адрес подсети   : 172.22.96.0/20
    Шлюз          : 172.22.96.1

Get-VMSwitch

Имя           SwitchType NetAdapterInterfaceDescription
----           ---------- ------------------------------
Default Switch Internal
WSL            Internal

Для тестирования я просто попытался инициализировать swarm как менеджер:

docker swarm init
Swarm initialized: current node (lyk12wrxsk7cf2ma6wmln2m4m) is now a manager.

Чтобы добавить рабочего в этот swarm, выполните следующую команду:

    docker swarm join --token SW.. 192.168.65.3:2377

Сервис доступен из контейнера в сети ingress

nc -vz 192.168.65.3 2377
192.168.65.3 (192.168.65.3:2377) open

Таким образом, теоретически я мог бы развернуть контейнер службы Docker, который перенаправляет опубликованные порты хоста на службу Swarm, но должен быть лучший способ?

Обновление:
Я попытался перенаправить порты с помощью контейнера socat:

trajano/multisocat:latest   "/multisocat"            11 минут назад   Запущен 11 минут   0.0.0.0:12377->2377/tcp, 0.0.0.0:14789->4789/udp, 0.0.0.0:17946->7946/tcp, 0.0.0.0:17946->7946/udp   socat_relay.1.1ogxoypz2h1q0rxigh4hom8do

Оказывается, эти порты также не слушают на моем хосте! Хотя я использовал mode: host

- target: 4789
  published: 14789
  protocol: udp
  mode: host

Когда я запускаю свой хост как отдельный менеджер, порты на реле открываются на хосте.

Ответ или решение

Проблема недоступности узла-работника Docker Swarm на Windows

Ваша ситуация с недоступностью узла-работника Docker Swarm на Windows требует комплексного подхода для решения. В данном ответе мы рассмотрим основные причины проблем в вашем окружении, а также предложим некоторые шаги для их устранения.

Понимание сетевой архитектуры Docker Swarm

Docker Swarm использует несколько сетевых технологий, включая модули, такие как overlay и ingress, для управления распределенными контейнерами. Вы правы, что ingress-сеть связана с уникальными портами, такими как 7946 и 4789. Эти порты предназначены для управляемой коммуникации между узлами Swarm, но они не всегда доступны извне из-за ограничений, связанных с Hyper-V на Windows.

При этом, поскольку Windows использует Hyper-V, ваша система автоматически создает виртуальные сетевые адаптеры. Это может стать причиной конфликтов портов, которые вы наблюдаете, когда стараетесь привязать их к вашему хосту.

Проверка состояния сети

  1. Проверка конфигурации сети: Убедитесь, что ваша сеть Docker настроена правильно. Использование команды docker network inspect ingress позволяет вам увидеть текущее состояние сети. На основании вашего вывода видно, что ingress сеть настроена для использования overlay в виртуальной среде.

  2. Проверка открытых портов на хосте: Используйте такие инструменты, как netstat, чтобы проверить, какие порты действительно открыты на вашем Windows-хосте. Это необходимо, поскольку даже если Docker говорит, что порты не заняты, это может быть связано с работой других приложений или правилами брандмауэра.

Нахождение решения

  1. Настройка брандмауэра: Убедитесь, что ваш Windows Defender или сторонние брандмауэры настроены на разрешение трафика через 7946 и 4789. Это может быть необходимым шагом, чтобы сделать порты доступными для вашего узла-работника.

  2. Переопределение сетевого интерфейса: Попытка привязки ingress сети к вашему Ethernet адаптеру, как вы делали, несколько раз была доказана изолированной к тому, что она не работает с Hyper-V. Если возможно, попробуйте использовать другие сетевые адаптеры или настройки.

  3. Проверка статуса служб Docker: Выполните команду docker service ls, чтобы проверить, правильно ли работают ваши службы и не находятся ли они в состоянии сбоя. Это поможет понять, являются ли проблемы сетевыми или связанными с самим Docker.

  4. Кастомизация контейнерй: Использование Docker-сетевого контейнера для перенаправления портов, как вы уже пытались с socat, является разумным подходом, но может потребовать дополнительной настройки сети на хосте.

  5. Подключение к Linux-серверу: Если у вас есть возможность, настройте SSH туннелирование для подключения к вашему Linux-серверу из Windows. Это позволит вам тестировать и разрабатывать код локально через виртуальную частную сеть (VPN).

Заключение

Ваша задача по интеграции Windows-узла в Swarm сетевую архитектуру имеет множество потенциальных сложностей, особенно в свете ограничений Hyper-V. Это требует детального анализа текущих сетевых настроек и возможно, использования альтернативных решений для вашего рабочего процесса. Продолжайте отслеживать порты и сетевые подключения, а также экспериментируйте с различными способами туннелирования, чтобы найти наилучший функциональный подход.

Оцените материал
Добавить комментарий

Капча загружается...