Configuration d’un cluster Ceph sur 3 serveurs Debian

Pour installer ceph sur un cluster de 3 serveurs Debian (mon serveur perso à la maison sous Debian SID et 2 VMs OVH sous Debian stretch), je me suis appuyé sur ces 2 pages web :

  • http://docs.ceph.com/docs/master/install/manual-deployment/
  • https://linuxfr.org/news/installation-de-ceph-jewel-sous-debian-jessie

En préambule, je précise qu’une première installation en utilisant les packages par défaut de la distribution Debian a bien fonctionné sur les 2 noeuds OVH mais pas sur mon serveur perso sous SID. Les 3 noeuds utilisaient la même version Jewel (10.2.5) mais il doit y avoir un problème avec la libc de SID. A l’exécution de la commande ceph-osd –mkfs, le binaire plantait avec une stacktrace commençant comme ça :

2017-11-06 00:05:28.875854 7f8791fe2900 -1 *** Caught signal (Aborted) **
in thread 7f8791fe2900 thread_name:ceph-osd

ceph version 10.2.5 (c461ee19ecbc0c5c330aca20f7392c9a00730367)
1: (()+0x948e4e) [0x560b3321ee4e]
2: (()+0x110c0) [0x7f8790ca60c0]
3: (gsignal()+0xcf) [0x7f878ec6afff]
4: (abort()+0x16a) [0x7f878ec6c42a]
5: (()+0x70c00) [0x7f878eca8c00]
6: (__fortify_fail()+0x37) [0x7f878ed311e7]
7: (__fortify_fail()+0) [0x7f878ed311b0]
8: (()+0x7fc651) [0x560b330d2651]
9: (FileStore::mkfs()+0xa7c) [0x560b32fc692c]
10: (OSD::mkfs(CephContext*, ObjectStore*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, uuid_d, int)+0x2f4) [0x560b32c0f7e4]
11: (main()+0x107b) [0x560b32bb36cb]
12: (__libc_start_main()+0xf1) [0x7f878ec582e1]
13: (_start()+0x2a) [0x560b32bf585a]
NOTE: a copy of the executable, or `objdump -rdS <executable>` is needed to interpret this.

— begin dump of recent events —

[etc …]

Je préfère limiter le nombre de repos externes à Debian sur mes distribs, mais après avoir testé plusieurs options, ça ne fonctionnait toujours pas. Par pure flemme de debugguer, j’ai décidé de partir sur les repos de Ceph et de tester les versions plus récentes. La seule qui n’a pas crashé est la dernière (Luminous) dans sa version 12.2.1.

Ajoutons donc le repo :

wget -q -O- 'https://download.ceph.com/keys/release.asc' | apt-key add - echo "deb https://download.ceph.com/debian-luminous/ stretch main" > /etc/apt/sources.list.d/ceph.list

Un petit apt-get update ou aptitude update, puis nous installons ceph et ses dépendances avec apt-get install ceph ou aptitude install ceph

Pour vous simplifier la vie, je vous conseille d’ajouter les clés SSH des comptes root sur tous les serveurs pendant la phase de configuration.

Il nous faut un fichier /etc/ceph/ceph.conf (fichier de configuration central de notre cluster, dont le nom par défaut est ceph). Avec la commande uuidgen on génère un UID unique qu’on met dans la conf, avec les options suivantes :

[global]
 fsid = uuid_cluster
 mon initial members = serveur1, serveur2, serveur3
 mon host = ip_serveur1,ip_serveur2,ip_serveur3
 public network = network_prive_serveurs
 cluster network = network_prive_serveurs
 auth_cluster_required = cephx
 auth_service_required = cephx
 auth_client_required = cephx
 osd journal size = 1024
 osd pool default size = 3
 osd pool default min size = 1
 osd pool default pg num = 333
 osd pool default pgp num = 333
 osd crush chooseleaf type = 1

Si vous avez un réseau privé entre noeuds, vous pouvez le mettre dans la configuration. Perso j’ai ajouté les IPs de mes serveurs avec /32 à la fin.

