cs:navody:object_storage:cesnet_rbd:start

Připojení a konfigurace Ceph RBD pomocí Linux klienta

Ceph RBD (RADOS Block Device) poskytuje uživatelům síťové blokové zařízení, které se v systému, kde je připojeno, tváří jako lokální disk. Blokové zařízení je plně pod správou uživatele, který si zde může vytvořit file-systém a používat ho dle svých potřeb.

Výhody RBD

  • možnost zvětšení obrazu blokového zařízení
  • import/export obrazu blokového zařízení
  • stripping a replikace napříč clusterem
  • možnost vytváření read-only snapshotů; obnovení snapshotů (pokud chcete mít sami možnost operovat se snapshoty je třeba nám tento požadavek sdělit)
  • možnost připojení pomocí Linux nebo QEMU KVM klienta

Příprava pro připojení RBD

Pro připojení RBD je doporučené, abyste na vašem systému měli novější verzi jádra. V nižších verzích jádra jsou zastaralé příslušné moduly pro připojení RBD a nejsou podporovány všechny rozšířující funkce. Vývojáři doporučují dokonce verzi jádra alespoň 5.0 a vyšší. Nicméně například i novejší verze CentOS 7 backportovali plno funkcionalit do jejich standardního jádra, takže by aktualizovaný CentOS 7 měl dostačovat.
Pro správnou funkčnost je vysoce žádoucí používat stejnou verzi Ceph nástrojů, jako je aktuální verze provozovaná na našich clusterech, aktuálně se jedná o verzi 16 s krycím názvem Pacific. Níže tedy provedeme nastavení příslušných repozitářů.

Následující návod se vztahuje k distribuci CENTOS/RHEL. Návod pro UBUNTU/DEBIAN naleznete na konci této sekce.

Nejdříve nainstalujeme release.asc klíč pro Ceph repozitáře.

sudo rpm --import 'https://download.ceph.com/keys/release.asc'

V adresáři /etc/yum.repos.d/ vytvoříme textový soubor ceph.repo a do něho vyplníme záznam pro Ceph nástroje. Pro CentOS 8 upravíme v řádek baseurl z „/rpm-pacific/el7/“ na „/rpm-pacific/el8/“.

Některé balíčky z Ceph repozitáře vyžadují pro správnou funkčnost rovněž knihovny třetích stran, proto ještě přidáme repozitář EPEL.

CentOS 7

sudo yum install -y epel-release

CentOS 8

sudo dnf install -y epel-release

RedHat 7

sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

Nakonec si nainstalujeme základní nástroje pro Ceph, které rovněž obsahují podporu RBD.

sudo yum install ceph-common

Instalace ceph nástrojů v Debian/Ubuntu

Instalace ceph nástrojů v Debian/Ubuntu

Nejdříve je nezbytné přidat příslušné repozítáře do balíčkovače, do /etc/apt/sources.list přidáme následující řádky.

deb https://eu.ceph.com/debian-pacific/ bionic main
deb http://cz.archive.ubuntu.com/ubuntu/ bionic main  (potreba pro jeden balik potrebny pri instalaci)

Nainstalujeme potřebné balíky z buster repozitáře.

 sudo apt install -t buster x11-common libevent-core-2.1-6 libevent-pthreads-2.1-6 python-scgi

Přidáme Ubuntu PGP klíče.

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E84AC2C0460F3994
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32

Nainstalujeme balíček ceph.

sudo apt install ceph-common


Konfigurace RBD a jeho namapování

Pro konfiguraci a připojení RBD využijeme údaje, které jste obdrželi od správce systému. Jedná se o následující:

  • název poolu: rbd_vo_poolname
  • název image: vo_name_username
  • keyring: [client.rbd_user] key = key_hash==

V adresáři /etc/ceph/ vytvoříme textový soubor ceph.conf s následujícím obsahem.

V případě jihlavského úložistě s kódovým označením CL1:

[global]
fsid = 19f6785a-70e1-45e8-a23a-5cff0c39aa54
mon_host = [v2:78.128.244.33:3300,v1:78.128.244.33:6789],[v2:78.128.244.37:3300,v1:78.128.244.37:6789],[v2:78.128.244.41:3300,v1:78.128.244.41:6789]
auth_client_required = cephx

V případě plzeňského úložistě s kódovým označením CL2:

[global]
fsid = 3ea58563-c8b9-4e63-84b0-a504a5c71f76
mon_host = [v2:78.128.244.65:3300/0,v1:78.128.244.65:6789/0],[v2:78.128.244.69:3300/0,v1:78.128.244.69:6789/0],[v2:78.128.244.71:3300/0,v1:78.128.244.71:6789/0]
auth_client_required = cephx

