Ceph
Sources
Présentation
Wikipédia : "Ceph est une solution libre de stockage distribué (software-defined storage) très populaire qui propose trois protocoles en un avec : Bloc, Fichiers & Objet (S3). Les objectifs principaux de Ceph sont d'être complètement distribués sans point unique de défaillance, extensible jusqu'à l'exaoctet et librement disponible. Les données sont répliquées, permettant au système d'être tolérant aux pannes."
Ceph permet de disposer d'un cluster de partage de fichiers assez efficace et manageable. Il est associé à son propre FS, CephFS.
Une architecture Ceph peut contenir plusieurs rôles:
- Une machine d'administration (ceph-mgr), où l'on installera Ceph-adm. Celle-ci servira à bootstraper les autres. Celle-ci suit les métriques du cluster et orchestre le cluster; elle fournit aussi
- Une machine ceph-mon (monitor), qui maintient une série de maps de l'état du cluster. Celles-ci sont critiques pour que les daemon Ceph puissent se coordonner. Les monitors gèrent aussi l'authentification entre les daemons et les clients. Il en faut au moins 3 pour avoir de la redondance et de la haute dispo.
- Des OSD (Object Storage Daemon), qui stockent les données, s'occupent des réplications et de la recovery. Il en faut au moins 3 pour avoir de la redondance et de la HA.
- Des serveurs MDS (Metadata Server). Ils stockent les métadonnées pour CephFS. Cela permet à un système POSIX de lancer des commandes comme ls, find... sans placer une grosse charge sur les MDS.
Une seule machine peut recouvrir plusieurs rôles, notamment dans le cadre d'un lab.
Je suis Debian.
Installation
Je vais ici passer par la méthode CephADM, qui est l'installation en mode paquet. Il existe aussi Rook, qui permet une installation sur un cluster k8s.
Outre les Prérequis hardware, les prérequis pour notre cluster sont:
- Python 3
- Systemd
- Docker
- Une synchro temporelle
- LVM est recommandé pour gérer notre stockage. On va utiliser un lv dédié, en xfs.
- Les machines doivent être accessibles en root, via clef SSH, sans mot de passe. depuis la machine cephadm.
- Il vaut mieux avoir de la résolution DNS et des fichiers hosts correctement peuplés.
AJOUTER LES PORTS à OUVRIR
Avant tout
Ceph peut être fort casse-pieds, et n'est pas explicite dans ses erreurs.
Le meilleur moyen de débugger est de voir les logs:
ceph log last cephadm
Mise en place avec ceph-adm
Je pars de ma machine ceph-mon.
Je récupère le script d'install:
curl --silent --remote-name --location https://github.com/ceph/ceph/raw/pacific/src/cephadm/cephadm chmod +x cephadm
Je pourrais utiliser le script tel quel, mais je vais l'installer ainsi que la dépendance ceph-common.
./cephadm add-repo --release pacific ./cephadm install ./cephadm install ceph-common
Initialisation du cluster
Toujours sur ceph-mon, je vais commencer le cluster, à commencer par le monitor. Il faut lui dire d'utiliser docker et pas podman.
sudo cephadm --docker bootstrap --mon-ip 192.168.1.208
Puis je vais ajouter la clef SSH de bootstrap sur tous mes hôtes, y compris le ceph-mon, depuis ce dernier.
ssh-copy-id -f -i /etc/ceph/ceph.pub root@host
Utilisation du shell Ceph
Le shell Ceph est un shell bash contenant toutes les commandes nécessaires. Pour y accéder, il suffit de faire:
cephadm shell
Ajouter des hosts
Je vais ensuite ajouter mes hôtes.
sudo ceph orch host add ceph-mon.sq.lan
...Pour chaque hôte.
Je vais ensuite leur donner à tous les rôles OSD et monitor.
sudo ceph orch host label add ceph-osd2.sq.lan mon/osd
...Pour chaque hôte.
Je vais aussi ajouter le rôle "mds" à mon ceph-mon sur le même principe.
Je peux enfin les lister.
cephuser@ceph-mon:~$ sudo ceph orch host ls HOST ADDR LABELS STATUS ceph-mon.sq.lan 192.168.1.208 mon/osd ceph-osd1.sq.lan 192.168.1.209 mon/osd ceph-osd2.sq.lan 192.168.1.210 mon/osd
Attacher des LV, état du cluster
Je vais désormais attacher mes LV dédiés (ils s'appellent debian-vg/CephLV).
ceph orch daemon add osd ceph-mon.sq.lan:debian-vg/CephLV
Pour chaque hôte, depuis ma machine admin.
Puis je regarde l'état de mon cluster.
ceph -s
Dashboard
Ceph dispose d'un dashboard web. Je vais le déployer sur mon ceph-mon.
ceph mgr module enable dashboard ceph dashboard create-self-signed-cert
Je créée un fichier contenant le mdp de mon futur compte admin (nommé dashboardpw), puis je créée un utilisateur nommé admin:
ceph dashboard ac-user-create admin -i ./dashboardpw administrator
À partir de là, les possibilités sont nombreuses. Ceph propose beaucoup de fonctionnalités très cool. Je vais essayer CephFS.
CephFS
Depuis mon ceph-mon, je vais créer un fs (destiné à mon cluster swarm, d'où son nom).
ceph fs volume create swarm_storage
Puis je vais le monter sur mes machines. La doc précise que l'on a 2 possibilités:
- Le client FUSE : FUSE est un module du kernel servant à permettre aux users d'accéder au FS sans avoir à modifier le kernel. Pour Ceph, le FS sera donc monté dans le userspace, et pas par le kernel. Ce n'est pas la meilleure solution, mais elle a le mérite de proposer une alternative. Doc
- Via un driver kernel dédié : comme n'importe quel FS, donc. Recommandé. doc
Je vais passer par la méthode kernel.
Prérequis
Prérequis: Les clients doivent avoir une conf minimale et un keyring. Donc, sur chaque client:
mkdir -p -m 755 /etc/ceph ssh root@ceph-mon.sq.lan "sudo ceph config generate-minimal-conf" | sudo tee /etc/ceph/ceph.conf chmod 644 /etc/ceph/ceph.conf
J'ai une conf minimale récupérée depuis mon node admin. Je vais ensuite récupérer un keyring pour chaque host.
ssh root@ceph-mon.sq.lan "sudo ceph fs authorize swarm_storage client.swarm / rw" | sudo tee /etc/ceph/ceph.client.swarm.keyring
Ici:
- swarm_storage est le nom du FS créé juste avant.
- dans client.swarm, swarm est le nom du client. C'est bien d'en avoir un. Il peut servir à plusieurs machines qui accèdent au même fs.
Bien remplacer les valeurs ! Enfin, je mets les bons droits:
chmod 600 /etc/ceph/ceph.client.swarm.keyring
Je peux vérifier mes clients depuis mon hote ceph-adm:
ceph auth get client.swarm
Packages
Sur mes clients, je peux avoir besoin des packages Ceph. Il existe plusieurs méthodes, mais en gros, il faut utiliser les repos Ceph.
sudo apt-get install software-properties-common sudo apt-add-repository 'deb https://download.ceph.com/debian-pacific/ {codename} main' wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -
Remplacer {codename} par le codename de la version de Debian. Je peux ensuite installer cephfs-shell et ceph-common (qui est nécessaire).
Montage (mono-monitor)
Je vais monter mon fs dans /data.
mkdir /data
Ceph utilise un petit helper pour aider au montage. Je vérifie qu'il est bien présent (normalement oui si ceph-common est installé).
stat /sbin/mount.ceph
Je lance la commande.J'ai eu du mal à la trouver, celle-là... La doc est absurde.
mount.ceph 192.168.1.208:6789:/ /data -o name=swarm
(192.168.1.208 est l'IP de mon ceph_mon).
Je peux ensuite m'y rendre. Je peux aussi voir dans l'interface web que j'y suis bien connectée.
fstab
Je vais mettre ce montage dans le fstab pour ne pas le perdre.
192.168.1.208:6789:/ /data ceph name=swarm,noatime,_netdev 0 2