Подключаем ZFS over iSCSI на Oracle Linux 8 (CentOS) в Proxmox

Положим у вас есть кластер Proxmox и вы хотите отказоустойчивость.

Отказоустойчивость можно сделать через Ceph, но через Ceph рекомендуется фактор репликации = 3 (т.е. полезная емкость дисков будет в 3 раза меньше используемой) и вы может быть ещё пока не уверены справитесь ли с Ceph с точки зрения надёжности.

Значит чтобы можно было пережить отказ серверной ноды Proxmox и запустить ВМ на другой ноде надо общую хранилку.

proxmox storage table
Возможности системы хранения Proxmox: нас интересуют где Shared и Snapshots в yes.

Нас интересуют подходы с поддержкой снапшотов и общей хранилкой. 

Ceph RBD умеет в снапшоты и для LXC и для QEMU, но что есть кроме Ceph RBD? CephFS работает также поверх Ceph, поэтому его мы не рассматриваем.

ZFS over iSCSI

Выходит, что есть только ZFS over iSCSI с поддержкой снапшотов. 

Но на самом деле есть проблема: ZFS over iSCSI будет работать только для ВМ на QEMU, контейнеры на этом хранилище не разместить, так как для контейнеров требуется файловое хранилище. 

А тогда ZFS over iSCSI начинает конкурировать с CIFS/NFS, так как QEMU умеет создавать снапшоты самостоятельно, но только если он размещен на файловом хранилище.

CIFS/NFS оказываются универсальнее: они подходят и для LXC и для QEMU, но LXC без снапшотов, а QEMU со снапшотами. ZFS over iSCSI подходит только для QEMU, но снапшоты делаются не средствами QEMU, а средствами ZFS.

Вот то, что снапшоты делаются средствами ZFS и является преимуществом для хранения ВМ QEMU: снапшоты в ZFS даются очень дёшево и можно множество снапшотов друг за другом снимать, в QEMU при создании снапшотов внутренними средствами скорость будет заметно падать и множество снапшотов хранить не рекомендуется.

ZFS over iSCSI: архитектура

Система работает очень хитро: на общей хранилке создается ZFS pool, поднимается iSCSI target с помощью LIO. Все ноды Proxmox заносят по SSH на хранилку свои ключи и когда надо создать диск для ВМ, нода Proxmox по SSH приходит на хранилку, создает в пуле ZFS блочное устройство для ВМ и экспортирует его в iSCSI, а уже после запускает ВМ с подключением по iSCSI к созданному блочному устройству.

В нашем случае будем общую хранилку делать на Oracle Linux 8.

Установка ZFS в Oracle Linux 8 (CentOS)

Устанавливаем по инструкции
# source /etc/os-release
# dnf install https://zfsonlinux.org/epel/zfs-release.el${VERSION_ID/./_}.noarch.rpm
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-zfsonlinux 
# dnf install epel-release kernel-devel zfs 
# echo zfs >/etc/modules-load.d/zfs.conf
# modprobe zfs

 Поднимаем модуль ZFS:

# modprobe zfs
Если всё нормально, то модуль поднимается. 

Создаём ZFS pool

Cоздаём raidz3 (c тремя дополнительными дисками для отказоустойчивости) с сектором в 4k (ashift=14 - это 2^12=16384). Если вы используете контроллер под ZFS (обычно это не требуется), то ashift лучше согласовать с размером сектора в контроллере.
zpool create -o ashift=14 tank raidz3 sdb sdc sdd sde sdf sdg sdh sdi sdj sdk sdl sdm

Установка iSCSI в Oracle Linux 8

Устанавливаем ПО для поддержки iSCSI от LIO и добавляем в автозапуск:

# dnf install targetcli

# systemctl enable --now target

 Нам надо разрешить трафик на нужный порт и здесь внимательно: НЕ СТОИТ ОТКРЫВАТЬ iSCSI порт всем, как это сделано ниже. Настройте firewalld для пропуска трафика только с Proxmox. Для простоты же я приведу пропуск всем:

# firewall-cmd --permanent --add-port=3260/tcp

# systemctl reload firewalld 

Приступаем к конфигурации iSCSI target:

# targetcli

/> cd iscsi/

Создаём target pool group в формате iqn, в котором указываем текущий год, месяц и в перевернутой форме имя хоста (в примере com.example, у вас хост хранилки), а также пул (tank только для примера):

/iscsi> create iqn.2021-09.com.example:tank

Смотрим что получилось:

/iscsi> ls

 Переходим к настройке TPG:

/iscsi> cd iqn.2021-09.com.example:tank/tpg1

Сейчас надо будет настроить аутентификацию, иначе Proxmox не пустит по iSCSI. В данном случае отключаем аутентификацию и разрешаем писать всем, кто имеет доступ к порту (поэтому не делайте так, если не закрыли файрволлом порт iSCSI):

/iscsi/iqn.2021-09.com.example:tank/tpg1> set attribute authentication=0 demo_mode_write_protect=0 generate_node_acls=1 cache_dynamic_acls=1

 Сохраняем конфигурацию:

/iscsi/iqn.2021-09.com.example:tank/tpg1> cd /

/> saveconfig

Идём в Proxmox и на каждой ноде в Shell выполняем настройку подключения к iSCSI.

В /etc/ssh/sshd_config:

UseDNS no

GSSAPIAuthentication no

Генерируем ключ в формате <portal>_id_rsa и переносим его на хранилку:

mkdir /etc/pve/priv/zfs

ssh-keygen -f /etc/pve/priv/zfs/172.16.1.2_id_rsa

ssh-copy-id -i /etc/pve/priv/zfs/172.16.1.2_id_rsa.pub root@172.16.1.2 

На каждой ноде логинемся один раз по SSH и подтверждаем сохранение fingerprint:

ssh -i /etc/pve/priv/zfs/172.16.1.2_id_rsa root@172.16.1.2

Заходим в GUI Proxmox и добавляем новое хранилище, указав корректный ZFS pool и iqn с TPG:




В итоге в /etc/pve/storage.cfg будет что-то вроде:

zfs: example.com

        blocksize 4k

        iscsiprovider LIO

        pool tank

        portal 172.16.1.2

        target iqn.2021-09.com.example:tank

        content images

        lio_tpg tpg1

        nowritecache 1

        sparse 1

Теперь попробуйте создать виртуальную машину QEMU на этом хранилище.

Ещё знаний про Proxmox.

Комментарии

Популярные сообщения из этого блога

Архитектура катастрофоустойчивого сервиса

Обзор почтового клиента Pronto Pro!

Использование USB 3.0 UVC платы захвата ezcap 261 для захвата HDMI видео в FullHD 60 fps.