Настройка Proxmox6 для работы с DRBD хранилищем и с контроллером Linstore
Linstor предоставляет несколько служб и клиентов для работы с DRBD хранилищем. С помощью них система контролирует что и когда перемещать по нодам Proxmox6 участвующим в DRBD кластере.
Данная статья основана на вот этой: https://habr.com/ru/post/423101/
Но доработана для proxmox6 и проверены некоторые ситуации.
Определения
Нода - это машина на которой устанавливается драйверы drbd хранилища, в нашем случае это хосты с Proxmox 6 (система виртуализации KVM и линукс контейнеров). Таким образом нода и хост здесь это одно и тоже.
Контроллер (linstor-controller) - это машина или контейнер где устанавливается служба, которая следит за состоянием ДРБД кластера и сохраняет это состояние. Так же она передает информацию нодам что именно и когда синхронизировать.
Сателлит (linstor-satellite) - это служба устанавливаемая на ноде и она предоставляет информацию контроллеру о состоянии дрбд на конкретной ноде.
ДРБД Кластер (DRBD Cluster) - несколько машин с дисками и без участвующие в синхронизации данных на дисках.
Проксмокс Кластер (Proxmox Cluster) - стандартный кластер в который объединяются хосты с proxmox
Проксмокс ХА Кластер (HA Cluster) - Это служба проксмокса организующая высокую доступность к виртуальным машинам находящимся на хостах с проксмоксом. Она следит за машинами и контейнерам добавленными в этот кластер и автоматически переносит их с хоста на хост в случае проблем с хостом на котором машны работают.
Подготовка
В нашем случае применяется решение. где есть две ноды с реальными хранилищами (дисками которые размечаются с помощью Linux LVM) и одна нода без диска, она служит вспомогательной нодой для создания кворума, на случай если одна из нод в ДРБД кластере выйдет из строя.
Все ноды должны быть объеденные в proxmox кластер.
Первый шаг — это установить drbd-utils и собрать модуль ядра на каждой ноде.
Добавим репозиторий linstor и установим kernel-headers, а также все необходимые пакеты из него:
wget -O- https://packages.linbit.com/package-signing-pubkey.asc | apt-key add -
echo "deb http://packages.linbit.com/proxmox/ proxmox-6 drbd-9.0" \
> /etc/apt/sources.list.d/linbit.list
apt-get update
apt-get -y install pve-headers
apt-get -y install drbd-dkms drbdtopПосле установки давайте проверим вашу версию модуля ядра:
modprobe drbd
cat /proc/drbdЕсли вы видите 8 версию, значит что-то пошло не так и у вас загрузился in-tree модуль ядра, проверьте dkms status что бы узнать более подробно о сборке непосредственно dkms-модуля.
Для LINSTOR вы должны использовать DRBD 9 версии.
Убедитесь что в системе стоит python не ниже версии 3.7 - это важно для установки следующих пакетов.
Далее на каждой ноде установим пакеты linstor-proxmox и linstor-satellite:
apt-get -y install linstor-proxmox linstor-satellite
systemctl start linstor-satellite.service
systemctl enable linstor-satellite.serviceДля ДРБД кластера лучше создать отдельную логическую сеть.
В нашем случае будем использовать сеть 192.168.10.0/24.
Поднимаем на каждой ноде отдельный сетевой интерфейс и назначаем адреса из указанной выше сети.
Вообще ДРБД кластер позволяет использовать несколько сетей для синхронизации данных, таким образом можно усиливать сетевую надежность. Для этого лучше иметь несколько сетевых карт на нодах.
Также на каждой ноде нужно подготовить хранилище:
vgcreate drbd-vg /dev/sdb1
lvcreate -l 100%FREE --thinpool drbdpool drbd-vg
Выделяем раздел /dev/sdb1 для ДРБД, здесь drbd-vg это lvm группа.
Контроллер будем собирать на базе контейнера с debian 10.
ВАЖНО! нужно использовать debian версии 10, т.к. в там есть все необходимое для линстор библиотек.
После того как контейнер готов, заходим в него
Установим обновления:
apt-get update
apt-get -y upgradeДобавим репозиторий linstor и установим linstor-controller и linstor-client:
wget -O- https://packages.linbit.com/package-signing-pubkey.asc | apt-key add -
echo "deb http://packages.linbit.com/proxmox/ proxmox-6 drbd-9.0" \
> /etc/apt/sources.list.d/linbit.list
apt-get update && apt-get install -y linstor-controller linstor-client
systemctl start linstor-controller.service
systemctl enable linstor-controller.serviceLinstor требует настроенной локали. Настроим locale:
sed -i '/en_US.UTF-8 UTF-8/ s/^# //' /etc/locale.gen
locale-genДавайте сразу же настроим временную зону:
dpkg-reconfigure tzdataКонфигурирование хранилища
Создадим ноды в линстор контроллере.
Заходим в контейнер с контроллером и выполняем:
linstor node create proxmox1 192.168.10.11 linstor node createproxmox2 192.168.10.12 linstor node createproxmox3192.168.10.13
добавим имена нод в файл /etc/hosts
Пример вывода команды linstor node list:
┊ proxmox1 ┊ SATELLITE ┊ 192.168.10.11:3366 (PLAIN) ┊Online┊
┊ proxmox2 ┊ SATELLITE ┊ 192.168.10.12:3366 (PLAIN) ┊Online┊
┊ proxmox3 ┊ SATELLITE ┊ 192.168.10.13:3366 (PLAIN) ┊Online┊
Добавим в хранилища в линстор контроллер:
linstor storage-pool create lvmthinproxmox1drbdpool drbd-vg/drbdpool linstor storage-pool create lvmthinproxmox2 drbdpool drbd-vg/drbdpool linstor storage-pool create disklessproxmox3drbdpool
Здесь нода proxmox3 является бездисковой и добавляется для кворума.
Теперь мы можем добавить наше новое хранилище в конфиг Proxmox:
cat >> /etc/pve/storage.cfg <<EOF
drbd: drbdpool
resourcegroup drbdpool-group
content rootdir, images
controller 192.168.10.15
controllervm 501
EOFЗдесь мы указываем IP адрес контейнера с линстор контроллером (192.168.10.15) и его номер в проксмоксе (501).
Номер контейнера (или VM) нужно обязательно указывать, т.к. проксмокс не дает ничего сделать с машинами у которых диск находится на ДРБД хранилище если в этот момент нет доступа к контроллеру. А нам нужно перенести контроллер в HA кластер который работает тогда когда у машина находится на ДРБД.
Таким образом сам контроллер будет лежать на ДРБД и чтобы можно было его стартовать и останавливать нужно указать проксмоксу номер этого контейнера (или VM).
Адрес контроллера нужно указать чтобы ноды проксмокса знали где брать информацию о состоянии ДРБД
Настройка HA для контроллера
Теперь мы перенесем наш linstor container на linstor storage.
Для начала нам нужно создать виртуальный диск для него:
pct exec 501 bash
linstor resource-definition create vm-501-disk-0
linstor volume-definition create vm-501-disk-0 4G
linstor resource create vm-501-disk-0 --auto-place 2 -s drbdpoolПо умолчанию linstor-satellite (Сателлит на ноде) удаляет конфиги всех ресурсов на момент запуска сервиса, затем он ожидает новую кофигурацию от linstor-controller, но если мы будем держать linstor-controller в том же месте что и данные, мы должны сделать исключение для его ресурса, добавив опцию --keep-res=vm-501 для linstor-satellite на всех нодах:
echo -e "[Service]\nExecStart=\nExecStart=/usr/share/linstor-server/bin/Satellite --logs=/var/log/linstor-satellite --config-directory=/etc/linstor --keep-res=vm-501" | SYSTEMD_EDITOR=tee systemctl edit linstor-satellite.serviceЭто действие должно предотвратить удаление ресурса vm-501-disk-0 при каждом запуске ноды и сервиса linstor-satellite.
Теперь мы остановим linstor-controller контейнер и перенесем все данные с локального диска на drbd-диск.
pct shutdown 501
dd if=/var/lib/vz/images/100/vm-501-disk-0.raw of=/dev/drbd/by-res/vm-501-disk-0/0 bs=8M status=progress
e2fsck -f /dev/drbd/by-res/vm-501-disk-0/0
resize2fs /dev/drbd/by-res/vm-501-disk-0/0 Обновим конфиг контейнера:
sed -i '/^rootfs:/d' /etc/pve/lxc/501.conf
echo 'rootfs: drbdpool:vm-501-disk-0,size=4G' >> /etc/pve/lxc/501.confЗапустим контейнер, и если возникнут проблемы с запуском, то можно использовать для запуска контейнера, контейнер с диском на локальном хранилище. При этом нужно отключить сеть на запускаемом контейнере, а когда он запуститься нужно выключит сеть на локальном и включить на ДРБД-шном.
После первого запуска контейнера на ДРБД нужно сразу проверить какой информацией он обладает о состоянии ДРБД кластера.
В нем должна быть информация о диске его самого.
проверим:
linstor resource list:
╭──────────────────────────────────────────-╮
┊ ResourceName ┊ Node ┊ Port ┊ State ┊
╞┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄-┄┄╡
┊ vm-501-disk-0 ┊ proxmox1 ┊ 7000 ┊ UpToDate┊
┊ vm-501-disk-0 ┊ proxmox2 ┊ 7000 ┊ UpToDate┊
╰─────────────────────────────────────────-─╯Если нет такой информации ее можно скопировать с локального контейнера. Это все файлы из папки:
/var/lib/linstor
Теперь нам нужно только добавить наш контейнер в proxmox ha-manager.
Для этого сначала нужно создать группу в которую будут входить только дисковые ноды - proxmox1, proxmox2.
Затем добавлем в HA кластер этой группы контейнер 501.
Этому контейнеру нужно указать автозапуск
Теперь при падении одной из нод контейнер переместится и автоматически запустится и будет контролировать оставшиеся ноды.
Замеченные проблемы
Если нода упала, контроллер переехал и после этого упавшая нода долго не поднималась, то в ДРБД кластере накапливаются изменения, про которые нода не знает. и в момент когда она будет опять в работе у нее начинается процесс синхронизации и он может занять некоторое время. Если в этот момент упадет вторая нода с контроллером, то если к этому времени информация о диске с самим контейнером не синхронизировалась, то контроллер не запустится на недавно воскресшей ноде. И все встанет колом.