V případě ostravkého úložistě s kódovým označením CL3:

[global]
fsid = b16aa2d2-fbe7-4f35-bc2f-3de29100e958
mon_host = [v2:78.128.244.240:3300/0,v1:78.128.244.240:6789/0],[v2:78.128.244.241:3300/0,v1:78.128.244.241:6789/0],[v2:78.128.244.242:3300/0,v1:78.128.244.242:6789/0]
auth_client_required = cephx

Dále v adresáři /etc/ceph/ vytvoříme textový soubor ceph.keyring, do kterého uložíme zaslaný keyring, viz příklad níže.

[client.rbd_user]
	key = sdsaetdfrterp+sfsdM3iKY5teisfsdXoZ5==

Silně doporučujeme připojovat (mapovat) RBD image s volbou –exclusive. Tato volba zabrání vícenásobnému připojení image (lokálně nebo na více strojích), a tím řeší případy, že by došlo k zápisu do image přes jeden server a o chvílí později k zápisu do toho samého image přes jiný server, což by vyustílo k nenávratnému poškození dat! Pokud tedy hrozí ve vašem prostředí i minimální riziko, že dojde k připojení jednoho image na více mist naráz, doporučujeme volbu –exclusive použít.

Scénář kde by bylo naopak nežádoucí použít –exclusive může být RBD image připojený cíleně na více mist, kde ale zámkování řeší clustrový file-systém.

