Разворачиваем GlusterFS

0
(0)

Подготовим мини кластер из всего двух нод. На каждой ноде добавим диск на 10ГБ.

Vagrantfile выглядит так:

Ruby
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

Запускаем:

Bash
vagrant up

У меня уже есть настроенный локальный ДНС, подробнее о нем тут. В его переменные я добавил следующее:

YAML
  - address=/gluster-node1.{{ local_domain }}/192.168.10.30
  - address=/gluster-node2.{{ local_domain }}/192.168.10.31

Теперь я могу обращаться по указанным адресам.

На обоих нодах выключаем системный резолвер и добавляем свой адрес dns сервера в resolv.conf.

Bash
systemctl stop systemd-resolved
systemctl disable systemd-resolved
cat /etc/resolv.conf 
nameserver 192.168.10.100

Проверяем:

Устанавливаем пакет glusterfs-server, запускаем и добавляем в автозагрузку:

Bash
apt install glusterfs-server -y
systemctl start glusterd
systemctl enable glusterd

Подготавливаем диски:

У меня это диск /dev/sdb.

Создаем партицию:

Здесь все максимально «дефолтно», одна партиция на весь размер диска.

Далее накатываем файловую систему:

Bash
mkfs.xfs /dev/sdb1

Используем xfs так как она лучше подходит для подобных (пусть и в тестовой инсталяции) кластерных решений.

Создаем директорию под gluserfs и монтируем ее к нашему устройству:

Bash
mkdir /gluster
mount /dev/sdb1 /gluster

Этот маунт слетит после перезагрузки, добавляем его в /etc/fstab

Bash
cat /etc/mtab |tail -n1 >> /etc/fstab

Это все проделываем на обоих нодах.

Настраиваем GlusterFS Volume:

Создаем pool

Bash
gluster peer probe gluster-node2.dev.local

Проверить можно так:

Bash
gluster pool list

Далее нам нужно создать так называемую «brick» директорию.

В контексте GlusterFS «brick» (брик) — это базовая единица хранения данных. Брик представляет собой локальную директорию или файловую систему на одном из узлов GlusterFS-кластера. Он является физическим хранилищем данных и обслуживает все файлы и директории, которые находятся внутри объема GlusterFS.

Bash
mkdir /gluster/k8s_volume1

Создать директорию нужно на обоих нодах.

Далее мы создаем «volume» с 2-мя репликами и запускаем его.

Bash
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

Проверяем статус:

Bash
gluster volume status

Далее нам нужно добавить в «/etc/fstab«:

Bash
localhost:/k8s_volume1 /k8s_storage glusterfs defaults,_netdev 0 0

Перед этим не забудем создать директорию /k8s_storage.

Монтируем, выполнив:

Bash
mount -a

Проверяем:

На этом настройка завершена.

Тестируем репликацию:

На первой ноде создадим тестовый файл:

Bash
echo "test" > /k8s_storage/test_file.txt

И проверим его наличие на второй:

Работает корректно.

Мы также можем отключить вторую ноду.

Bash
systemctl stop glusterd

Проверяем статус нашего вольюма:

Доступна только наша первая нода.

Изменим файл и создадим еще один:

Bash
echo -e "test\ntest\ntest" >> /k8s_storage/test_file.txt
touch /k8s_storage/test_replicas.txt

После этого возвращаем вторую ноду в кластер:

Bash
systemctl start glusterd

И проверяем появились ли файлы на ней:

Таким образом наша распределенная ФС работает и имея фактор репликации 2, мы можем позволить себе потерять одну из нод кластера, без потери данных.

Тут также нужно понимать, что мы создали именно реплицирующий volume, следовательно общий объем данных будет равен одному из бриков, в нашем случае это 10Гб.

Чтобы создать volume, «объединяющий» размер дисков, нам нужен тип «Distributed», если в комаде создания volume не указывать количество реплик, то по умолчанию создастся именно такой тип. У нас не будет репликаций, но будем больший объем.

Существует еще тип Distributed-Replicate. Создается аналогично командам выше, только для него, нам нужно иметь как минимум 4 ноды в кластере, соответственно две будут реплицирующие и две «раздающие». При таком типе наш объем сложится из объемов только двух дисков, но при этом мы получим также две реплики.

Также стоит отменить, что даже используя Distributed тип, который казалось бы увеличивает наш общий объем, за счет того, что файл попадет на один из «бриков» ноды, имея 10Гб на каждой ноде, суммарно 20Гб, мы все равно не сможем «положить» в кластер файл размером на 11Гб, он просто не поместится на «брик».

Как подключить том на клиенте?

Устанавливаем нужный пакет

Bash
apt install glusterfs-client

Монтируем:

Bash
mount -t glusterfs gluster-node1.dev.local:/k8s_volume1 /mnt

Проверяем:

Как упростить ручные действия?

ansible роль писать сильно лень, да и на ansible-galaxy уже есть хорошие решения. Мы же для тестовой инсталяции можем добавить немного автоматизации по подготовке дисков:

Ruby
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.

Насколько статья полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Оставить комментарий