Подготовим мини кластер из всего двух нод. На каждой ноде добавим диск на 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.