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. band

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

    Reply
    1. vmik Post author

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

      Reply
  2. Евгений

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

    Reply
    1. vmik Post author

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

      Reply

Leave a Reply to Евгений Cancel reply

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