18
0
Fork 0
wiki/HowtoCeph.md

1010 lines
33 KiB
Markdown
Raw Permalink Normal View History

2018-04-19 15:47:39 +02:00
---
categories: cloud storage
title: Howto Ceph
...
**Attention: cette page est en chantier !** Une image plus ancienne de cette page est disponible ici : [/HowtoCeph_2023-09-27]().
2023-04-19 14:05:13 +02:00
* Documentation : <https://docs.ceph.com>
2023-04-13 16:41:01 +02:00
* Notre présentation de Ceph en vidéo (1h10) : <https://www.youtube.com/watch?v=9VzZKGFfjGw>
2019-11-23 01:16:45 +01:00
* Thèse de Sage Weil : <https://ceph.com/wp-content/uploads/2016/08/weil-thesis.pdf>
* Publications sur Ceph : <https://ceph.io/publications/>
* Vidéo "Intro to Ceph" par Sage Weil : <https://youtu.be/PmLPbrf-x9g>
2018-04-19 15:47:39 +02:00
2019-11-23 01:16:45 +01:00
[Ceph](https://ceph.io/) est une plateforme libre de stockage. Historiquement développé par [Sage Weil](https://en.wikipedia.org/wiki/Sage_Weil) à la suite d'une thèse en 2007, Ceph appartient désormais à Red Hat.
Ceph peut également s'apparenter à un « disque distribué auto-réparant » ou encore une sorte de « RAID-NG ». Le principe est de s'appuyer sur des disques répartis au sein de plusieurs ordinateurs reliés en réseau, et d'avoir une tolérance de panne avec réparation rapide et de permettre l'ajout de disques de façon simple.
2018-04-19 17:34:33 +02:00
2023-04-19 11:58:50 +02:00
# Principes de bases
2019-11-23 01:16:45 +01:00
Ceph permet la répartition d'objets (fichiers, morceaux de fichiers, blocs, etc.) regroupés par _pool_. Un _pool_ découpé en centaines de morceaux de plusieurs Go appelés _placement groups_ (PG). Chaque morceau (PG) est réparti sur des disques (OSD) situés dans des ordinateurs distincts.
2019-11-23 01:16:45 +01:00
L'algorithme CRUSH décrit ce découpage et rassemble toutes les informations dans une CRUSH _map_. Cette carte indique comment calculer quel démon OSD interroger pour atteindre un objet.
2019-11-23 01:16:45 +01:00
Un _cluster_ Ceph est constitué de démons `osd` pour chaque disque, de 3 démons `monitor` (ou plus, tant que le nombre est pair) et 1 démon `manager`. Si besoin de faire du CephFS, il faudra avoir un ou plusieurs démons `mds`, et si besoin d'avoir un accès HTTP REST (compatible Amazon S3) des démons `rgw`.
2019-11-23 01:16:45 +01:00
Un client peut accéder à un _cluster_ Ceph : en mode bloc (RBD), en mode fichers (CephFS) ou en mode HTTP REST compatible Amazon S3 (RGW). Ces trois modes font appel à RADOS via `librados`.
2019-11-23 01:16:45 +01:00
# Déployer un _cluster_ Ceph
Cette section montre comment déployer un _cluster_ Ceph en suivant [la méthode manuelle pour Ceph Pacific](https://docs.ceph.com/en/pacific/install/manual-deployment/) sur Debian 12. Dans les grandes lignes, il faut :
1. ajouter un premier moniteur et un _manager_ ;
1. ajouter deux OSD ;
1. ajouter les moniteurs et _managers_ restants ;
2018-04-19 17:34:33 +02:00
1. ajouter les OSD restants.
2018-04-19 17:34:33 +02:00
## Ajouter un premier moniteur
2018-04-19 17:34:33 +02:00
**TODO**
2018-04-19 17:34:33 +02:00
### Ajouter un _manager_
2018-04-19 17:34:33 +02:00
Il est recommandé d'ajouter un _manager_ sur chaque machine où un moniteur est présent.
**TODO**
## Ajouter deux OSD
2018-04-19 17:34:33 +02:00
Il est préférable d'ajouter les premiers OSD depuis une machine différente de celle où le premier _monitor_ a été ajouté. Ça permettra de valider si l'OSD et le monitor arrivent bien à communiquer. Ajouter ensuite un autre OSD, si possible sur une autre machine, en suivant la même procédure.
2018-04-19 17:34:33 +02:00
**TODO**
2018-04-19 17:34:33 +02:00
## Ajouter les moniteurs et _managers_ restants
2018-04-19 17:34:33 +02:00
**TODO**
2018-04-19 17:34:33 +02:00
2024-04-15 18:33:01 +02:00
## Ajouter les OSD restants
2018-04-19 17:34:33 +02:00
**TODO**
2018-04-19 17:34:33 +02:00
# Installer Ceph en mode client
2018-04-19 17:34:33 +02:00
**TODO**
2019-04-30 15:10:33 +02:00
# Gestion des nœuds
## Redémarrer un serveur Ceph
2019-05-03 14:34:44 +02:00
2023-09-12 08:54:39 +02:00
Si on souhaite redémarrer un des nœuds du _cluster_, on commence par désactiver le _balancing_ du _cluster_ temporairement. L'objectif est d'empêcher le _cluster_ de répliquer les objects perdus ailleurs. Sur une des machines (ça peut être la machine à éteindre) :
2019-05-03 14:34:44 +02:00
# ceph osd set noout
# ceph osd set norebalance
2019-05-03 14:34:44 +02:00
Sur la machine à éteindre :
2019-04-30 15:10:33 +02:00
# reboot
2019-04-30 15:10:33 +02:00
Quand la machine est de nouveau disponible, vérifier l'état du _cluster_. Il faut que les PG soient `active+clean`. Sur une des machines :
2019-04-30 15:10:33 +02:00
# ceph -s
2019-04-30 15:10:33 +02:00
Note: la commande `ceph -s` peut afficher le _warning_ [`MON_CLOCK_SKEW`](https://docs.ceph.com/en/latest/rados/operations/health-checks/#mon-clock-skew). En général, ce _warning_ ce résoud de lui-même.
Puis réactiver le _balancing_ du _cluster_.
2019-04-30 15:10:33 +02:00
# ceph osd unset noout
# ceph osd unset norebalance
2019-04-30 15:10:33 +02:00
## Empêcher le démarrage des services
Si on veut arrêter certains services et les empêcher de démarrer automatiquement au prochain démarrage de la machine, par exemple avec les services OSD :
> Attention : il faut probablement activer les _flags_ `noout` et `norebalance` si compte arrêter les OSD.
# systemctl stop ceph-osd@1.service ceph-osd@2.service ...
# systemctl disable ceph.target ceph-osd.target
On peut aussi masquer une unité systemd spécifique si on ne souhaite pas désactiver tous un type de services.
## Redémarrer les services Ceph
2019-04-30 15:10:33 +02:00
TODO section à mettre à jour
2019-04-30 15:10:33 +02:00
Pour redémarrer tous les services du _cluster_ faire, sur tous les nœuds du cluster :
2019-04-30 15:10:33 +02:00
# systemctl stop ceph\*.service ceph\*.target
# systemctl start ceph.target
2019-04-30 15:10:33 +02:00
2023-04-19 14:05:13 +02:00
Pour plus de détails : [Operating a Cluster](https://docs.ceph.com/docs/luminous/rados/operations/operating/).
2019-04-30 15:10:33 +02:00
2018-08-20 11:48:45 +02:00
# Gestion des comptes utilisateurs
Ceph a un système interne de gestion des utilisateurs. Un utilisateur est représenté par :
2018-04-23 12:10:51 +02:00
- un nom (et un ID) ;
- des permissions ;
- une clef.
2018-04-23 12:10:51 +02:00
Par exemple pour l'utilisateur `client.admin` - l'utilisateur par défaut - l'ID est `admin`, le nom est `client.admin` et la clef et ses permissions sont :
~~~
$ ceph auth get client.admin
exported keyring for client.admin
[client.admin]
key = ****************************************
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
~~~
> On constate naturellement que l'utilisateur `client.admin` a tous les droits sur chacun des éléments du cluster.
2018-08-20 11:48:45 +02:00
Après avoir installé le cluster, `client.admin` est le seul utilisateur et celui par défaut. Si vous vous êtes placé dans `/home/$USER/ceph` pour la mise en place du cluster, les fichiers de configuration et la clef de l'utilisateur `client.admin` s'y trouvent. Cependant, par défaut, les commandes comme `ceph` ou `rbd` cherchent les clefs dans `/etc/ceph`. De ce fait, si on est pas `root` ou que la clef n'est pas dans `/etc/ceph`, Ceph renverra une erreur disant qu'il ne peut pas accéder au cluster. Pour corriger ça, il faut spécifier manuellement l'emplacement de la clef en option :
~~~
$ ceph -n client.admin -k ~/ceph/ceph.client.admin.keyring health
~~~
Il est possible de définir des arguments par défaut pour ne pas avoir à tout taper à chaque fois à l'aide de la variable d'environnement `CEPH_ARGS` :
~~~
$ CEPH_USER_NAME=client.admin
2018-08-14 10:55:55 +02:00
$ export CEPH_ARGS="-n $CEPH_USER_NAME -k $HOME/ceph/ceph.$CEPH_USER_NAME.keyring"
$ ceph health
~~~
> Depuis peu, il est facultatif de donner l'option `-k` quand l'option `-n` est déjà présente si le fichier de clef de l'utilisateur est présent dans sous cette forme : `/etc/ceph/ceph.$CEPH_USER_NAME.keyring`.
> Il est suffisant de donner la clef avec l'option `-k`, le nom est facultatif.
## Création
Il y a deux façons de procéder. La première avec `add` et la seconde avec `get-or-create` :
~~~
2018-05-24 17:48:02 +02:00
$ ceph auth add client.john mon 'allow r'
added key for client.john
2018-05-24 17:48:02 +02:00
$ ceph auth get-or-create client.paul mon 'allow r'
[client.paul]
key = ****************************************
~~~
2018-08-20 11:51:58 +02:00
La seconde méthode va, en plus de la création de l'utilisateur, afficher sa clef. On peut la récupérer sur la sortie standard ou via l'option `-o` pour l'écrire dans un fichier. De plus, si l'utilisateur existe déjà, c'est la clé déjà existante qui sera imprimée. Si on a utilisé `ceph auth add` pour ajouter l'utilisateur, on pourra récupérer sa clef avec `ceph auth get`.
## Modification
La commande suivante permet de modifier les droits d'un utilisateur. Cela va *écraser* ses droits actuels.
~~~
2018-05-24 17:48:02 +02:00
$ ceph auth caps client.john mon 'profile rbd' osd 'profile rbd pool=rbd'
~~~
2024-04-11 18:33:48 +02:00
## Liste
~~~
$ ceph auth ls
~~~
## Suppression
~~~
2018-05-24 17:48:02 +02:00
$ ceph auth del client.john
~~~
2018-04-19 17:34:33 +02:00
2018-04-19 17:42:50 +02:00
# Gestion des OSD
2021-02-10 11:01:30 +01:00
## `mon osd nearfull ratio`
Cette variable définie à partir de quel seuil on considère quun OSD est bientôt plein. Si un OSD atteint ce ratio, ça déclenchera un *warning* pour létat de santé du cluster. La valeur par défaut est 85%, mais elle est probablement trop élevée. On peut saider de ce calculateur en ligne pour choisir le ratio: [Ceph: Safely Available Storage Calculator](https://florian.ca/ceph-calculator/)
Par exemple, pour un cluster de 3serveurs OSD cumulant 24Tio despace disque chacun (72Tio au total), on mettre le ratio à 67%. Dans le fichier `/etc/ceph/ceph.conf`:
```ini
[global]
mon osd nearfull ratio = .67
```
2019-03-28 10:28:11 +01:00
## Remplacement
Identifier la machine sur laquelle se trouve l'OSD :
~~~
# ceph osd tree
~~~
2022-08-25 16:24:38 +02:00
Identifier le disque physique à changer il s'agit, on le notera `sdX`. Puis, supprimer lOSD du côté de Ceph :
2019-03-28 10:28:11 +01:00
~~~
# N=1 # On suppose que l'OSD 1 est down
# ceph osd out osd.$N
# systemctl stop ceph-osd@$N.service
# ceph osd crush remove osd.$N
# ceph auth del osd.$N
# ceph osd rm osd.$N
2022-08-26 15:27:13 +02:00
# umount /var/lib/ceph/osd/ceph-$N
2019-03-28 10:28:11 +01:00
~~~
Une fois que le disque a été remplacé, on ajoute le nouvel OSD :
~~~
# ceph-volume lvm zap /dev/sdX
# ceph-volume lvm prepare --osd-id <id> --data /dev/sdX
# ceph osd find <id> | grep fsid
"osd_fsid": "<fsid>",
# ceph-volume lvm activate <id> <fsid>
~~~
### Remplacement avec `ceph-deploy` (déprécié)
2022-08-25 16:24:38 +02:00
On change de disque `sdX` sur la machine puis :
2019-03-28 10:28:11 +01:00
~~~
2022-08-25 16:24:38 +02:00
# pvcreate /dev/sdX
2019-03-28 10:28:11 +01:00
~~~
2022-08-25 16:24:38 +02:00
Sur un nœud admin :
2019-03-28 10:28:11 +01:00
~~~
2022-08-25 16:24:38 +02:00
# sudo -i -u cephuser
$ cd ~/cephdir
$ ceph-deploy osd create --data /dev/sdX <hostname>
2019-03-28 10:28:11 +01:00
~~~
## Suppression
> Attention: section à revoir
~~~
OSD=0
ceph osd out $OSD
sudo systemctl stop ceph-osd@$OSD
ceph osd purge $OSD --yes-i-really-mean-it
~~~
# Gestion des pools
2018-05-31 10:39:32 +02:00
## Suppression
Par défaut, il est impossible de supprimer un pool. Il y a deux gardes-fous à passer pour permettre la suppression. On s'assure d'abord que le flag « nodelete » est bien à « false » :
~~~
# ceph osd pool get $POOL_NAME nodelete | grep -q true && ceph osd pool set $POOL_NAME nodelete false
~~~
Une fois ce flag désactivé, il faut configurer le cluster pour autoriser la suppression d'un pool :
~~~
# ceph tell mon.* injectargs --mon-allow-pool-delete=true
~~~
Pour finir, on supprime le pool puis on active à nouveau la sécurité :
~~~
2018-06-15 15:16:31 +02:00
# ceph osd pool delete $POOL_NAME $POOL_NAME --yes-i-really-really-mean-it
# ceph tell mon.* injectargs --mon-allow-pool-delete=false
~~~
# RBD
2019-04-30 15:24:04 +02:00
## Taille
Taille provisionnée :
~~~
# rbd ls -l
~~~
Espace alloué *par pool* :
2022-02-16 17:55:55 +01:00
~~~ { .bash }
2019-04-30 15:24:04 +02:00
ceph df
~~~
2022-02-16 17:55:55 +01:00
Sortie:
~~~
RAW STORAGE:
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 65 TiB 39 TiB 27 TiB 27 TiB 40.91
TOTAL 65 TiB 39 TiB 27 TiB 27 TiB 40.91
POOLS:
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
nfs 1 256 7.7 GiB 2.05k 24 GiB 0.08 10 TiB
libvirt 2 256 8.9 TiB 2.33M 27 TiB 46.80 10 TiB
~~~
Dans la section `POOLS`, la colonne `USED` devrait correspondre à la colonne `STORED` multiplié par le nombre de réplication des objets. Ici, les objets sont répliqués trois fois (un objet et deux copies). Pour le *pool* `libvirt`, on a: 8.9 × 3 = 26.7Tio, quon peut arrondir à 27Tio.
La colonne `MAX AVAIL` donne une estimation de la quantité de données quon peut ajouter dans un *pool*. Cette valeur prend notamment en compte le nombre de réplication et la valeur `mon_osd_full_ratio`.
*Attention* : pour un _pool_ RBD, lespace utilisé affiché correspond à lespace réclamé pour un volume donné. Si on crée un volume de 1Tio, mais quon y écrit 100Gio de zéros, le volume fera 100Gio du point de vue de `ceph df`. La boucle suivante permet davoir une approximation en Gio de lespace effectivement occupé par les volumes RBD dun _pool_ **sous Ceph 12** :
~~~
# rbd -p <my_pool> ls -l | awk 'NR > 2 { sub("GiB$", "", $2); if ($2 ~ "TiB$") { sub("TiB$", "", $2); $2 = $2 * 1024 }; s += $2 } END { print s }'
~~~
Pour avoir les volumes RBD triés par ordre décroissant de taille **sous Ceph 14** :
~~~
# rbd -p vm ls -l | sed -E 's/([0-9]) ([GT])/\1\2/' | awk 'NR == 1 { print } NR > 1 { print | "sort -hr -k2" }'
~~~
> La colonne `SIZE` de la commande `rbd ls -l` change de format entre Ceph 12 et Ceph 14. Avec Ceph 14, il y a une espace entre la taille et son unité.
2018-10-03 14:29:20 +02:00
## RBD et Libvirt
2019-02-28 11:20:09 +01:00
Pour permettre à QEMU/Libvirt de parler à Ceph :
~~~
# apt install qemu-block-extra
2019-02-28 11:20:09 +01:00
~~~
Il est possible de faire en sorte que Libvirt parle à Ceph directement. Cela facilite l'allocation de RBD a une machine virtuelle. On peut déjà créer un RBD depuis le client :
~~~
# qemu-img create -f rbd rbd:rbd/vm0-data 8
~~~
Une autre forme permet de préciser l'utilisateur que par lequel QEMU doit passer. Il est préférable d'utiliser cette forme :
~~~
# qemu-img create -f rbd rbd:rbd/kvmdev-test:id=libvirt:conf=/etc/ceph/ceph.conf 8G
~~~
Cela créer une image vm0-data de 8 Gio dans le pool rbd.
2018-10-03 14:40:30 +02:00
Sur la machine cliente, on ajoute la clef de l'utilisateur libvirt dans un secret :
~~~
# cat > secret.xml << EOF
<secret ephemeral='no' private='no'>
<usage type='ceph'>
<name>client.libvirt secret</name>
</usage>
</secret>
EOF
# virsh secret-define --file secret.xml # Donne la valeur de UUID
# virsh secret-set-value --secret $UUID --base64 $KEY # KEY est dans le fichier /etc/ceph/ceph.client.libvirt.keyring
~~~
Il est maintenant possible d'ajouter un RBD à une machine virtuelle. Par exemple pour ajouter le disque vm0-data du pool rbd à la VM vm0 (ne pas oublier de renseigner l'UUID) :
~~~
# cat << EOF > vm0-data.xml
<disk type='network' device='disk'>
<driver name='qemu'/>
<auth username='libvirt'>
<secret type='ceph' uuid='$UUID'/>
</auth>
<source protocol='rbd' name='rbd/vm0-data'>
<host name='192.168.0.1' port='6789'/>
<host name='192.168.0.2' port='6789'/>
<host name='192.168.0.3' port='6789'/>
</source>
<target dev='vda' bus='virtio'/>
</disk>
EOF
# virsh attach-device vm0 vm0-data.xml --persistent
2018-10-03 14:40:30 +02:00
~~~
## VM
2018-04-23 12:10:51 +02:00
On peut utiliser un block device pour y installer une machine virtuelle avec `virt-install`. Le chemin du disque doit mener au block device :
~~~
# virt-install --connect=qemu:///system \
--name=$VMNAME \
--cpu mode=host-passthrough --vcpus=$VCPU \
--ram=$RAM \
--disk path=/dev/rbd/rbd/foo,bus=virtio,io=threads,cache=none,format=raw \
--network=bridge:br0,model=virtio \
--noautoconsole --graphics vnc,listen=127.0.0.1,keymap=fr \
--rng /dev/random \
--cdrom=/home/images/slackware64-14.2-install-dvd.iso
~~~
2018-04-23 12:10:51 +02:00
2019-04-30 15:24:04 +02:00
### migration à chaud
~~~
virsh migrate --live --unsafe --verbose $vmname qemu+ssh://$IP_DST/system
~~~
Le cache RBD doit être activé.
## Redimensionnement
Il est possible d'étendre ou de réduire un block device au sein d'un pool. Si des machines virtuelles ont été installées sur le block device en question, il n'est pas nécessaire de les éteindre. On suppose ici que l'on souhaite étendre le block foo de 8 Gio à 16 Gio. On peut exécuter la commande suivante depuis nimporte quel nœud, y compris depuis un client.
~~~
# rbd resize foo --size 16G
~~~
N.B. : Il faut préciser la taille finale du volume et non la quantité que lon souhaite ajouter.
### Pour une machine virtuelle
Depuis un hyperviseur, on pourra utiliser `virsh blockresize` directement, pas de commande `rbd` nécessaire
2021-09-09 17:49:04 +02:00
```bash
virsh blockresize "${domain}" "${block}" "${newsize}"
```
N.B. : Il faut préciser la taille finale du volume et non la quantité que lon souhaite ajouter.
2021-09-09 17:49:04 +02:00
> La variable `block` peut être déterminée avec colonne `Target` dans la sortie de la commande `virsh domblklist $domain`
### Réduction
2019-12-10 15:39:41 +01:00
Si on souhaite réduire la taille du block device :
~~~
# rbd resize foo --size 8G --allow-shrink
~~~
2019-12-10 15:45:30 +01:00
Le reste de la procédure dépend du système de fichier utilisé sur la machine virtuelle.
## Réplication
2018-04-23 18:01:25 +02:00
Un block device est répliqué fois 2 par défaut. La commande suivante permet de changer cette valeur :
~~~
# ceph osd pool set rbd size 2
~~~
2018-04-23 18:01:25 +02:00
Le block device `rbd` sera ainsi répliqué 1 fois. Dans le cluster, on trouvera le block device original plus une réplication, d'où le « 2 ».
Pour accéder au nombre de réplicats :
~~~
# ceph osd pool get rbd size
~~~
2018-04-23 18:01:25 +02:00
> **NB** Si on augmente le nombre de réplications, la commande `ceph -s` affichera certainement « HEALTH WARN ». Ce warning est normal et signale qu'une des réplications n'est pas complète. Il s'agit de celle qui vient d'être ajoutée. Le warning disparaitra quand la nouvelle réplication sera complète.
2018-04-27 15:57:08 +02:00
2022-04-01 17:50:07 +02:00
**Attention**: il faudra aussi adapter la variable `min_size`. Cette variable définie le nombre de réplicats requis pour un objet pour que le _cluster_ accepte des IO dessus.
Par exemple, un client souhaite lire les données dun objet. Si les variables `size` et `min_size` sont à 2, mais quil ny a quun objet disponibles sur les deux à cause dun incident, lobjet sera inaccessible en écriture et en lecture, puisque le nombre dobjet disponible est inférieur à `min_size`.
Si on met `size` à 2, il faudrait mettre `min_size` à 1.
2021-04-15 09:05:23 +02:00
## Supprimer
2023-02-28 11:20:44 +01:00
Par sécurité, on peut placer les images RBD dans une corbeille avant de les supprimer. Pour mettre une image dans la corbeille :
2021-04-15 09:05:23 +02:00
2023-02-28 11:20:44 +01:00
~~~
# rbd trash mv rbd/mon-image
~~~
> Si le _pool_ dimages RBD est `rbd`, on peut entrer : `# rbd trash mv mon-image`. On précisera quand-même le nom du _pool_ dans la suite.
Les images dans la corbeille sont désignées par un ID lisible avec :
~~~
# rbd trash ls -l
# rbd trash ls -l <mon-pool>
~~~
Si on a besoin de restaurer une image :
~~~
# rbd trash restore rbd/<id>
~~~
Pour supprimer définitivement une image :
~~~
# rbd trash rm rbd/<id>
~~~
Pour supprimer directement un volume RBD sans passer par la corbeille:
~~~
# rbd rm rbd/mon-image
2021-04-15 09:05:23 +02:00
~~~
2023-03-17 11:15:46 +01:00
> Supprimer une image, depuis la corbeille ou non, peut prendre du temps (plus dune minute).
2021-04-15 09:05:23 +02:00
## Snapshots
Il est possible de créer des snapshots de block device, de les restaurer, les cloner…
Créer une snapshot :
~~~
$ rbd snap create rbd/foo@foo_$(date +%F)
~~~
Lister les snapshots :
~~~
$ rbd snap ls rbd/foo
~~~
Revenir à une snapshot :
~~~
$ rbd snap rollback rbd/foo@$SNAPNAME
~~~
Supprimer une snapshot :
~~~
$ rbd snap rm rbd/foo@$SNAPNAME
~~~
**TODO** ajouter la partie protection et clonage des snapshots
2022-09-02 10:50:56 +02:00
## Renommer un volume RBD
~~~
# rbd mv mon_image nouveau_nom
~~~
Si le volume est attaché à une machine virtuelle, il est fortement recommandé de mettre à jour sa définition avec `virsh edit`, de larrêter complètement et de la redémarrer (pas un `reboot`).
2022-09-30 11:24:29 +02:00
# RadosGW
2022-08-25 17:51:54 +02:00
2022-09-30 11:24:29 +02:00
## Installer un démon RadosGW
2023-09-06 11:35:28 +02:00
On souhaite installer un démon RadosGW (RGW) sur `<HOSTNAME>`. On suppose que `<HOSTNAME>` est un nœud du _cluster_ Ceph.
2022-08-25 17:51:54 +02:00
~~~
2022-11-16 17:42:08 +01:00
# apt install radosgw # certainement déjà installé
2022-09-30 11:24:29 +02:00
# mkdir /var/lib/ceph/radosgw/ceph-rgw."${HOSTNAME}"
2022-11-16 17:42:08 +01:00
# ceph auth get client.bootstrap-rgw | grep -e '^\[' -e '^[[:space:]]*key' > /var/lib/ceph/bootstrap-rgw/ceph.keyring
2022-09-30 11:24:29 +02:00
# ceph --cluster ceph --name client.bootstrap-rgw --keyring /var/lib/ceph/bootstrap-rgw/ceph.keyring auth get-or-create client.rgw."${HOSTNAME}" osd 'allow rwx' mon 'allow rw' -o /var/lib/ceph/radosgw/ceph-rgw."${HOSTNAME}"/keyring
2022-11-16 17:42:08 +01:00
# rm /var/lib/ceph/bootstrap-rgw/ceph.keyring
2022-09-30 11:24:29 +02:00
# systemctl enable ceph-radosgw@rgw."${HOSTNAME}"
# systemctl start ceph-radosgw@rgw."${HOSTNAME}"
# systemctl enable ceph.target
~~~
2022-11-16 17:42:08 +01:00
Cette procédure va provoquer la création de plusieurs _pools_ pour le stockage object.
2022-09-30 11:24:29 +02:00
Le démon RGW devrait être joignable sur le port 7480. Une simple requête GET sur http://127.0.0.1:7480/ devrait retourner:
~~~
<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
<ID>anonymous</ID>
<DisplayName></DisplayName>
</Owner>
<Buckets>
</Buckets>
</ListAllMyBucketsResult>
~~~
## Utilisateurs
### Créer un utilisateur
~~~
2022-09-30 15:00:33 +02:00
# radosgw-admin user create --uid='USERNAME' --display-name='Some Fancy Name'
~~~
La commande précédente: affiche les informations de lutilisateur dont sa clé daccès et sa clé secrète. Les deux seront utilisés pour sidentifier en tant que client.
### Retrouver les accès API dun utilisateur
2022-09-30 15:00:33 +02:00
~~~
# radosgw-admin user info --uid='USERNAME' | grep -e 'access_key' -e 'secret_key'
2022-09-30 11:24:29 +02:00
~~~
2022-11-24 16:27:07 +01:00
### Lister les utilisateurs
~~~
# radosgw-admin user list
~~~
Pour avoir lespace occupé par un utilisateur :
~~~
# radosgw-admin user stats --uid='USERNAME' --sync-stats
[…]
"total_bytes": 46272,
[…]
~~~
2022-09-30 11:24:29 +02:00
### Définir un quota
2022-11-24 16:48:30 +01:00
Limiter `USERNAME` à 100Gio au total:
2022-09-30 11:24:29 +02:00
~~~
2022-11-24 16:48:30 +01:00
# radosgw-admin quota set --quota-scope=user --uid='USERNAME' --max-size=100G
# radosgw-admin quota enable --quota-scope=user --uid='USERNAME'
~~~
2022-11-24 17:05:51 +01:00
Pour vérifier si le quota est bien défini :
2022-11-24 16:48:30 +01:00
~~~
# radosgw-admin user info --uid='USERNAME'
[…]
"user_quota": {
"enabled": true,
"check_on_raw": false,
"max_size": 107374182400,
"max_size_kb": 104857600,
"max_objects": -1
},
[…]
2022-08-25 17:51:54 +02:00
~~~
### Supprimer un utilisateur
2023-07-06 14:33:39 +02:00
~~~
# radosgw-admin user rm --uid='USERNAME'
2023-07-06 14:33:39 +02:00
~~~
2023-10-25 14:25:05 +02:00
### Lister les _buckets_
~~~
# radosgw-admin bucket list
~~~
Si on souhaite savoir à quel utilisateur appartient un _bucket_ :
~~~
# radosgw-admin bucket stats --bucket='BUCKET'
~~~
La longue commande ci-dessous permet de lister tous les _buckets_ et leur propriétaire :
~~~
# radosgw-admin bucket stats | tr -d ' ",' | awk -F: '$1 == "bucket" { b = $2 } $1 == "owner" { printf "%s\t%s\n", $2, b }'
user1 bucket1
user2 bucket2
user2 bucket3
user3 bucket4
~~~
La même chose avec `jq` :
~~~
# radosgw-admin bucket stats | jq -r '.[] | "\(.owner)\t\(.bucket)"'
~~~
2022-09-02 11:52:41 +02:00
## Clients
2023-09-22 13:09:34 +02:00
On peut utiliser [MinIO client](/HowtoMinIO#minio-client) ou
[Rclone](/HowtoRclone) par exemple.
2022-08-25 17:51:54 +02:00
# _Monitoring_
Un ensemble de [_plugins_ Nagios pour Ceph](https://github.com/ceph/ceph-nagios-plugins) sont fournis par Ceph sur Github.
Tous les _checks_ sont utilisables _out of the box_ dès quon a créé un utilisateur dédié au _monitoring_.
~~~
# ceph auth get-or-create client.nagios mon 'allow r' | tee /etc/ceph/ceph.client.nagios.keyring
# chgrp nagios /etc/ceph/ceph.client.nagios.keyring
# chmod g+r /etc/ceph/ceph.client.nagios.keyring
~~~
Deux _checks_ ont besoin dajustements pour fonctionner correctement : `check_ceph_rgw` et `check_ceph_rgw_api`.
## `check_ceph_rgw`
Le dépôt Github des _plugins_ Nagios pour Ceph indique de créer un utilisateur Ceph avec seulement les droits décriture pour les moniteurs. Le _check_ ne fonctionnera pas avec ces permissions. Le _check_ retournera une erreur de ce genre :
~~~
RGW ERROR: :: 2022-01-31 12:34:56.789012 1234567890ab 0 failed reading realm info: ret -1 (1) Operation not permitted
couldn't init storage provider
~~~
Pour contourner le problème, il faut ajouter `rx` pour les OSD:
~~~
# ceph auth caps client.nagios mon 'allow r' osd 'allow rx'
~~~
2023-09-22 11:50:20 +02:00
Aussi, ce _check_, contrairement aux autres, ne permet pas de spécifier le chemin du fichier `.keyring`, il faut placer fichier ici : `/etc/ceph/ceph.client.nagios.keyring`.
## `check_ceph_rgw_api`
~~~
# apt install python-awsauth
# radosgw-admin user create --uid=nagios --display-name='Monitoring user'
# radosgw-admin caps add --uid=nagios --caps="buckets=read"
# sudo -u nagios /usr/local/lib/nagios/plugins/check_ceph_rgw_api -H <url> -a <access_key> -s <secret_key>
~~~
# Troubleshooting
2018-04-19 17:42:50 +02:00
2023-09-22 11:50:49 +02:00
## Impossible d'ajouter un RBD à une VM avec AppArmor
2019-03-28 14:41:58 +01:00
Il est possible que le problème vienne du client. Dans ce cas, l'élément bloquant est certainement apparmor. On suppose ici qu'on souhaite supprimer apparmor.
Alors que apparmor est encore installé et actif, on identifie les processus pris en charge par apparmor :
~~~
# aa-status
~~~
Pour ne pas s'embêter, on dit a apparmor d'arrêter de sécuriser tous les processus :
~~~
# aa-complain /etc/apparmor.d/usr.*
# aa-complain /etc/apparmor.d/local/usr.*
# ls /etc/apparmor.d/libvirt/libvirt-* | grep -v '\.files$' | xargs -n1 aa-complain
~~~
Normalement, à ce stade tous les processus sont dans la catégorie « complain » et non « enforce ». Puis, on peut supprimer apparmor :
~~~
# systemctl stop apparmor.service
# apt remove apparmor apparmor-utils
~~~
Après ça, l'ajout à froid de disque via virsh attach-device fonctionnera :
~~~
# virsh shutdown $vm
# virsh attach-device $vm $xml --config
# virsh start $vm
~~~
2018-04-19 17:42:50 +02:00
## Crash
2018-08-20 11:48:45 +02:00
Si une ou plusieurs machines du cluster s'éteigent brutalement, il suffit de les redémarrer et de s'assurer que le service NTP soit lancé sur la machine :
2018-04-19 17:42:50 +02:00
~~~
# timedatectl status | grep -q '^NTP synchronized: yes$' || timedatectl set-ntp true
~~~
2018-04-19 17:42:50 +02:00
Ceph devrait se réparer tout seul. La commande `watch ceph -s` permet de s'en assurer.
2018-04-19 17:42:50 +02:00
## Installation client impossible
2018-04-19 17:42:50 +02:00
2018-08-20 11:48:45 +02:00
Si l'installation d'un client n'est pas possible à cause d'une erreur de configuration des paquets avec dpkg :
2018-04-19 17:42:50 +02:00
~~~
# dpkg --configure ceph-common
~~~
2018-04-19 17:42:50 +02:00
Puis recommencez l'installation depuis le nœud admin.
## _Reduced data availability_
Après avoir éteint le _cluster_ pour plus dune journée par exemple, la commande `ceph -s` peut retourner le warning suivant :
~~~
$ ceph -s
cluster:
id: beaa2317-eecb-4e2b-b5d2-358b072fe05d
health: HEALTH_WARN
Reduced data availability: 154 pgs inactive, 152 pgs peering
Degraded data redundancy: 888/5094 objects degraded (17.432%), 66 pgs degraded
~~~
Dans la plupart des cas il suffira d'attendre que le cluster se soigne seul. On peut surveiller l'état du cluster avec `watch ceph -s`.
2018-05-09 12:18:33 +02:00
## Manque de placement groups
Si on ajoute un grand nombres d'OSD sur un cluster de petite taille (c.à.d ayant moins de 10 OSD) le rapport de santé de Ceph peut nous avertir d'un manque de placement groups (noté « pgs »). Il suffit d'en ajouter avec la commande suivante :
~~~
$ ceph osd pool set $POOL_NAME pg_num $PG_NUM
$ ceph osd pool set $POOL_NAME pgp_num $PG_NUM
2018-05-09 12:18:33 +02:00
~~~
2018-06-15 16:00:16 +02:00
> $PG_NUM devrait être une puissance de 2 pour permettre une répartition des données plus homogène sur le cluster.
2018-12-24 09:38:55 +01:00
## host down
Le message d'erreur est :
~~~
cluster:
id: c957bfaa-ec62-443a-8df1-6e21852e7740
health: HEALTH_WARN
4 osds down
1 host (4 osds) down
services:
mon: 3 daemons, quorum ceph01,ceph02,ceph03
mgr: ceph01(active), standbys: ceph03, ceph02
osd: 12 osds: 8 up, 12 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 12.8GiB used, 65.3TiB / 65.3TiB avail
pgs:
~~~
2019-11-22 13:57:59 +01:00
La machine en question est inaccessible.
## Fichier keyring dans /etc/ceph absents
Si un fichiers *.keyring dans /etc/ceph est absent ou a été supprimé, tout va bien, on peut le générer. Si lutilisateur est `client.libvirt`, on peut exécuter ces commandes sur un des nœuds du cluster.
~~~
id=client.libvirt
ceph auth get "$id" | grep -e "$id" -e key > /etc/ceph/ceph."$id".keyring
~~~
Les infos seront dans `/etc/ceph/ceph.client.libvirt.keyring`.
## Quel client utilise ce RBD?
2020-10-21 10:00:44 +02:00
Depuis un nœud du cluster, on peut savoir quel client utilise un RBD avec la commande `rbd status`.
```
root@ceph-admin-node:~# rbdname=mypool/myrbd
root@ceph-admin-node:~# rbd status vm-root "${rbdname}"
Watchers:
watcher=x.y.z.t:0/2718281828 client.2718281 cookie=271828182845904
```
2021-07-12 17:00:41 +02:00
LIP du client est `x.y.z.t`.
2022-07-25 17:00:43 +02:00
Pour lister les clients qui utilisent une des images RBD:
~~~ { .bash }
for image in $(rbd ls)
do
rbd status "${image}"
done | awk 'BEGIN { FS = "[=:]" } /watcher=/ { count[$2]++ } END { for (ip in count) print ip }'
~~~
2021-07-12 17:00:41 +02:00
## `daemons [osd.N,mon.hostname] have slow ops`
Si la commande `ceph -s` retourne lerreur suivante :
```
cluster:
id: 01234567-89ab-cdef-0123-456789abcdef
health: HEALTH_WARN
NN slow ops, oldest one blocked for 1000000 sec, daemons [osd.N,mon.hostname] have slow ops.
```
On peut essayer de redémarrer le service `ceph-mon` sur le serveur `hostname` :
```bash
systemctl stop ceph-mon@hostname.service
systemctl start ceph-mon@hostname.service
```
## `mon is allowing insecure global_id reclaim`
Si on a le *warning* suivant :
```
cluster:
id: 01234567-89ab-cdef-0123-456789abcdef
health: HEALTH_WARN
mon is allowing insecure global_id reclaim
```
On peut désactiver la fonctionnalité.
**Attention** : si le *warning* `client is using insecure global_id reclaim` est aussi présent, il faut d'abord mettre à jour Ceph sur les nœuds clients ou désactiver le *warning* pour un moment. Pour désactiver le *warning* :
```
# ceph health mute AUTH_INSECURE_GLOBAL_ID_RECLAIM_ALLOWED 1w # 1 week
```
Pour désactiver le _warning_ pour une durée indéterminée :
```
# vi /etc/ceph/ceph.conf
[mon]
mon_warn_on_insecure_global_id_reclaim = false
mon_warn_on_insecure_global_id_reclaim_allowed = false
# systemctl restart ceph-mon@<hostname>.service
```
Pour désactiver la fonctionnalité, si les clients sont à jour :
```
# ceph config set mon auth_allow_insecure_global_id_reclaim false
```
Pour avoir létat de la variable :
```
# ceph config get mon_auth_allow_insecure_global_id_reclaim
```
2022-09-30 11:24:29 +02:00
Source : [Ceph Documention - Health checks](https://docs.ceph.com/en/latest/rados/operations/health-checks/#auth-insecure-global-id-reclaim-allowed)
## Connexion impossible avec une mise à niveau dun client vers Debian 11
Pour un _cluster_ en Ceph 14 (Nautilus), si on fait une mise à niveau vers Debian 11 (ou Ceph 14) dun client, il faut penser à autoriser la machine cliente à communiquer avec les moniteurs sur le port 3300 en plus du port 6789.
## `ceph-osd` - `auth: unable to find a keyring`
Lorsquon démarre le service `ceph-osd@N.service` et quon a cette erreur dans les _logs_ du système (`journalctl` ou `/var/log/syslog`), il faut essayer de démarrer le service `ceph-volume` correspondant.
~~~
# less /var/log/syslog
Jan 1 12:34:56 hostname systemd[1]: Started Ceph object storage daemon osd.N.
Jan 1 12:34:56 hostmane ceph-osd[1234567]: 2022-01-01 12:34:56.789 01234567890a -1 auth: unable to find a keyring on /var/lib/ceph/osd/ceph-N/keyring: (2) No such file or directory
# systemctl start ceph-volume@lvm-N-01234567-890a-bcde-f012-34567890abcd.service
~~~
> Pour savoir à quel unité correspond quel volume, on peut sappuyer sur le nom des unités systemd `ceph-volume`.
>
> ~~~
> # systemctl list-units --all ceph-volume@*.service
> UNIT LOAD ACTIVE SUB DESCRIPTION
2023-02-07 14:47:04 +01:00
> ceph-volume@lvm-N-01234567-890a-bcde-f012-34567890abcd.service […]
> │ ╰──────────────────────────────────┴╴UUID présent dans le nom du LV
> ╰╴numéro de l'OSD
> ~~~
## `HEALTH_ERR` - `Possible data damage`
La commande `ceph -s` nous retourne une erreur de cette forme :
cluster:
health: HEALTH_ERR
24 scrub errors
Possible data damage: 3 pgs inconsistent
Pour avoir les PG concernés :
# ceph health detail
HEALTH_ERR 24 scrub errors; Possible data damage: 3 pgs inconsistent
OSD_SCRUB_ERRORS 24 scrub errors
PG_DAMAGED Possible data damage: 3 pgs inconsistent
pg 5.13 is active+clean+inconsistent, acting [8,0]
pg 5.99 is active+clean+inconsistent, acting [9,4]
pg 5.b8 is active+clean+inconsistent, acting [9,1]
On voit quil sagit des PG 5.13, 5.99 et 5.b8 hébergés respectivement sur les couples dOSD [8,0], [9,4] et [9,1]. On peut avoir plus dinformations sur ces PG avec cette commande :
# rados list-inconsistent-obj 5.99 --format=json-pretty
Ici, la commande indique :
"shards": [
{
"osd": 4,
"primary": false,
"errors": [],
"size": 4194304,
"omap_digest": "0xffffffff",
"data_digest": "0x242f0b48"
},
{
"osd": 9,
"primary": true,
"errors": [
"read_error"
],
"size": 4194304
}
]
LOSD 9 retourne lerreur `read_error`. Si on regarde la sortie de la commande `ceph osd tree`, on constate, dans ce cas, que :
* tous les OSD sont actifs et accessibles ;
* tous les PG ont une machine en commun.
À ce stade, il faut vérifier sur la machine en question si les disques fonctionnent correctement. En loccurrence, le fichier `/var/log/syslog` est rempli derreurs `blk_update_request: I/O error` pour deux disques, donc il faut les changer disques. En attendant, on peut essayer de faire réparer les PG :
# ceph pg repair 5.99
En fonction de létat du disque physique, lopération se déroulera correctement et le PG sera bon. Ça peut être une bonne de sortir lOSD du _cluster_, car dans le cas dune panne de disque, le problème va certainement se produire de nouveau.
2023-08-23 11:56:59 +02:00
## Vérifier la configuration dun démon
# ceph daemon mon.<hostname> config show
# ceph daemon osd.<num_osd> config show
2023-09-22 10:06:59 +02:00
Lensemble des options (ici `config show`) est visible avec la commande suivante.
# ceph daemon <daemon>.<id> help
## `error: internal error: missing backend for pool type 9 (rbd)`
Installer le paquet : `libvirt-daemon-driver-storage-rbd`.