Les noms des serveurs sont les noms courts.

Le fichier doit bien sûr être présent sur les 3 noeuds.

Maintenant on génère un « keyring » pour l’administration du cluster avec l’outil en ligne de commande ceph, et un « keyring » pour le service OSD ;

ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd'

Et un « keyring » pour les moniteurs du  cluster :

ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'

On ajoute les clés dans le fichier :

ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring

On initialise le moniteur avec le keyring :

sudo -u ceph ceph-mon --mkfs -i serveur1 --keyring /tmp/ceph.mon.keyring

touch /var/lib/ceph/mon/ceph-serveur1/done

Maintenant on peut démarrer le cluster sur le 1er noeud :

systemctl enable ceph.target
systemctl start ceph.target
systemctl enable ceph-mon@serveur1
systemctl start ceph-mon@serveur1
systemctl status ceph.target
systemctl status ceph-mon@serveur1

Notez l’utilisation du nom court du serveur pour nommer l’unit systemd de monitoring.

Si l’état des services est ok, on peut passer aux 2 noeuds suivants : on copie les 3 fichiers /etc/ceph/ceph.client.admin.keyring, /tmp/ceph.mon.keyring et /var/lib/ceph/bootstraposd/ceph.keyring dans le même répertoire sur les 2 autres noeuds et on refait l’étape d’initialisation du moniteur sur chaque noeud :

sudo -u ceph ceph-mon --mkfs -i serveur2 --keyring /tmp/ceph.mon.keyring
touch /var/lib/ceph/mon/ceph-serveur2/done
sudo -u ceph ceph-mon --mkfs -i serveur3 --keyring /tmp/ceph.mon.keyring

Si tout se passe bien, la commande ceph -s doit vous donner un statut de ce genre :

# ceph -s
 cluster:
 id: uuid_cluster
 health: HEALTH_OK
 
 services:
 mon: 3 daemons, quorum serveur1, serveur2, serveur3
 mgr: no daemons active
 osd: 0 osds: 0 up, 0 in
 
 data:
 pools: 0 pools, 0 pgs
 objects: 0 objects, 0 bytes
 usage: 0 kB used, 0 kB / 0 kB avail
 pgs:

Maintenant on va pouvoir ajouter des noeuds de stockage (OSD) :

Il nous faut un UID et un secret uniques par noeud :

UUID=$(uuidgen)
OSD_SECRET=$(ceph-authtool --gen-print-key)

Puis on initialise le noeud OSD :

ID=$(echo "{\"cephx_secret\": \"$OSD_SECRET\"}" | ceph osd new $UUID -i - -n client.bootstrap-osd -k /var/lib/ceph/bootstrap-osd/ceph.keyring)

ID doit contenir l’ID du noeud (0,1, 2)

Maintenant il faut formater le FS et le monter dans un répertoire. Par défaut, le répertoire est /var/lib/ceph/osd/ceph-$ID.

Ceph conseille d’utiliser XFS, c’est ce que j’ai mis du coup. Sur mon serveur perso le disque système est en ZFS, mais j’ai eu des soucis avec la commande d’initialisation du noeud OSD.

Une fois le FS formaté et monté, on créé la keyring :

ceph-authtool --create-keyring /var/lib/ceph/osd/ceph-$ID/keyring --name osd.$ID --add-key $OSD_SECRET

Puis on initialise le noeud OSD :

ceph-osd -i $ID --mkfs --osd-uuid $UUID

