Obsah

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

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 18 s krycím názvem Reef. Níže tedy provedeme nastavení příslušných repozitářů. Pokud používáte velmi novou verzi operačního systému, může se stát, že aktuální balíky již nejsou dostupné. Použijte proto nejnovější verzi Ceph klientských balíků.

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 9 upravíme v řádek baseurl z „rpm-nautilus/el7“ na „/rpm-reef/el9/“.

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 9

sudo dnf install -y epel-release

RedHat 9

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

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

sudo dnf 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-reef/ 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 x11-common libevent-core-2.1-7 libevent-pthreads-2.1-7

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í:

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

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

[global]
fsid = c4ad8c6f-7ef3-4b0e-873c-b16b00b5aac4
mon_host = [v2:78.128.245.29:3300/0,v1:78.128.245.29:6789/0] [v2:78.128.245.30:3300/0,v1:78.128.245.30:6789/0] [v2:78.128.245.31:3300/0,v1:78.128.245.31:6789/0]
auth_client_required = cephx

V případě dolnich brezan úložistě s kódovým označením CL5:

[global]
fsid = c581dace-40ff-4519-878b-c0ffeec0ffee
mon_host = [v2:78.128.245.157:3300/0,v1:78.128.245.157:6789/0] [v2:78.128.245.158:3300/0,v1:78.128.245.158:6789/0] [v2:78.128.245.159:3300/0,v1:78.128.245.159: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.

Níže je uvedené nastavení příslušných konfiguračních souborů pro automatické mapovaní a mountování RBD.

dev-mapper-rbd_luks.device … pomocná, automaticky vytvořená podle fstab (resp. dev-mapper-rbd_luks_ec.device) mnt-rbd_luks.mount … automaticky vytvořená podle fstab (resp. mnt-rbd_luks_ec.mount)

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

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

Nástroj rbdmap
POZOR služba rbdmap.service musí být enablována pomocí systemctl enable rbdmap.service.
/etc/ceph/rbdmap

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

LUKS - šifrování
POZOR cryptab vytvoří pomocnou servisu: systemd-cryptsetup@rbd_luks.service
/etc/crypttab

# <target name> <source device>         <key file>      <options>
rbd_luks /dev/rbd/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
POZOR fstab opět vytvoří pomocnou servisu: dev-mapper-rbd_luks.device.
POZOR fstab následně vytvoří servisu pro mountování: mnt-rbd_luks.mount, kterou následně využijeme pro ruční připojení a odpojení.
/etc/fstab

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/mapper/rbd_luks /mnt/rbd_luks xfs 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
Toto změnu doporučujeme provést pomocí příkazu systemctl edit systemd-cryptsetup a následně uložit jako soubor s názvem 10-deps.conf.
/etc/systemd/system/systemd-cryptsetup@rbd_luks.service.d/10-deps.conf

[Unit]
After=rbdmap.service
Requires=rbdmap.service
Before=mnt-rbd_luks.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.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 použít nástroj pro správný filesystem (zde XFS)
(pozor: nástroje pro jiné filesystémy mohou vyžadovat jako parametr blokové zařízení místo mount pointu a odpojený filesystem).

rbd -c ceph_conf -k ceph_keyring --id ceph_user resize rbd_nazev_poolu/nazev_image --size 200T
rbd -c ceph_conf -k ceph_keyring --id ceph_user device map rbd_nazev_poolu/nazev_image
cryptsetup open --key-file soubor_s_luks_klicem /dev/rbd/rbd_nazev_poolu/nazev_image rbd_luks
cryptsetup resize --key-file soubor_s_luks_klicem --verbose rbd_luks
mount /dev/mapper/rbd_luks /mnt/mount_point
xfs_growfs /mnt/mount_point

Často kladené dotazy

Timeoutující spojení

Popis problému: Nejde namapovat RBD a spojení vytimeoutuje.

Řešení:

Nejpravděpodobněji Váš firewall zařezává navazování komunikace do internetu. Je nezbytné na něm povolit rozsah dle daného clusteru na portech 3300 a rozsah portů 6789-7300.

1. na firewallu nastavit „related/established“

2. nastavit na firewallu rozsah clusteru clX a povolit porty u nich port 3300/tcp a rozsah portu 6789 - 7300/tcp.

cl1 - 78.128.244.32/27
cl2 - 78.128.244.64/26
cl3 - 78.128.244.128/25
cl4 - 78.128.245.0/25
cl5 - 78.128.245.128/25

3. aktivujte jumbo frames (podporu velkých rámců). Ty musí být korektně nastaveny po celé cestě až do páteřní sítě CESNET, resp. je musíte mít nastavené na všech vašich aktivních síťových prvcích směrem do CESNET sítě, ale i na samotném serveru, kde zkoušíte RBD image připojit. Na serveru doporučujeme nastavit 9000 bytes, v případě aktivních prvků záleží na více faktorech, které konzultujte s vaším správcem sítě.