Swarm c распределённым файлохранилищем glusterfs

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

Име­ем уста­нов­лен­ный сварм кла­стер 3 масте­ра 3 слейва:
[codesyntax lang="php"]

[/codesyntax]

ста­вим на ВСЕ ноды репозиторий:
yum install -y centos-release-gluster5.noarch

Уста­нав­ли­ва­ем сер­вер­ную часть GlusterFS

yum install -y glusterfs gluster-cli glusterfs-libs glusterfs-server

у нас это будут слейвы:
[root@swarm-node1-183 ~]# yum install -y glusterfs gluster-cli glusterfs-libs glusterfs-server
[root@swarm-node2-184 ~]# yum install -y glusterfs gluster-cli glusterfs-libs glusterfs-server
[root@swarm-node3-185 ~]# yum install -y glusterfs gluster-cli glusterfs-libs glusterfs-server

Далее запус­ка­ем служ­бу glusterd и добав­ля­ем в автозагрузку;

systemctl start glusterd

systemctl enable glusterd

[root@swarm-node1-183 ~]# systemctl start glusterd
[root@swarm-node1-183 ~]# systemctl enable glusterd
[root@swarm-node2-184 ~]# systemctl start glusterd
[root@swarm-node2-184 ~]# systemctl enable glusterd
[root@swarm-node3-185 ~]# systemctl start glusterd
[root@swarm-node3-185 ~]# systemctl enable glusterd

отклю­ча­ем сете­вой экран и SELinux.
vi /etc/sysconfig/selinux

SELINUX=disabled

При­ме­ча­ние: Во избе­жа­ние раз­лич­ных про­блем, реко­мен­ду­ет­ся исполь­зо­вать служ­бу NTP для син­хро­ни­за­ции вре­ме­ни сер­ве­ров хра­не­ния и кли­ен­тов, а так­же исполь­зо­вать DNS вме­сто локаль­ных фай­лов hosts.

но мы всё рав­но доба­вим всё через /etc/hosts на всех тачках:
192.168.1.180 swarm-master1-180
192.168.1.181 swarm-master2-181
192.168.1.182 swarm-master3-182
192.168.1.183 swarm-node1-183
192.168.1.184 swarm-node2-184
192.168.1.185 swarm-node3-185
192.168.1.190 swarm-gluster

Уста­нав­ли­ва­ем кли­ент­скую часть GlusterFS на ВСЕХ нодах

yum install glusterfs-client -y

[root@swarm-master1-180] yum install glusterfs-client -y
[root@swarm-master2-181] yum install glusterfs-client -y
[root@swarm-master3-182] yum install glusterfs-client -y
[root@swarm-node1-183] yum install glusterfs-client -y
[root@swarm-node2-184] yum install glusterfs-client -y
[root@swarm-node3-185] yum install glusterfs-client -y

 

Ставим виртуальный IP на слейв ноды:

[root@swarm-node1-183] yum install keepalived -y
[root@swarm-node2-184] yum install keepalived -y
[root@swarm-node3-185] yum install keepalived -y

/etc/sysctl.conf

Вклю­ча­ем марш­ру­ти­за­цию пакетов
net.ipv4.ip_forward=1
sysctl -p

[root@swarm-node1-183 ~]# vim /etc/keepalived/keepalived.conf

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

[/codesyntax]
systemctl enable keepalived
systemctl start keepalived

 

[root@swarm-node2-184 ~]# cat /etc/keepalived/keepalived.conf

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

[/codesyntax]
systemctl enable keepalived
systemctl start keepalived

[root@swarm-node3-185 ~]# cat /etc/keepalived/keepalived.conf

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

[/codesyntax]

systemctl enable keepalived
systemctl start keepalived

СОЗДАНИЕ ТОМОВ

доба­вим дис­ки на кото­рых будет создано
[root@swarm-node1-183 ~]# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
[root@swarm-node1-183 ~]# vgextend centos /dev/sdb
Volume group "centos" successfully extended
[root@swarm-node1-183 ~]# lvcreate -n gluster -L 5G centos
Logical volume "gluster" created.
[root@swarm-node1-183 ~]# mkfs.ext4 -L gluster /dev/mapper/centos-gluster
[root@swarm-node1-183 ~]# mkdir /gluster
[root@swarm-node1-183 ~]# mount /dev/mapper/centos-gluster /gluster/