ATTENTION !! Depuis la version luminous, bluestore est devenu le type de store par défaut dans Ceph. La doc officielle indique qu’on peut mixer des noeuds bluestore et filestore, et que la commande pour créér un noeud OSD de type filestore est bien celle ci-dessus MAIS CA NE MARCHE PAS ! Le noeud est quand même créé en mode bluestore. Tout va sembler fonctionner dans un premier temps mais vous allez finir par avoir des problèmes car le mode bluestore considère le device indiqué comme un disque physique et le traite comme tel.
Je me suis retrouvé au bout de plusieurs semaines avec le FS /var/lib/ceph/osd/ceph-$ID plein à 100 % alors que l’usage de ceph était à 70 %. J’ai mis BEAUCOUP de temps (et 3 réinitialisations du noeud défectueux) à comprendre d’où ça venait ! Pour forcer le mode filestore, il faut ajouter une option comme ceci :

ceph-osd -i $ID --mkfs --osd-uuid $UUID --osd-objectstore filestore

Enfin on corrige les droits :

chown -R ceph:ceph /var/lib/ceph/osd/ceph-$ID

Et on démarre le service OSD :

systemctl enable ceph-osd@$ID
systemctl start ceph-osd@$ID

Maintenant, ceph -s doit donner ce genre de statut :

# ceph -s
 cluster:
 id: uuid_cluster
 health: HEALTH_WARN
 no active mgr

 services:
 mon: 3 daemons, quorum serveur1, serveur2, serveur3
 mgr: no daemons active
 osd: 3 osds: 3 up, 3 in
 
 data:
 pools: 0 pools, 0 pgs
 objects: 0 objects, 0 bytes
 usage: 0 kB used, 0 kB / 0 kB avail
 pgs:

Depuis la version luminous de Ceph, les managers sont obligatoires. On va donc en installer un sur chaque noeud.

On créé le répertoire qui va accueillir ses données :

mkdir /var/lib/ceph/mgr/ceph-serveur1

On génère une keyring :

ceph auth get-or-create mgr.serveur1 mon 'allow profile mgr' osd 'allow *' mds 'allow *' > /var/lib/ceph/mgr/ceph-serveur1/keyring

On active et démarre l’unit systemd :

systemctl enable ceph-mgr@serveur1systemctl start ceph-mgr@serveur1

Et c’est tout ! On fait pareil sur les 2 autres serveurs.

Il ne nous reste plus que les metadata servers (MDS).

Le répertoire :

mkdir -p /var/lib/ceph/mds/ceph-serveur1

La keyring :

ceph-authtool --create-keyring /var/lib/ceph/mds/ceph-serveur1/keyring --gen-key -n mds.serveur1

On importe la keyring :

ceph auth add mds.serveur1 osd "allow rwx" mds "allow" mon "allow profile mds" -i /var/lib/ceph/mds/ceph-serveur1/keyring

On ajoute un bloc par serveur dans /etc/ceph/ceph.conf :

[mds.serveur1]
host = serveur1

On active et démarre l’unit systemd (un petit coup de chown avant) :

chown -R ceph:ceph /var/lib/ceph
systemctl enable ceph-mds@serveur1
systemctl start ceph-mds@serveur1

Et on recommence sur les 2 autres noeuds. Un minimum de 1 MDS est nécessaire apparemment, mais j’en ai mis un sur chaque noeud pour qu’ils soient interchangeables.

Si l’enable ne fonctionne pas, vérifiez que le package ceph-mds est bien installé.

Enfin, on va pouvoir se créér un FS ! D’abord il faut 2 pools, un pour les données et un pour les méta-données. On indique le paramètre pg_num en dernier, il est obligatoire et doit être choisi. D’après la doc Ceph, avec moins de 5 noeuds on met 128 :

ceph osd pool create cephfs_data 128
ceph osd pool create cephfs_metadata 128

Puis on créé le FS :

ceph fs new monfs1 cephfs_data cephfs_metadata

Enfin on peut monter notre FS de cette manière :

mount -t ceph ip_serveur1:6789:/ /monfs1 -o name=admin,secretfile=/etc/ceph/admin.secret,mds_namespace=monfs1

Le fichier /etc/ceph/admin.secret doit contenir uniquement le secret qui est présent dans le fichier /etc/ceph/ceph.client.admin.keyring.

Tadam ! Le FS est présent au df !

Have fun now !

Laisser un commentaire