Nyní můžeme provést namapování RBD (rbd_user je string pocházející z keyringu, po oříznutí stringu client..

sudo rbd --id rbd_user --exclusive device map nazev_poolu/nazev_image
Pokud změníte umístění souborů ceph.conf a username.keyring z výchozího adresáře /etc/ceph/, budete muset při mapování zadat příslušné cesty.
sudo rbd -c /home/username/ceph/ceph.conf -k /home/username/ceph/username.keyring --id rbd_user device map nazev_poolu/nazev_image

Následně prověříme připojení ve zprávách od kernelu.

dmesg

Nyní můžeme zkontrolovat stav RBD.

sudo rbd device list | grep "nazev_image"

Šifrování a vytvoření souborového systému

Dalším krokem je zašifrování namapovaného image. Pro šifrování využijeme program cryptsetup-luks

sudo yum install cryptsetup-luks

Následně provedeme zašifrování příslušného zařízení.

sudo cryptsetup -s 512 luksFormat --type luks2 /dev/rbdX

Pokud chcete využít automatického připojení a dešifrování RBD po startu, pak doporučujeme přidat ješte šifrovací soubor (tzv. keyfile). Pokud nepotřebujete automatického připojení a dešifrování RBD po startu, nebo sekundární způsob pro dešifrování můžete tento krok přeskočit.

Keyfile může být libovolný soubor obsahující posloupnost znaků či byte použitou pro šifrování. Může tedy obsahovat heslo, nebo to může být třeba i nějaký binární soubor typu obrázek. Důležité je tento soubor neztratit, jelikož bez něj nebo bez znalosti hesla (pokud jste tedy na vytvoření šifrované části použili heslo a pak ještě přidali keyfile jako sekundardní metodu) nebudete schopni již nikdy obsah dešifrovat!

Pro jednoduchost si zde obsah souboru vygenerujeme přes dd.

dd if=/dev/random of=/etc/ceph/luks.keyfile bs=512 count=4

Pozor na to, abyste na dané cestě již neměli jiný keyfile pro jiný disk, protože byste si ho tímto příkazem přepsali.

sudo cryptsetup luksAddKey /dev/rbdX /etc/ceph/luks.keyfile

Na konec zkontrolujeme nastavení.

sudo cryptsetup luksDump /dev/rbdX

Abychom mohli provádět s daným zařízením další akce, musíme jej nejdříve dešifrovat.

sudo cryptsetup luksOpen /dev/rbdX luks_rbdX

Doporučujeme u nových RBD imagů nepoužívat discard pri vytváření file-systému, protože u větších imagů by trvalo zbytečné příliš dlouho.
Vypnutí discard pro XFS a EXT4:
mkfs.xfs -K /dev/rbdX
mkfs.ext4 -E nodiscard /dev/rbdX

Dále doporučujeme u větších image nebo těch, kde časem bude třeba je zvětšit na více než 200TB použít rovnou XFS místo EXT4, jelikož EXT4 má relativně velké omezení co do počtu inodů.

Nyní na daném zařízení vytvoříme souborový systém, zde příklad xfs.

sudo mkfs.xfs -K /dev/mapper/luks_rbdX
V případě použití XFS nepoužívejte volbu nobarrier při připojování, mohla by zapříčinit ztrátu dat!

Jakmile máme připravený souborový systém, můžeme zařízení připojit do předem vytvořené složky v /mnt/.

sudo mount /dev/mapper/luks_rbdX /mnt/rbd

Ukončení práce s RBD

Odpojení svazku.

sudo umount /mnt/rbd/

Uzamknutí svazku.

sudo cryptsetup luksClose /dev/mapper/luks_rbdX

Odmapování svazku.

sudo rbd --id rbd_user device unmap /dev/rbdX
Pro zajištění většího výkonu je vhodné zvětšit read_ahead cache. Zde záleží na možnostech vašeho stroje resp. velikosti paměti. Ideální je alespoň 8GB. Pokud máte nedostatek paměti zvažte alespoň třeba hodnotu 512MB. Vámi zvolenou hodnotu je nutno přepočítat na kB a vložit do souboru /sys/block/rbd0/queue/read_ahead_kb.

Pro 8GB:
echo 8388608 > /sys/block/rbd0/queue/read_ahead_kb

Pro 512MB:
echo 524288 > /sys/block/rbd0/queue/read_ahead_kb

Pro aplikaci je nutné image odpojit a znovu připojit.


Postup výše v podobě úpravy hodnoty v /sys není pernamentní a po restartu zařízení bude opět použita výchozí (nízka) hodnota. Pro zachování nastavení je třeba použít následující udev pravidlo.

# Setting specific kernel parameters for a subset of block devices (Ceph RBD)
KERNEL=="rbd[0-9]*", ENV{DEVTYPE}=="disk", ACTION=="add|change", ATTR{bdi/read_ahead_kb}="524288"

Obsah uložte do souboru /etc/udev/rules.d/50-read-ahead-kb.rules

Trvalé mapování RBD

Nastavení pro automatické připojení RBD včetně rozšifrování LUKS a mount filesystémů. + řádné odpojení (v obráceném pořadí) při řízeném vypnutí stroje.

Doplníme následující řádky do konfiguračních souborů:

Doplníme následující řádky do konfiguračních souborů:

RBD

/etc/ceph/rbdmap

# RbdDevice             Parameters
#poolname/imagename     id=client,keyring=/etc/ceph/ceph.client.keyring
nazev_poolu/nazev_image id=rbd_user,keyring=/etc/ceph/ceph.keyring

LUKS

/etc/crypttab

# <target name> <source device>         <key file>      <options>
rbd_luks_pool /dev/rbd/nazev_poolu/nazev_image  /etc/ceph/luks.keyfile luks,_netdev

/etc/ceph/luks.keyfile je LUKS klíč.

cesta k blokovému zařízení („<source device>“) je obecně /dev/rbd/$POOL/$IMAGE

fstab

/etc/fstab

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/mapper/rbd_luks_pool /mnt/rbd_luks_pool btrfs defaults,noatime,auto,_netdev 0 0
cesta k LUKS kontejneru („<file system>“) je obecně /dev/mapper/$LUKS_NAME,
kde $LUKS_NAME je definováno v /etc/crypttab (jako „<taget name>“)

systemd

/etc/systemd/system/systemd-cryptsetup@rbd_luks_pool.service.d/10-deps.conf

[Unit]
After=rbdmap.service
Requires=rbdmap.service
Before=mnt-rbd_luks_pool.mount
Na Debianu 10 byla v jednom případě z nějakého důvodu používána systemd jednotka
ceph-rbdmap.service místo rbdmap.service
(bylo nutno upravit na řádcích After= a Requires=)


ruční připojení/odpojení

připojení
systemctl start mnt-rbd_luks_pool.mount

- jsou-li závislosti systemd jednotek správně, provede RBD map, odemkne LUKS a připojí všechny automatické fs závislé na rbdmap, kterou uvedená .mount jednotka potřebuje (⇒ v popisované konfiguraci připojí oba obrazy).

odpojení
systemctl stop rbdmap.service

(resp. systemctl stop ceph-rbdmap.service)
- tento příkaz by měl při správně nastavených závislostech provést umount, LUKS close i RBD unmap.

resize image s luksem

při změně velikosti šifrovaného image, je nutné dodržet pořadí a hlavní je řádek s cryptsetup –verbose resize nazev_image

rbd resize rbd_nazev_poolu/nazev_image --size 200T
cryptsetup --verbose resize nazev_image
mount /storage/rbd/nazev_image
xfs_growfs /dev/mapper/nazev_image
Poslední úprava:: 24.01.2023 13:49