[root@swarm-node1-183 ~]# cat /etc/fstab | grep gluster
/dev/mapper/centos-gluster /gluster ext4 defaults 1 2

Преж­де чем создать рас­пре­де­лен­ный по несколь­ким узлам том, необ­хо­ди­мо объ­еди­нить сер­ве­ры в дове­рен­ный пул.

[root@swarm-node1-183 ~]# gluster peer probe swarm-node2-184
peer probe: success.
[root@swarm-node1-183 ~]# gluster peer probe swarm-node3-185
peer probe: success.
[root@swarm-node1-183 ~]#

Создание Replicated-тома

Пожа­луй самая про­стая конфигурация.

[root@swarm-node1-183 ~]# gluster volume create tom-for-files replica 3 swarm-node1-183:/gluster/gv01 swarm-node2-184:/gluster/gv01 swarm-node3-185:/gluster/gv01
volume create: tom-for-files: success: please start the volume to access data

 Здесь tom-for-files — это имя созда­ва­е­мо­го тома, а replica 3 — его кон­фи­гу­ра­ция кото­рая гово­рит о том, что дан­ные будут хра­нить­ся в трёх экзем­пля­рах, на swarm-node1-183:/gluster/gv01 swarm-node2-184:/gluster/gv01 swarm-node3-185:/gluster/gv01 соответственно.

Далее запус­ка­ем том;
[root@swarm-node1-183 ~]# gluster volume start tom-for-files
volume start: tom-for-files: success

 

Полу­чить инфор­ма­цию о кон­фи­гу­ра­ции тома мож­но с помо­щью коман­ды info:

[root@swarm-node1-183 ~]# gluster volume info tom-for-files

Volume Name: tom-for-files
Type: Replicate
Volume ID: ebee7c79-5ec2-4b7e-ad82-f79d81a038f0
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: swarm-node1-183:/gluster/gv01
Brick2: swarm-node2-184:/gluster/gv01
Brick3: swarm-node3-185:/gluster/gv01
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

МОНТИРОВАНИЕ ТОМОВ

Наи­бо­лее попу­ляр­ные сред­ства для досту­па к Gluster-тому это NFS и соб­ствен­ный клиент(Gluster Native Client)

созда­ём дирек­то­рию на ВСЕХ нодах к кото­рой будем мон­ти­ро­вать наше хранилище:
mkdir /swarm-vol

на сер­ве­рах гла­сте­ра мон­ти­ру­ем от локалхоста
[root@swarm-node1-183 ~]# mount.glusterfs localhost:/tom-for-files /swarm-vol/
[root@swarm-node2-184 ~]# mount.glusterfs localhost:/tom-for-files /swarm-vol/
[root@swarm-node3-185 ~]# mount.glusterfs localhost:/tom-for-files /swarm-vol/

на кли­ен­тах гла­сте­ра мон­ти­ру­ем с вир­ту­аль­ным ip:
[root@swarm-master1-180 ~]# mount.glusterfs swarm-gluster:/tom-for-files /swarm-vol/
[root@swarm-master2-181 ~]# mount.glusterfs swarm-gluster:/tom-for-files /swarm-vol/
[root@swarm-master3-182 ~]# mount.glusterfs swarm-gluster:/tom-for-files /swarm-vol

так же пра­вим вла­дель­ца дирек­то­рии что­бы все мог­ли писать в неё:
chmod 777 /swarm-vol/

Добав­ля­ем строч­ку в /etc/fstab вида:

gl01.mydomain.com:/<имя_тома> /<каталог_монтирования> glusterfs defaults,_netdev 0 0

