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/bootstrap–osd/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 !