glusterfs in docker swarm

Thank you for reading this post, don't forget to subscribe!

Если необ­хо­ди­мо что­бы одни и те же дан­ные были доступ­ны на раз­ных сер­ве­рах, и уже уста­нов­лен ceph как блоч­ное устрой­ство и вы реши­ли уста­но­вить glusterfs то у вас это не полу­чит­ся из-за того, что ceph и gluster исполь­зу­ют одну и ту же биб­лио­те­ку, но раз­ных вер­сий. (решить дан­ную про­бле­му мне не уда­лось, поэто­му встре­чай­те сле­ду­ю­щий костыль:)

Под­ни­ма­ем gluster в docker кон­тей­не­рах, для это­го нам пона­до­бит­ся уже собран­ный swarm кластер.
Опи­шу руч­ную установку:
на swarm master созда­ём оverlay сеть:
docker network create -d overlay --attachable netgfs

на всех нодах выпол­ня­ем сле­ду­ю­щие команды:
mkdir /etc/glusterfs

mkdir /var/lib/glusterd

mkdir /var/log/glusterfs

mkdir -p /bricks/brick1/gv0

mkdir /datavol

mount --bind /datavol /datavol

mount --make-shared /datavol

далее запус­ка­ем кон­тей­не­ры на соот­вет­ству­ю­щих нодах:
docker run --restart=always --name gfsc1 -v /bricks:/bricks -v /etc/glusterfs:/etc/glusterfs:z -v /var/lib/glusterd:/var/lib/glusterd:z -v /var/log/glusterfs:/var/log/glusterfs:z -v /sys/fs/cgroup:/sys/fs/cgroup:ro --mount type=bind,source=/datavol,target=/datavol,bind-propagation=rshared -d --privileged=true --net=netgfs -v /dev/:/dev gluster/gluster-centos

 

docker run --restart=always --name gfsc2 -v /bricks:/bricks -v /etc/glusterfs:/etc/glusterfs:z -v /var/lib/glusterd:/var/lib/glusterd:z -v /var/log/glusterfs:/var/log/glusterfs:z -v /sys/fs/cgroup:/sys/fs/cgroup:ro --mount type=bind,source=/datavol,target=/datavol,bind-propagation=rshared -d --privileged=true --net=netgfs -v /dev/:/dev gluster/gluster-centos

 

docker run --restart=always --name gfsc3 -v /bricks:/bricks -v /etc/glusterfs:/etc/glusterfs:z -v /var/lib/glusterd:/var/lib/glusterd:z -v /var/log/glusterfs:/var/log/glusterfs:z -v /sys/fs/cgroup:/sys/fs/cgroup:ro --mount type=bind,source=/datavol,target=/datavol,bind-propagation=rshared -d --privileged=true --net=netgfs -v /dev/:/dev gluster/gluster-centos

после чего с одной из нод при­со­еди­ня­ем­ся к кон­тей­не­ру, добав­ля­ем пиров созда­ём volume, стар­ту­ем его и мон­ти­ру­ем директорию:
docker exec -it gfsc1 bash

gluster peer probe gfsc2

gluster peer probe gfsc3

gluster volume create gv0 replica 3 gfsc1:/bricks/brick1/gv0 gfsc2:/bricks/brick1/gv0 gfsc3:/bricks/brick1/gv0

gluster volume start gv0

mount.glusterfs gfsc1:/gv0 /datavol

 

По сути всё, 3 масте­ра мож­но их исполь­зо­вать, дирек­то­рия для хра­не­ния дан­ных /datavol  кли­ен­тов под­клю­ча­ем сле­ду­ю­щим образом:
Созда­ём дирек­то­рию scripts в ней файл run.sh со сле­ду­ю­щим содержимым:
#!/bin/bash

echo $$

trap 'trap - TERM; umount /datavol; kill -s TERM -- -$$' TERM

while true; do

mount.glusterfs $1:/gv0 /datavol

if [ $? -eq 0 ]

then

break

fi

sleep 1

done

tail -f /dev/null & wait

 

exit 0

кон­тей­не­ры запус­ка­ем сле­ду­ю­щим образом:
docker run --restart=always --name gfsm1 -v $(pwd)/scripts:/scripts --mount type=bind,source=/datavol,target=/datavol,bind-propagation=rshared -d --privileged=true --net=netgfs gluster/glusterfs-client /scripts/run.sh gfsc1

 

docker run --restart=always --name gfsm2 -v $(pwd)/scripts:/scripts --mount type=bind,source=/datavol,target=/datavol,bind-propagation=rshared -d --privileged=true --net=netgfs gluster/glusterfs-client /scripts/run.sh gfsc2

 

docker run --restart=always --name gfsm3 -v $(pwd)/scripts:/scripts --mount type=bind,source=/datavol,target=/datavol,bind-propagation=rshared -d --privileged=true --net=netgfs gluster/glusterfs-client /scripts/run.sh gfsc3

 

Гото­во.
##################################################################################

Дан­ный скрипт необ­хо­ди­мо запус­кать на swarm master. В нём име­ет­ся 3 основ­ные пере­мен­ные кото­рые мы добав­ля­ем, это:
datadir - дирек­то­рия кото­рой у нас будут рас­ша­рен­ные файлы,
gluster_server - пере­чис­лен­ные через про­бел
gluster сервера(рекомендовано исполь­зо­вать нечёт­ное коли­че­ство, что­бы обра­зо­вал­ся кворум)
name_glusternet - имя овер­лей подсети(влияет толь­ко на визу­аль­ную состав­ля­ю­щую, чтоб знать какая сеть на что отвечает)
кон­тей­не­ры будут назы­вать­ся сле­ду­ю­щим обра­зом:
glusterИМЯНОДЫ
кли­ен­ты будут мон­ти­ро­вать­ся к пер­во­му сер­ве­ру в спис­ке gluster_server

для запус­ка, созда­ём файл gluster.sh на сварм масте­ре с ниже ука­зан­ным содер­жи­ми и запус­ка­ем его:

[codesyntax lang="bash" blockstate="collapsed"]

[/codesyntax]

 

что­бы уда­лить все дан­ные и кон­тей­не­ры, то запус­ка­ем сле­ду­ю­щий скрипт:
 [codesyntax lang="bash"]

[/codesyntax]