Rate this post

Здесь мы рассмотрим как создать кластер из трех нод Docker Swarm с подключить ко всем нодам общий реплицируемый том на GlusterFS.nnДля созданий кластера из Docker хостов, используется Docker Swarm. Особенность в том, что если контейнер А с используемым им томом voltdata запущен на ноде1, то все внесенные изменения сохраняются локально на ноде1. В случае выключения контейнера А, а потом запуска например на ноде3, и подключении тома voldata — данных на хранилище не будет, и не будет тех внесенных изменений, которые были сделаны на ноде1.n

Как решить это ограничение?

Решения могут быть разными, расмотрим решение с использованием репликацию томов с GlusterFS, это обеспечить постоянную доступность данных с любой из нод. Не смотря на это имя тома на каждом Docker хосте будет локальным.nnВ примере использованы три инстанса AWS EC2, у каждого по тому EBS.n

Настройка серверов

На всех серверах установим Ubuntu 16.04nnВнесем изменения в /etc/hosts укажем имена нодn

XX.XX.XX.XX node_1nXX.XX.XX.XX node_2nXX.XX.XX.XX node_3

Обновим пакеты и ОСn

sudo apt updatensudo apt upgrade

Перезагрузим сервера и установим нужные пакет для всех нодn

sudo apt install -y docker.ionsudo apt install -y glusterfs-server

выполним запуск сервисовn

sudo systemctl start glusterfs-servernsudo systemctl start docker

Далее создаем хранилище GlusterFSn

sudo mkdir -p /gluster/data /swarm/volumes

Настройка GlusterFS

Выполним подготовку файловой системы GlusterFS на всех нодахn

sudo mkfs.xfs /dev/xvdbnsudo mount /dev/xvdb /gluster/data/

На node_1n

$ sudo gluster peer probe node_2 npeer probe: success.n$ sudo gluster peer probe node_3 npeer probe: success.

Создание реплицируемого томяnnsudo gluster volume create swarm-vols replica 3 node_1:/gluster/data node_2:/gluster/data node_3:/gluster/data force nnДадим разрешения на монтирование только с локального хостаn

sudo gluster volume set swarm-vols auth.allow 127.0.0.1n

Выполним запуск томаn

sudo gluster volume start swarm-vols

Монтируем его для каждой нодыn

sudo mount.glusterfs localhost:/swarm-vols /swarm/volumes

Настройка Docker swarm

Создадим управляющий узел и два рабочихn

sudo docker swarm init nSwarm initialized: current node (82f5ud4z97q7q74bz9ycwclnd) is now a manager.n To add a worker to this swarm, run the following command: n     docker swarm join \ n     --token SWMTKN-1-697xeeiei6wsnsr29ult7num899o5febad143ellqx7mt8avwn-1m7wlh59vunohq45x3g075r2h \ n     172.32.24.235:2377 nTo add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Для рабочих узлов получаем токенn

