Не удается запустить NFS в Docker Swarm

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

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

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" указывает на то, что контейнеры не могут установить соединение с NFS-сервером. Давайте рассмотрим несколько шагов для устранения этой проблемы.

Шаги по устранению проблемы:

  1. Проверка доступа к NFS-серверу:
    Убедитесь, что все узлы кластера Docker Swarm могут подключаться к NFS-серверу. Выполните команду showmount -e <адрес NFS-сервера> на каждом узле, чтобы проверить, доступны ли экспортируемые ресурсы.

  2. Использование IP-адреса:
    Убедитесь, что в конфигурации Docker Compose вместо <redacted> у вас указан корректный IP-адрес NFS-сервера. Попробуйте использовать явный IP-адрес вместо его DNS-имени, чтобы исключить возможные проблемы с разрешением имени.

  3. Файловые права на NFS-сервере:
    Проверьте, что пользователь (или UID) под которым работает контейнер, имеет соответствующие права на доступ к каталогу /docker/storage/links на NFS-сервере. Вы можете временно настроить права доступа на NFS-сервер на 777 для тестирования.

  4. Проверка конфигурации NFS:
    Проверьте конфигурацию NFS-сервера, в частности параметры в /etc/exports. Убедитесь, что клиентские узлы (IP-адреса) имеют разрешение на доступ и корректно настроены в файле.

    Например, запись в /etc/exports может выглядеть следующим образом:

    /docker/storage/links *(rw,sync,no_subtree_check,no_root_squash)
  5. Проверка параметров фаервола:
    Убедитесь, что фаервол не блокирует порты 111 и 2049 как для TCP, так и для UDP на NFS-сервере. Проверьте настройки фаервола и если необходимо, временно отключите его для тестирования.

  6. Обновление Docker Compose:
    Возможно, вам стоит попробовать обновить Docker и Docker Compose до последних стабильных версий, так как проблемы могут быть исправлены в более поздних версиях.

  7. Отладка в Docker Swarm:
    Попробуйте запустить контейнеры с NFS-томом в режиме --privileged (только для тестирования). Это поможет выявить, связана ли проблема с привилегиями:

    docker service create --name <service_name> --mode replicated --replicas 1 --mount type=volume,source=data_links,target=/path/in/container --privileged <image_name>
  8. Логи и диагностика:
    Изучите логи на всех узлах Swarm для выявления дополнительных сообщений об ошибках, которые могут помочь в диагностике. Используйте docker service logs <service_name>.

Если вышеуказанные шаги не помогли, пожалуйста, предоставьте дополнительную информацию о конфигурации вашего NFS-сервера и узлов Swarm. Это поможет более точно диагностировать проблему.

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

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