RBD, он же RADOS Block Device – это метод выделения пространства с Ceph и презентации его клиентам в виде блочных устройств (дисков).
RBD можно часто встретить в связке с виртуализацией, в Kubernetes, где диски подключаются к контейнерам в качестве PV, а так же просто внутри клиентской ОС.
В данном случае мы посмотрим, как подключить к обычному Linux хосту блочные устройства с Ceph.
Напомню, что ранее процедура установки Ceph 17 с нуля мной уже была описана в этой статье. В данном случае я использую эту же площадку, а также клиента на базе Rocky Linux 8.6.
Если описать процесс коротко, алгоритм следующий:
- Со стороны Ceph создается пул, в котором планируется размещать образы RBD;
- Создается учетная запись, которой выдаются права на создание RBD в ранее созданном пуле;
- На стороне клиента устанавливается необходимый набор пакетов и библиотек;
- Со стороны клиента создаются диски требуемого размера и подключаются в ОС.
Приступим к настройке. Перейдем на ноду, с которой у нас имеется управление кластером Ceph. В моем случае это ceph-mon-01.
Для начала посмотрим список уже существующих пулов:
[root@ceph-mon-01 ~]# ceph osd lspools
1 .mgr
В моем случае это стандартный пул mgr, но у вас может быть и пул rbd, который я удалил ранее.
Создадим новый пул, в котором в дальнейшем будут размещены RBD:
[root@ceph-mon-01 ~]# ceph osd pool create rbd_images_pool
pool 'rbd_images_pool' created
[root@ceph-mon-01 ~]# ceph osd pool application enable rbd_images_pool rbd
enabled application 'rbd' on pool 'rbd_images_pool'
Обратите внимание, что без указания метки, второй командой, можно получить Warning в статусе кластера:
1 pool(s) do not have an application enabled
Хоть это и не относится к основной теме статьи, но посмотрим на некоторые свойства пула, которые применяются к нему по умолчанию:
[root@ceph-mon-01 ~]# ceph osd pool get rbd_images_pool size
size: 3
[root@ceph-mon-01 ~]# ceph osd pool get rbd_images_pool min_size
min_size: 2
[root@ceph-mon-01 ~]# ceph osd pool get rbd_images_pool pg_autoscale_mode
pg_autoscale_mode: on
Для создаваемых пулов автоматически выбирается Replication Factor 3, т.е. для каждого объекта будет создано две дополнительные копии.
Так же включен параметр pg_autoscale, который избавляет от необходимости считать PG (Placement Groups) и PGP, и выставлять их вручную.
Посмотрим на список пулов:
[root@ceph-mon-01 ~]# ceph osd lspools
1 .mgr
3 rbd_images_pool
Теперь создадим учетную запись и дадим для ей права на полный доступ к ранее созданному пулу:
[root@ceph-mon-01 ~]# ceph auth get-or-create client.vmik mon 'profile rbd' osd 'profile rbd pool=rbd_images_pool' -o /etc/ceph/vmik.keyring
[root@ceph-mon-01 ~]# cat /etc/ceph/vmik.keyring
[client.vmik]
key = AQCJSS1AFExAAzhG/asdasdHYAg==
Посмотреть текущие права доступов в кластере можно с помощью ceph auth ls:
[root@ceph-mon-01 ~]# ceph auth ls
…
client.vmik
key: AQCJSS1AFExAAzhG/asdasdHYAg==
caps: [mon] profile rbd
caps: [osd] profile rbd pool=rbd_images_pool
…
На этом настройку со стороны Ceph мы закончили. Переходим к клиенту.
Со стороны клиента нам необходимо установить пакет ceph-common
. Как подключить репозитории Ceph для разных дистрибутивов можно почитать здесь. Я же создам файл репозитория самостоятельно:
[root@ceph-client ~]# vi /etc/yum.repos.d/ceph.repo
[ceph]
name=Ceph packages for $basearch
baseurl=https://download.ceph.com/rpm-quincy/el8/$basearch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://download.ceph.com/keys/release.asc
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm-quincy/el8/noarch
enabled=1
priority=2
gpgcheck=1
gpgkey=https://download.ceph.com/keys/release.asc
[ceph-source]
name=Ceph source packages
baseurl=https://download.ceph.com/rpm-quincy/el8/SRPMS
enabled=0
priority=2
gpgcheck=1
gpgkey=https://download.ceph.com/keys/release.asc
Обратите внимание, rpm-quincy – последний на момент написания статьи релиз Ceph – в будущем он может отличаться. el8 – общее семейство Red Hat подобных систем 8 версии.
Теперь у нас должны появиться новые репозитории:
[root@ceph-client ~]# dnf repolist
repo id repo name
ceph Ceph packages for x86_64
ceph-noarch Ceph noarch packages
Так же подключим репозиторий epel
, в котором содержатся зависимости для пакета ceph-common
:
[root@ceph-client ~]# dnf install epel-release
Установим пакет ceph-common
:
[root@ceph-client ~]# dnf install ceph-common
Теперь ненадолго вернемся на управляющий узел.
Скопируем с него ранее созданный файл keyring, а также конфигурационный файл Ceph в директорию /etc/ceph
нашего клиента:
[root@ceph-mon-01 ~]# scp /etc/ceph/vmik.keyring /etc/ceph/ceph.conf ceph-client:/etc/ceph
Кстати, файл ceph.conf в данном случае в минимальной конфигурации. В нем указаны только fsid кластера, а также адреса для доступа к ceph-monitor по v1 и v2.
Теперь, когда все нужные пакеты установлены, а также скопирован ключ для доступа и конфигурационный файл Ceph, можно создать первый образ:
[root@ceph-client ~]# rbd create --size 2048 rbd_images_pool/test_image_1 --id vmik --keyring=/etc/ceph/vmik.keyring
Данной командой мы создали образ test_image_1 в пуле rbd_images_pool размером 2048 мегабайт. Здесь так же были указаны учетные данные для доступа к пулу.
Проверим список образов в пуле:
[root@ceph-client ~]# rbd ls rbd_images_pool --id vmik --keyring=/etc/ceph/vmik.keyring
test_image_1
После создания, мы можем подключить блочное устройство к серверу:
[root@ceph-client ~]# rbd device map rbd_images_pool/test_image_1 --id=vmik --keyring=/etc/ceph/vmik.keyring
/dev/rbd0
В системе устройство идентифицировано как rbd0.
Командой rbd showmapped
можно получить список всех подключенных устройств:
[root@ceph-client ~]# rbd showmapped
id pool namespace image snap device
0 rbd_images_pool test_image_1 - /dev/rbd0
Дело за малым. Создать файловую систему и смонтировать устройство:
[root@ceph-client ~]# mkfs.xfs /dev/rbd/rbd_images_pool/test_image_1
Обратите внимание, что для устройств так же создаются алиасы, с названием пула и образа.
[root@ceph-client ~]# mkdir /ceph_rbd
[root@ceph-client ~]# mount -t xfs /dev/rbd/rbd_images_pool/test_image_1 /ceph_rbd/
[root@ceph-client ~]# df -h | grep rbd
/dev/rbd0 2.0G 47M 2.0G 3% /ceph_rbd
Таким образом поверх блочного устройства мы создали файловую систему, а затем смонтировали его.
Однако, после перезагрузки придется вновь подключать и монтировать устройство, что, конечно же, неудобно.
Автоматизируем данный процесс, но предварительно отмонтируем устройство:
[root@ceph-client ~]# umount /ceph_rbd
[root@ceph-client ~]# rbd unmap /dev/rbd0
[root@ceph-client ~]# rbd showmapped
Для автоматического подключения RBD устройств, можно воспользоваться службой rbdmap
, которая использует файл /etc/ceph/rbdmap
и подключает все устройства, прописанные в данном файле.
Отредактируем файл /etc/ceph/rbdmap
:
[root@ceph-client ~]# vi /etc/ceph/rbdmap
# RbdDevice Parameters
#poolname/imagename id=client,keyring=/etc/ceph/ceph.client.keyring
rbd_images_pool/test_image_1 id=vmik,keyring=/etc/ceph/vmik.keyring
Формат достаточно простой. Указывается полный путь до образа (пул и образ), а также keyring файл, который имеет права доступа к пулу.
Добавим службу rbdmap в автозагрузку и сразу же запустим:
[root@ceph-client ~]# systemctl enable --now rbdmap
Created symlink /etc/systemd/system/multi-user.target.wants/rbdmap.service → /usr/lib/systemd/system/rbdmap.service.
[root@ceph-client ~]# rbd showmapped
id pool namespace image snap device
0 rbd_images_pool test_image_1 - /dev/rbd0
После запуска службы все образы из файла rbdmap были смонтированы автоматически. Осталось только подправить fstab, для автоматического монтирования после перезагрузки ОС:
[root@ceph-client ~]# vi /etc/fstab
/dev/rbd/rbd_images_pool/test_image_1 /ceph_rbd xfs _netdev 0 0
И перезагрузимся для проверки:
[root@ceph-client ~]# reboot
После перезагрузки все ожидаемо корректно смонтировано:
[root@ceph-client ~]# df -h | grep rbd
/dev/rbd0 2.0G 47M 2.0G 3% /ceph_rbd
На этом по подключению RBD к клиенту все, но пытливый читатель может спросить – учитывая, что клиент может самостоятельно создавать RBD устройства, он может занять весь Ceph?
Верно, поэтому предварительно стоит выставить квоту на пул. Сделать это можно с управляющего узла:
[root@ceph-mon-01 ~]# ceph osd pool set-quota rbd_images_pool max_bytes 4294967296
set-quota max_bytes = 4294967296 for pool rbd_images_pool
Кстати, можно и не переводить в байты, а указать в формате max_bytes 4GB
.
Со стороны клиента мы можем просматривать квоты:
[root@ceph-client ~]# ceph osd pool get-quota rbd_images_pool --id vmik --keyring=/etc/ceph/vmik.keyring
quotas for pool 'rbd_images_pool':
max objects: N/A
max bytes : 4 GiB (current num bytes: 6832326 bytes)
Но изменять – нет:
[root@ceph-client ~]# ceph osd pool set-quota rbd_images_pool max_bytes 42949672960 --id vmik --keyring=/etc/ceph/vmik.keyring
Error EACCES: access denied
Важно помнить, поскольку RBD устройства создаются в «тонком» формате, их заданный размер может быть больше, чем квота, выставленная на пул, но так делать не стоит. Ничем хорошим это не кончится:
[root@ceph-client ~]# dmesg
[ 776.731856] libceph: FULL or reached pool quota
[ 776.731944] libceph: FULL or reached pool quota
[ 777.152961] libceph: FULL or reached pool quota
[ 777.154086] libceph: FULL or reached pool quota
[ 792.835004] libceph: FULL or reached pool quota
При этом на самом диске будет твориться не весь что 🙂 Всегда сверяйтесь с размерами образов и квотами выставленными на пул!
Как при необходимости расширить RBD устройство? – Достаточно просто:
[root@ceph-client ~]# rbd resize rbd_images_pool/test_image_1 --size 3G --id vmik --keyring=/etc/ceph/vmik.keyring
Resizing image: 100% complete…done.
[root@ceph-client ~]# xfs_growfs /ceph_rbd/
Удалить так же не сложно:
[root@ceph-client ~]# umount /ceph_rbd
[root@ceph-client ~]# rbd unmap /dev/rbd0
[root@ceph-client ~]# rbd rm rbd_images_pool/test_image_1 --id vmik --keyring=/etc/ceph/vmik.keyring
Removing image: 100% complete…done.
[root@ceph-client ~]# rbd ls rbd_images_pool --id vmik --keyring=/etc/ceph/vmik.keyring
На этом по базовой работе с RBD у меня все. В дальнейшем мы посмотрим другие методы подключения.
Спасибо за статью! Все описал четко и по делу, все работает.
Однако возник небольшой вопрос. При монтировании одного образа на разные устройства (mount -t xfs /dev/rbd/rbd_images_pool/test_image_1 /ceph_rbd/
), если на первом устройстве скопировать файл в ceph_rbd, то на другом устройстве он не отображается до тих пор, пока заново не перемонтируешь ceph_rbd.
Это можно как-то победить без использования cephfs?
Добрый день!
Спасибо за комментарий. Блочные устройства, коим является Ceph RBD, не “шарятся” между серверами без использования специальных кластерных файловых систем. Подключение одного такого устройства к нескольким серверам одновременно с файловой системой, например, xfs, чревато потерей данных.
Т.е. одно устройство – один сервер.
Если нужно предоставить доступ нескольких серверов к одному и тому же пространству, CephFS будет самым простым вариантом.
Привет. Спасибо за статьи о CEPH ! Описано все очень доступным языком!
Очень хотелось бы увидеть статью по CephFS. Заранее спасибо!
Добрый день. Спасибо за столь позитивный комментарий. Про CephFS постараюсь написать, как найду время.