Здесь мы рассмотрим как создать кластер из трех нод 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]