Как Docker Swarm реализует совместное использование томов?

Docker Swarm может управлять двумя типами хранилищ:

volume и bind

Хотя bind не предлагается в документации Docker, поскольку он создает привязку между локальным каталогом (на каждом узле роя) с задачей, реализация volume не упоминается, поэтому я не понимаю, как тома распределяются между задачами?

  • Как Docker Swarm распределяет тома между узлами?
  • Где хранятся тома (на менеджере? А если менеджеров больше одного?)
  • Нет ли проблем между узлами, если они работают на разных машинах в разных сетях?
  • Он создает VPN?

person alessandro308    schedule 11.12.2017    source источник
comment
Есть ли у Swarm общие тома? Примерно год назад я имел дело с роем докеров, но я думаю, что рой НЕ отвечает за совместное использование томов между узлами. Если вы хотите, чтобы ваши узлы использовали один и тот же том, вам нужно использовать плагины томов, такие как azure volumedriver.   -  person Munchkin    schedule 11.12.2017


Ответы (5)


То, о чем вы спрашиваете, - это общий вопрос. Данные тома и возможности того, что он может делать, управляются драйвером тома. Точно так же, как вы можете использовать разные сетевые драйверы, такие как overlay, bridge или host, вы можете использовать разные драйверы тома.

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

Вам нужен плагин стороннего драйвера, который поддерживает Swarm и гарантирует, что том, который вы создали для служебной задачи, будет доступен на нужном узле в нужное время. Варианты включают использование «Docker для AWS / Azure» и включенного в него CloudStor или популярное решение REX-Ray с открытым исходным кодом.

Существует множество сторонних драйверов тома, которые вы можете найти в Docker Store .

person Bret Fisher    schedule 12.12.2017
comment
Может ли hadoop выступать в роли такого общего тома? - person stackit; 25.09.2020

Сам Swarm Mode не делает ничего другого с томами, он запускает любую команду монтирования тома, которую вы вводите на узле, на котором работает контейнер. Если ваш том монтируется локально для этого узла, то ваши данные будут сохранены локально на этом узле. Нет встроенных функций для автоматического перемещения данных между узлами.

Существуют программные решения для распределенного хранения данных, такие как GlusterFS, и у Docker есть одно под названием Infinit, которое еще не является GA, и его разработка отошла на задний план по сравнению с интеграцией Kubernetes в EE.

Типичный результат: вам либо нужно управлять репликацией хранилища в вашем приложении (например, etcd и другие алгоритмы на основе raft), либо вы выполняете монтирование во внешней системе хранения (надеюсь, с ее собственной HA). Существует два варианта монтирования внешней системы хранения: блочное или файловое. Блочное хранилище (например, EBS) обычно имеет более высокую производительность, но может быть установлено только на одном узле. Для этого вам обычно понадобится сторонний драйвер подключаемого модуля тома, чтобы предоставить вашему докер-узлу доступ к этому блочному хранилищу. Файловое хранилище (например, EFS) имеет более низкую производительность, но более портативно и может быть одновременно установлено на нескольких узлах, что полезно для реплицированной службы.

Самым распространенным сетевым хранилищем на основе файлов является NFS (тот же протокол, что и EFS). И вы можете смонтировать это без каких-либо сторонних драйверов плагинов. К сожалению, названный драйвер подключаемого модуля «локального» тома, который поставляется с докером, дает вам возможность передавать любые значения, которые вы хотите, команде монтирования с параметрами драйвера, и без параметров по умолчанию тома хранятся в каталоге докера / var / lib / докер / тома. С помощью параметров вы можете передать ему параметры NFS, и он даже будет выполнять поиск DNS по имени хоста NFS (чего обычно нет в NFS). Вот пример различных способов монтирования файловой системы NFS с помощью драйвера локального тома:

  # create a reusable volume
  $ docker volume create --driver local \
      --opt type=nfs \
      --opt o=nfsvers=4,addr=192.168.1.1,rw \
      --opt device=:/path/to/dir \
      foo

  # or from the docker run command
  $ docker run -it --rm \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \
    foo

  # or to create a service
  $ docker service create \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \
    foo

  # inside a docker-compose file
  ...
  volumes:
    nfs-data:
      driver: local
      driver_opts:
        type: nfs
        o: nfsvers=4,addr=192.168.1.1,rw
        device: ":/path/to/dir"
  ...

Если вы используете пример файла композиции в конце, обратите внимание, что изменения в томе (например, обновление пути или адреса сервера) не отражаются в существующих именованных томах, пока они существуют. Вам нужно либо переименовать свой том, либо удалить его, чтобы позволить swarm воссоздать его с новыми значениями.