sudo docker swarm join-token worker nTo add a worker to this swarm, run the following command: n    ```docker docker swarm join \n    --token SWMTKN-1-697xeeiei6wsnsr29ult7num899o5febad143ellqx7mt8avwn-1m7wlh59vunohq45x3g075r2h \ n    172.32.24.235:2377

На двух рабочих узлах введем командуnnsudo docker swarm join —token SWMTKN-1-697xeeiei6wsnsr29ult7num899o5febad143ellqx7mt8avwn-1m7wlh59vunohq45x3g075r2h 172.32.24.235:2377nnВыполним проверку swarm кластераn

sudo docker node ls nID                        HOSTNAME            STATUS AVAILABILITY MANAGER STATUS n6he3dgbanee20h7lul705q196 ip-172-32-27-191    Ready Activen82f5ud4z97q7q74bz9ycwclnd * ip-172-32-24-235  Ready Active        Leadernc7daeowfoyfua2hy0ueiznbjo ip-172-32-26-55     Ready Active

Испытание

Выполним создание меток для node_1 и node_3, и создание контейнера node_1. Затем выключим его, и создадим на node_3, смонтировав такие же томаи проверим остались файлы, которые были созданы при работе на node_1nnУстановка метокn

sudo docker node update --label-add nodename=node1 ip-172-32-24-235nsudo docker node update --label-add nodename=node3 ip-172-32-26-55

Проверяемn

sudo docker node inspect --pretty ip-172-32-26-55nID: c7daeowfoyfua2hy0ueiznbjo nLabels: - nodename = node_3 nHostname: ip-172-32-26-55nJoined at: 2017-02-05 22:44:17.323236832 +0000 utc nStatus: State: Ready nAvailability: Active nPlatform: Operating System: linux nArchitecture: x86_64 nResources: nCPUs: 1 nMemory: 1.952 GiB nPlugins: nNetwork: bridge, host, null, overlay nVolume: local Engine Version: 1.12.1

Создаем докер на node_1 для тестирования общего хранилищаnnsudo docker service create —name testcon —constraint ‘node.labels.nodename == node1’ —mount type=bind,source=/swarm/volumes/testvol,target=/mnt/testvol /bin/touch /mnt/testvol/testfile1.txt nnПроверяемn

sudo docker service lsnID           NAME    REPLICAS IMAGE   COMMANDnduvqo3btdrrl testcon 0/1      busybox /bin/bash

Проверим, что запущен на первой нодеn

sudo docker service ps testconn ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERRORn6nw6sm8sak512x24bty7fwxwz testcon.1 ubuntu:latest ip-172-32-24-235n Ready Ready 1 seconds ago n6ctzew4b3rmpkf4barkp1idhx \_ testcon.1 ubuntu:latest ip-172-32-24-235 Shutdown nComplete 1 seconds ago

Проверим монтирование томовn

$ sudo docker inspect testconn[n    {n        "ID": "8lnpmwcv56xwmwavu3gc2aay8",n        "Version": {n            "Index": 26n        },n        "CreatedAt": "2017-02-05T23:03:01.93363267Z",n        "UpdatedAt": "2017-02-05T23:03:01.935557744Z",n        "Spec": {n            "ContainerSpec": {n                "Image": "busybox",n                "Args": [n                    "/bin/bash"n                ],n                "Mounts": [n                    {n                        "Type": "bind",n                        "Source": "/swarm/volumes/testvol",n                        "Target": "/mnt/testvol"n                    }n                ]n            },n            "Resources": {n                "Limits": {},n                "Reservations": {}n            },n            "RestartPolicy": {n                "Condition": "any",n                "MaxAttempts": 0n            },n            "Placement": {n                "Constraints": [n                    "nodename == node_1"n                ]n            }n        },n        "ServiceID": "duvqo3btdrrlwf61g3bu5uaom",n        "Slot": 1,n        "Status": {n            "Timestamp": "2017-02-05T23:03:01.935553276Z",n            "State": "allocated",n            "Message": "allocated",n            "ContainerStatus": {}n        },n        "DesiredState": "running"n    }n]

Выключаем и создаем на третьей нодеn

sudo docker service create --name testcon --constraint 'node.labels.nodename == node_3' --mount type=bind,source=/swarm/volumes/testvol,target=/mnt/testvol ubuntu:latest /bin/touch /mnt/testvol/testfile3.txt

Проверяем где запущенn

sudo docker service ps testconnID                         NAME           IMAGE          NODE             DESIRED STATE  CURRENT STATE           ERRORn5p57xyottput3w34r7fclamd9  testcon.1      ubuntu:latest  ip-172-32-26-55  Ready          Ready 1 seconds ago     naniesakdmrdyuq8m2ddn3ga9b   \_ testcon.1  ubuntu:latest  ip-172-32-26-55  Shutdown       Complete 2 seconds ago

В результате мы увидим, что файлы созданные в разных контейнерах, хранятся в одном хранилищеn

 ls -l /swarm/volumes/testvol/ntotal 0n-rw-r--r-- 1 root root 0 Feb  5 23:59 testfile3.txtn-rw-r--r-- 1 root root 0 Feb  5 23:58 testfile1.txt

Нужна установка, настройка или поддержка docker? Обращайтесь [email protected]