Подключаем 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!

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