Ceph и подключение клиентов. Блочные устройства RBD

RBD, он же RADOS Block Device – это метод выделения пространства с Ceph и презентации его клиентам в виде блочных устройств (дисков).
RBD можно часто встретить в связке с виртуализацией, в Kubernetes, где диски подключаются к контейнерам в качестве PV, а так же просто внутри клиентской ОС.
В данном случае мы посмотрим, как подключить к обычному Linux хосту блочные устройства с Ceph.

Напомню, что ранее процедура установки Ceph 17 с нуля мной уже была описана в этой статье. В данном случае я использую эту же площадку, а также клиента на базе Rocky Linux 8.6.

Если описать процесс коротко, алгоритм следующий:

  1. Со стороны Ceph создается пул, в котором планируется размещать образы RBD;
  2. Создается учетная запись, которой выдаются права на создание RBD в ранее созданном пуле;
  3. На стороне клиента устанавливается необходимый набор пакетов и библиотек;
  4. Со стороны клиента создаются диски требуемого размера и подключаются в ОС.

Приступим к настройке. Перейдем на ноду, с которой у нас имеется управление кластером 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 у меня все. В дальнейшем мы посмотрим другие методы подключения.

Loading

4 thoughts on “Ceph и подключение клиентов. Блочные устройства RBD”

  1. Спасибо за статью! Все описал четко и по делу, все работает.
    Однако возник небольшой вопрос. При монтировании одного образа на разные устройства (mount -t xfs /dev/rbd/rbd_images_pool/test_image_1 /ceph_rbd/
    ), если на первом устройстве скопировать файл в ceph_rbd, то на другом устройстве он не отображается до тих пор, пока заново не перемонтируешь ceph_rbd.
    Это можно как-то победить без использования cephfs?

    1. Добрый день!
      Спасибо за комментарий. Блочные устройства, коим является Ceph RBD, не “шарятся” между серверами без использования специальных кластерных файловых систем. Подключение одного такого устройства к нескольким серверам одновременно с файловой системой, например, xfs, чревато потерей данных.
      Т.е. одно устройство – один сервер.
      Если нужно предоставить доступ нескольких серверов к одному и тому же пространству, CephFS будет самым простым вариантом.

  2. Привет. Спасибо за статьи о CEPH ! Описано все очень доступным языком!
    Очень хотелось бы увидеть статью по CephFS. Заранее спасибо!

    1. Добрый день. Спасибо за столь позитивный комментарий. Про CephFS постараюсь написать, как найду время.

Leave a Reply

Your email address will not be published. Required fields are marked *