Невозможно настроить NFS в Docker Swarm: “соединение отклонено”

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

Я пытаюсь использовать NFS-том в среде Docker Swarm. Вот мой compose:

volumes:
  data_links:
    driver: local
    driver_opts:
      type: "nfs"
      o: "nfsvers=4,addr=<скрыто>,rw"
      device: ":/docker/storage/links"

Но когда я пытаюсь развернуть это, я вижу в docker inspect:

"Err": "не удалось наполнить том: ошибка при монтировании тома '/var/lib/docker/volumes/links_data_links/_data': не удалось смонтировать локальный том: mount :/docker/storage/links:/var/lib/docker/volumes/links_data_links/_data, data: addr=<скрыто>: соединение отклонено",

Все управляющие и рабочие узлы имеют установленный nfs-common, и mount этого NFS-хранилища работает на каждом узле.
Если я разверну контейнер Docker с Ubuntu, установлю там nfs-common и попытаюсь смонтировать, у меня возникают проблемы с привилегиями. Я читал, что мне не нужен флаг привилегий для NFS-общего доступа.

Если я попробую сделать telnet на порты 111 и 2049 NFS-сервера, оба ответа (просто для теста соединения). Оба порта доступны через фаервол по TCP и UDP.

Если я запускаю это от имени root, у меня та же проблема с Docker Swarm.
Если я просто выполняю “docker compose up”, монтирование возможно.

(Я уже пробовал “type: “nfsv4″” и т.д. в docker-compose)

Только в Swarm я получаю соединение отклонено

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

Проблема с подключением NFS в Docker Swarm может возникать по нескольким причинам. Давайте рассмотрим возможные решения вашей проблемы с ошибкой "connection refused".

1. Проверка конфигурации NFS-сервера

Убедитесь, что ваш NFS-сервер правильно настроен и доступен для всех узлов Docker Swarm. Проверьте файл /etc/exports, чтобы убедиться, что разрешены подключения от всех необходимых IP-адресов и что доступные каталоги экспортируются корректно. Примерная запись в файле /etc/exports может выглядеть так:

/docker/storage/links *(rw,sync,no_subtree_check,no_root_squash)

После изменения файла /etc/exports, не забудьте выполнить команду:

exportfs -ra

2. Проверка сетевых настроек

Поскольку вы можете использовать telnet для подключения к портам 111 и 2049, это означает, что сеть настроена правильно. Однако всегда хорошо проверять наличие правил брандмауэра или других сетевых политик, которые могут препятствовать подключению. Убедитесь, что на всех узлах Swarm разрешены исходящие и входящие соединения к NFS-серверу.

3. Перепроверка указания устройства в объеме

Ваше определение тома выглядит корректно, однако убедитесь, что вы используете правильный адрес NFS-сервера и что он доступен с каждого узла в кластере. Убедитесь, что addr=<redacted> заменено на фактический IP-адрес вашего NFS-сервера.

4. Использование Docker Swarm и NFS

Docker Swarm может вести себя иначе, чем стандартный Docker, особенно когда дело касается управления томами. Подключение NFS не всегда работает так же, как в стандартном режиме. Поскольку вы можете успешно подключиться к NFS в обычном Docker с помощью docker compose up, но не в Swarm, это может быть связано с тем, что Swarm использует разные механизмы для управления томами.

5. Доступ к NFS: привилегии и права

Проблемы с правами доступа могут возникать из-за того, что контейнеры, запущенные в Swarm, могут работать с другими пользовательскими ID и могут сталкиваться с ограничениями по доступу к файлам NFS. Попробуйте настроить монтирование с использованием параметров, позволяющих не ограничивать доступ root (например, без no_root_squash). Также убедитесь, что UID и GID пользователя внутри контейнера совпадают с правами на NFS-сервере.

6. Служебные контейнеры

Если проблема продолжает существовать, попробуйте запустить служебный контейнер для отладки. Например, вы можете запустить контейнер с nfs-common и попытаться примонтировать том непосредственно для проверки конфигурации.

docker service create --name nfs-debug --mode global --pid host --privileged ubuntu:latest /bin/bash

В этом контейнере вы сможете выполнить проверку соединения и наладить требуемые зависимости.

Заключение

После выполнения всех этих шагов попробуйте снова запустить ваше приложение в Docker Swarm. Если ошибка "connection refused" по-прежнему возникает, попробуйте просмотреть журналы как на сервере NFS, так и на узлах Swarm, чтобы выявить конкретные ошибки или предупреждения. Важно подробно документировать все изменения и тесты, которые вы проводите, чтобы лучше понять, где именно может быть проблема.

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

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