Подготовим мини кластер из всего двух нод. На каждой ноде добавим диск на 10ГБ.
Vagrantfile выглядит так:
servers=[
{:hostname => "gluster-node1",:ip => "192.168.10.30",:ssh_port => 2230},
{:hostname => "gluster-node2",:ip => "192.168.10.31",:ssh_port => 2231},
]
Vagrant.configure("2") do |config|
config.vm.provider "virtualbox" do |vb|
vb.gui = false
vb.memory = 1024
vb.cpus = 1
vb.check_guest_additions = false
config.vm.box_check_update = false
config.vm.box = "bento/ubuntu-22.04"
end
servers.each do |machine|
config.vm.define machine[:hostname] do |node|
node.vm.hostname = machine[:hostname]
node.vm.network "public_network", ip: machine[:ip], bridge: "wlo1"
node.vm.network "forwarded_port", id: "ssh", host: machine[:ssh_port], guest: 22
node.vm.provider "virtualbox" do |vb|
file_to_disk = "./#{machine[:hostname]}_disk.vdi"
vb.customize ['createhd', '--filename', file_to_disk, '--size', 10 * 1024]
vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', file_to_disk]
end
end
end
end
Запускаем:
vagrant upУ меня уже есть настроенный локальный ДНС, подробнее о нем тут. В его переменные я добавил следующее:
- address=/gluster-node1.{{ local_domain }}/192.168.10.30
- address=/gluster-node2.{{ local_domain }}/192.168.10.31Теперь я могу обращаться по указанным адресам.
На обоих нодах выключаем системный резолвер и добавляем свой адрес dns сервера в resolv.conf.
systemctl stop systemd-resolved
systemctl disable systemd-resolved
cat /etc/resolv.conf
nameserver 192.168.10.100Проверяем:


Устанавливаем пакет glusterfs-server, запускаем и добавляем в автозагрузку:
apt install glusterfs-server -y
systemctl start glusterd
systemctl enable glusterdПодготавливаем диски:

У меня это диск /dev/sdb.
Создаем партицию:

Здесь все максимально «дефолтно», одна партиция на весь размер диска.
Далее накатываем файловую систему:
mkfs.xfs /dev/sdb1Используем xfs так как она лучше подходит для подобных (пусть и в тестовой инсталяции) кластерных решений.
Создаем директорию под gluserfs и монтируем ее к нашему устройству:
mkdir /gluster
mount /dev/sdb1 /glusterЭтот маунт слетит после перезагрузки, добавляем его в /etc/fstab
cat /etc/mtab |tail -n1 >> /etc/fstab
Это все проделываем на обоих нодах.
Настраиваем GlusterFS Volume:
Создаем pool
gluster peer probe gluster-node2.dev.localПроверить можно так:
gluster pool list
Далее нам нужно создать так называемую «brick» директорию.
В контексте GlusterFS «brick» (брик) — это базовая единица хранения данных. Брик представляет собой локальную директорию или файловую систему на одном из узлов GlusterFS-кластера. Он является физическим хранилищем данных и обслуживает все файлы и директории, которые находятся внутри объема GlusterFS.
mkdir /gluster/k8s_volume1Создать директорию нужно на обоих нодах.
Далее мы создаем «volume» с 2-мя репликами и запускаем его.
gluster volume create k8s_volume1 replica 2 gluster-node1.dev.local:/gluster/k8s_volume1 gluster-node2.dev.local:/gluster/k8s_volume1
gluster volume start k8s_volume1Проверяем статус:
gluster volume status
Далее нам нужно добавить в «/etc/fstab«:
localhost:/k8s_volume1 /k8s_storage glusterfs defaults,_netdev 0 0Перед этим не забудем создать директорию /k8s_storage.
Монтируем, выполнив:
mount -aПроверяем:

На этом настройка завершена.
Тестируем репликацию:
На первой ноде создадим тестовый файл:
echo "test" > /k8s_storage/test_file.txtИ проверим его наличие на второй:

Работает корректно.
Мы также можем отключить вторую ноду.
systemctl stop glusterdПроверяем статус нашего вольюма:

Доступна только наша первая нода.
Изменим файл и создадим еще один:
echo -e "test\ntest\ntest" >> /k8s_storage/test_file.txt
touch /k8s_storage/test_replicas.txtПосле этого возвращаем вторую ноду в кластер:
systemctl start glusterdИ проверяем появились ли файлы на ней:

Таким образом наша распределенная ФС работает и имея фактор репликации 2, мы можем позволить себе потерять одну из нод кластера, без потери данных.
Тут также нужно понимать, что мы создали именно реплицирующий volume, следовательно общий объем данных будет равен одному из бриков, в нашем случае это 10Гб.
Чтобы создать volume, «объединяющий» размер дисков, нам нужен тип «Distributed», если в комаде создания volume не указывать количество реплик, то по умолчанию создастся именно такой тип. У нас не будет репликаций, но будем больший объем.
Существует еще тип Distributed-Replicate. Создается аналогично командам выше, только для него, нам нужно иметь как минимум 4 ноды в кластере, соответственно две будут реплицирующие и две «раздающие». При таком типе наш объем сложится из объемов только двух дисков, но при этом мы получим также две реплики.
Также стоит отменить, что даже используя Distributed тип, который казалось бы увеличивает наш общий объем, за счет того, что файл попадет на один из «бриков» ноды, имея 10Гб на каждой ноде, суммарно 20Гб, мы все равно не сможем «положить» в кластер файл размером на 11Гб, он просто не поместится на «брик».
Как подключить том на клиенте?
Устанавливаем нужный пакет
apt install glusterfs-clientМонтируем:
mount -t glusterfs gluster-node1.dev.local:/k8s_volume1 /mntПроверяем:

Как упростить ручные действия?
ansible роль писать сильно лень, да и на ansible-galaxy уже есть хорошие решения. Мы же для тестовой инсталяции можем добавить немного автоматизации по подготовке дисков:
node.vm.provision "shell", inline: <<-SHELL
apt update && apt install glusterfs-server -y
systemctl start glusterd
systemctl enable glusterd
echo -e "n\np\n\n\n\nw" | fdisk /dev/sdb
mkfs.xfs /dev/sdb1
mkdir /gluster
mount /dev/sdb1 /gluster && cat /etc/mtab |tail -n1 >> /etc/fstab
SHELLОстанется только выполнить несколько команд gluster.