[root@swarm-master1-180 ~]# cat /etc/fstab| grep swarm
swarm-gluster:/tom-for-files /swarm-vol glusterfs defaults,_netdev 0 0
[root@swarm-master2-181 ~]# cat /etc/fstab| grep swarm
swarm-gluster:/tom-for-files /swarm-vol glusterfs defaults,_netdev 0 0
[root@swarm-master3-182 ~]# cat /etc/fstab| grep swarm
swarm-gluster:/tom-for-files /swarm-vol glusterfs defaults,_netdev 0 0
[root@swarm-node1-183 ~]# cat /etc/fstab | grep swarm
localhost:/tom-for-files /swarm-vol glusterfs defaults,_netdev 0 0
[root@swarm-node2-184 ~]# cat /etc/fstab | grep swarm
localhost:/tom-for-files /swarm-vol glusterfs defaults,_netdev 0 0
[root@swarm-node3-185 ~]# cat /etc/fstab | grep swarm
localhost:/tom-for-files /swarm-vol glusterfs defaults,_netdev 0 0

При­ме­ча­ние: Выпол­нен­ные тесты про­из­во­ди­тель­но­сти про­то­ко­лов досту­па пока­за­ли, что NFS наи­бо­лее эффек­ти­вен при чте­нии любых дан­ных и запи­си мел­ких фай­лов. Соб­ствен­ный кли­ент пока­зал луч­шую про­из­во­ди­тель­ность при интен­сив­ной запи­си боль­ших фай­лов. Осо­бен­но это вид­но при запи­си с несколь­ких клиентов.

 

Проверяем статус распределённой файловой системы:

[root@swarm-node3-185 ~]# gluster peer status
Number of Peers: 2

Hostname: swarm-node1-183
Uuid: a279f65e-09bc-47dd-88bf-17e0c3307c10
State: Peer in Cluster (Connected)

Hostname: swarm-node2-184
Uuid: 3154c75d-18a0-484d-bd09-f098d7cd8b46
State: Peer in Cluster (Connected)

 

[root@swarm-node3-185 ~]# gluster volume status tom-for-files

[codesyntax lang="php"]

[/codesyntax]

[root@swarm-node3-185 ~]# gluster volume info tom-for-files

[codesyntax lang="php"]

[/codesyntax]

 

Настрой­ка без­опас­но­сти, раз­ре­шим под­клю­чать­ся к это­му тому толь­ко адре­са из наше­го кластера:
[root@swarm-node3-185 ~]# gluster volume set tom-for-files auth.allow 192.168.1.180,192.168.1.181,192.168.1.182,192.168.1.183,192.168.1.184,192.168.1.185,192.168.1.190 volume set: success

уста­нов­ка закончена.
=================================================

 

Запустим Docker flow proxy

что­бы доба­вить сертификаты(самоподписанные), созда­дим директорию:
mkdir -p /certs

openssl genrsa -out /certs/test.ru.key 1024
openssl req -new -key /certs/test.ru.key -out /certs/test.ru.csr
После необ­хо­ди­мо ука­зать кор­рект­ные дан­ные. Важ­но, что­бы когда появи­лось ""Common Name (e.g. server FQDN or YOUR name)" " «Общее имя
(напри­мер, пол­ное домен­ное имя сер­ве­ра или ВАШЕ имя)», вы отве­ча­ли на него *.test.ru

[root@swarm-master1-180 ~]# openssl req -new -key /certs/test.ru.key -out /certs/test.ru.csr
openssl x509 -req -days 365 -in /certs/test.ru.csr -signkey /certs/test.ru.key -out /certs/test.ru.crt
cat /certs/test.ru.crt /certs/test.ru.key | tee /certs/test.ru.pem
docker secret create cert-test.ru.pem /certs/test.ru.pem

созда­ём сеть:
docker network create --driver overlay proxy
созда­ём дирек­то­рию где будет хра­нить­ся файл для дан­но­го сервиса:
[root@swarm-master1-180 ~]# mkdir docker-flow-proxy
[root@swarm-master1-180 ~]# vim proxy.yml
[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

Деп­ло­им:
[root@swarm-master1-180 ~]# docker stack deploy -c proxy.yml proxy

про­ве­ря­ем:
[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

запу­стим nexus:

[root@swarm-master1-180 ~]# cat nexus.yml
[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]
mkdir -p /swarm-vol/nexus-data/
chmod 777 /swarm-vol/nexus-data/
docker stack deploy -c nexus.yml nexus