Другая распространенная проблема, с которой я сталкиваюсь в большинстве случаев использования NFS, - это включение на сервере "корневого сквоша". Это приводит к проблемам с разрешениями, когда контейнеры, работающие с правами root, пытаются записать файлы на том. У вас также есть аналогичные проблемы с разрешениями UID / GID, когда UID / GID контейнера - это тот, который требует разрешений для записи в том, что может потребовать настройки владельца каталога и разрешений на сервере NFS.

person BMitch    schedule 03.09.2018

Мое решение для нашего локально размещенного роя: каждый рабочий узел смонтировал общий ресурс nfs, предоставляемый нашим файловым сервером на /mnt/docker-data. Когда я определяю тома в своих сервисах для создания файлов, я устанавливаю для устройства некоторый путь в /mnt/docker-data, например:

volumes:
  traefik-logs:
    driver: local
    driver_opts:
      o: bind
      device: /mnt/docker-data/services/traefik/logs
      type: none

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

Если вы внимательно посмотрите на файловую систему узлов, вы увидите, что монтирования к моему файловому серверу создаются в /var/lib/docker/volumes, см. Здесь:

root@node-3:~# df -h
Dateisystem                                                                                                   Größe Benutzt Verf. Verw% Eingehängt auf
[...]
fs.mydomain.com:/srv/shares/docker-data/services/traefik/logs                                 194G    141G   53G   73% /var/lib/docker/volumes/traefik_traefik-logs/_data
person tigu    schedule 10.12.2019

Мое решение для AWS EFS, которое работает:

  1. Создать EFS ( не забудьте открыть порт NFS 2049 в группе безопасности)
  2. Установите пакет nfs-common:

    sudo apt-get install -y nfs-common

  3. Проверьте, работает ли ваш efs:

    mkdir efs-test-point
    sudo chmod go+rw efs-test-point
    sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport [YOUR_EFS_DNS]:/ efs-test-point
    touch efs-test-point/1.txt
    sudo umount efs-test-point/
    ls -la efs-test-point/

    каталог должен быть пустым

    sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport [YOUR_EFS_DNS]:/ efs-test-point

    ls -la efs-test-point/

    файл 1.txt должен существовать

  4. Настройте файл docker-compose.yml:

    services:
      sidekiq:
        volumes:
          - uploads_tmp_efs:/home/application/public/uploads/tmp
      ...
    volumes:
      uploads_tmp_efs:
        driver: local
        driver_opts:
          type: nfs
          o: addr=[YOUR_EFS_DNS],nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2
          device: [YOUR_EFS_DNS]:/

person super_p    schedule 12.10.2018

по умолчанию swarm всегда будет искать драйвер локального тома, поэтому лучше всего

  1. создать общий ресурс nfs, т.е. yum -y install nfs-utils
  2. экспортируйте его в / etc / exports, как показано ниже, /root/nfshare 192.168.1.0/24(rw,sync,no_root_squash)
  3. открыть необходимые порты, в моем случае я сделал это ниже, firewall-cmd --permanent --add-service mountd ; firewall-cmd --permanent --add-service rpc-bind ; firewall-cmd --permanent --add-service nfs ; firewall-cmd --zone=public --permanent --add-port 2049/tcp
  4. смонтировать вновь созданный общий ресурс на рабочие узлы докеров, а затем
  5. docker service create --name my-web --replicas 3 -p 80:80 --mount 'type=volume,source=nfshare,target=/usr/share/nginx/html/,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/root/nfshare,"volume-opt=o=addr=192.168.1.8,rw"' nginx:latest
  6. в приведенном выше примере я создал nfshare на хосте 192.168.1.8 и экспортировал его с помощью файла / etc / exports
  7. запустил демон (ы) systemctl start nfs-server rpcbind & systemctl enable nfs-server rpcbind
  8. exportfs -r, чтобы изменения вступили в силу
  9. / root / nfshare имеет мой собственный index.html 10. внимательно проверьте запись на томе, он также может быть внешним, и у меня это сработало
  10. для получения дополнительной информации https://docs.docker.com/storage/volumes/
person ganesh    schedule 02.01.2021
comment
Мне не нравятся все решения NFS, упомянутые в ответах. Это создаст единую точку отказа. Либо используйте распределенную файловую систему, например GlusterFS, либо просто попробуйте избавиться от необходимости в распределенных томах (например, используйте БД, которая может поддерживать совместное использование файлов, например GridFS в MongoDB). - person Csongor Fagyal; 04.03.2021
comment
Мне нравится идея GridFS. Для меня GlusterFS была полным glusterf *, который постоянно отключал и сбрасывал все при развертывании на узлах цифрового океана. Массивная единая точка отказа. Я посмотрел на GridFS и прочитал следующее: Не используйте GridFS, если вам нужно обновить содержимое всего файла атомарно. Так что, если вы планируете обновлять файлы, например сертификаты SSL, должно быть что-то получше ... - person Jimbo; 22.06.2021