Thank you for reading this post, don't forget to subscribe!
Имеем установленный сварм кластер 3 мастера 3 слейва:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 |
[root@swarm-master1-180 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION qwtfiiru7y0qqabosde2k790k * swarm-master1-180 Ready Active Leader 19.03.5 y3gx1d0j65d9m1771yzvhxlxo swarm-master2-181 Ready Active 19.03.5 i7je1j4mly7e5m1gyzsk5238g swarm-master3-182 Ready Active 19.03.5 3cf999ajduvw6ac8f81p8gjoi swarm-node1-183 Ready Active 19.03.5 qjhvke1rxrjy7p8wkbd996qyq swarm-node2-184 Ready Active 19.03.5 hw5e99z5qcrjfymxu0xn5waud swarm-node3-185 Ready Active 19.03.5 |
[/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"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
global_defs { notification_email { mid@test.ru } notification_email_from Andrey@test.ru smtp_server localhost smtp_connect_timeout 30 router_id centos1 } vrrp_instance VI_1 { state MASTER interface enp0s3 virtual_router_id 51 priority 100 advert_int 4 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.190 dev enp0s3 label enp0s3:vip } } |
[/codesyntax]
systemctl enable keepalived
systemctl start keepalived
[root@swarm-node2-184 ~]# cat /etc/keepalived/keepalived.conf
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
global_defs { notification_email { mid@test.ru } notification_email_from Andrey@test.ru smtp_server localhost smtp_connect_timeout 30 router_id centos1 } vrrp_instance VI_1 { state BACKUP interface enp0s3 virtual_router_id 51 priority 99 advert_int 4 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.190 dev enp0s3 label enp0s3:vip } } |
[/codesyntax]
systemctl enable keepalived
systemctl start keepalived
[root@swarm-node3-185 ~]# cat /etc/keepalived/keepalived.conf
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
global_defs { notification_email { mid@test.ru } notification_email_from Andrey@test.ru smtp_server localhost smtp_connect_timeout 30 router_id centos1 } vrrp_instance VI_1 { state BACKUP interface enp0s3 virtual_router_id 51 priority 98 advert_int 4 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.190 dev enp0s3 label enp0s3:vip } } |
[/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"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Status of volume: tom-for-files Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick swarm-node1-183:/gluster/gv01 49152 0 Y 1879 Brick swarm-node2-184:/gluster/gv01 49152 0 Y 1846 Brick swarm-node3-185:/gluster/gv01 49152 0 Y 1801 Self-heal Daemon on localhost N/A N/A Y 1824 Self-heal Daemon on swarm-node1-183 N/A N/A Y 1902 Self-heal Daemon on swarm-node2-184 N/A N/A Y 1869 Task Status of Volume tom-for-files ------------------------------------------------------------------------------ There are no active volume tasks |
[/codesyntax]
[root@swarm-node3-185 ~]# gluster volume info tom-for-files
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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 |
[/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"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
version: "3.7" services: proxy: image: dockerflow/docker-flow-proxy secrets: - cert-test.ru.pem ports: - 80:80 - 443:443 networks: - proxy environment: - LISTENER_ADDRESS=swarm-listener - MODE=swarm deploy: mode: global swarm-listener: image: dockerflow/docker-flow-swarm-listener networks: - proxy volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - DF_NOTIFY_CREATE_SERVICE_URL=http://proxy:8080/v1/docker-flow-proxy/reconfigure - DF_NOTIFY_REMOVE_SERVICE_URL=http://proxy:8080/v1/docker-flow-proxy/remove deploy: placement: constraints: [node.role == manager] networks: proxy: external: true secrets: cert-test.ru.pem: external: true |
[/codesyntax]
Деплоим:
[root@swarm-master1-180 ~]# docker stack deploy -c proxy.yml proxy
проверяем:
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 |
[root@swarm-master1-180 ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS xeoiaww6iu9i proxy_proxy global 6/6 dockerflow/docker-flow-proxy:latest *:80->80/tcp, *:443->443/tcp 6ce6qnp2evhr proxy_swarm-listener replicated 1/1 dockerflow/docker-flow-swarm-listener:latest |
[/codesyntax]
запустим nexus:
[root@swarm-master1-180 ~]# cat nexus.yml
[codesyntax lang="php" blockstate="collapsed"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
version: '3.3' services: nexus3: image: sonatype/nexus3 volumes: - /swarm-vol/nexus-data:/nexus-data networks: - proxy deploy: replicas: 1 labels: - com.df.notify=true - com.df.serviceDomain.1=nexus.test.ru - com.df.port.1=8081 - com.df.serviceDomain.2=nexus2.test.ru - com.df.port.2=8082 - com.df.serviceDomain.3=nexus3.test.ru - com.df.port.3=8083 placement: constraints: - node.role == worker networks: proxy: external: true |
[/codesyntax]
mkdir -p /swarm-vol/nexus-data/
chmod 777 /swarm-vol/nexus-data/
docker stack deploy -c nexus.yml nexus