Як Docker Swarm реалізує розподіл гучності?


93

Docker Swarm може керувати двома типами сховищ:

volume і bind

Хоча bindDocker Documentation не пропонує, оскільки вона створює прив'язку між локальним каталогом (на кожному ройовому вузлі) до завдання, volumeреалізація не згадується, тому я не розумію, як томи розподіляються між завданнями?

  • Як Docker Swarm розподіляє обсяги між вузлами?
  • Де зберігаються томи (у менеджера? А якщо менеджера більше одного?)
  • Чи немає проблем між вузлами, якщо вони працюють на різних машинах у різних мережах?
  • Чи створює він VPN?

1
Чи розділяє Рой обсяги? Близько року тому я мав справу з докер-роєм, але я думаю, що рой НЕ відповідає за розподіл томів між вузлами. Якщо ви хочете, щоб ваші вузли мали однаковий том, вам доведеться використовувати плагіни для обсягу, такі як azure volumedriver.
Munchkin

Відповіді:


66

Те, про що ви запитуєте, є загальним питанням. Даними обсягу та особливостями того, що може зробити цей том, керує драйвер обсягу. Так само , як ви можете використовувати різні мережеві драйвери , як overlay, bridgeабоhost , ви можете використовувати різні драйвера гучності.

Docker та Swarm постачаються лише зі стандартним localдрайвером, який не виходить з коробки. Він не знає про Swarm, і він просто створить нові томи для ваших даних на будь-якому вузлі, на який заплановані ваші сервісні завдання. Зазвичай це не те, що ви хочете.

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

Є безліч сторонніх драйверів, які ви можете знайти в магазині Docker .


чи може hadoop виступати як такий спільний том?
стекіт

55

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

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

Типовий результат - вам або потрібно керувати реплікацією сховища у вашому додатку (наприклад, etcd та інші алгоритми, засновані на плотах), або ви виконуєте монтування на зовнішній системі зберігання (сподіваємось, із власною 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"
  ...

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

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


9

Моє рішення для AWS EFS, яке працює:

  1. Створіть EFS (не забудьте відкрити порт NFS 2049 у групі безпеки)
  2. Встановіть загальний пакет nfs:

    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:

    послуги:
      sidekiq:
        обсяги:
          - uploads_tmp_efs: / home / application / public / uploads / tmp
      ...
    обсяги:
      uploads_tmp_efs:
        водій: місцевий
        driver_opts:
          тип: nfs
          o: addr = [YOUR_EFS_DNS], nfsvers = 4.1, rsize = 1048576, wsize = 1048576, жорсткий, timeo = 600, ретрансляції = 2
          пристрій: [YOUR_EFS_DNS]: /


6

Моє рішення для нашого локального рію: кожен робочий вузол встановив nfs-share, наданий нашим файловим сервером /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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.