Stockage Ceph

Stockage Ceph

Ceph est un peu le couteau suisse du stockage distribué. Il est open source, multi-modes (bloc, fichier et object) sans SPOF et massivement scalable (exaoctet). Dans cet article, je vais aborder le déploiement d’un cluster CEPH avec l’outil DeepSea

L’objectif de l’article n’est pas de détailler le fonctionnement de CEPH, pour cela je vous conseille plutôt la présentation de Sage Weil.

Néanmoins, voici un petit rappel des principaux composants d’un cluster CEPH:

  • Object Storage Daemon (OSD): gére les disques durs et la réplication des données
  • Monitor (MON): maintient les différentes maps nécéssaires au fonctionnement du cluster et gére l’authentification.
  • Manager (MGR): collecte les métriques du cluster et fourni différents modules pour la supervision et le monitoring (Dashboard, Prometheus, Zabbix, API RESTful..)
  • Metadata Server (MDS): nécessaire pour utiliser cephFS
  • Rados Gateway (RGW): fournit l’interface pour le stockage Objet (S3 ou Swift)

DeepSea est une solution open source de déploiement automatisé de CEPH proposée par SUSE dans son offre SUSE Entreprise Storage (SES 6). Elle est basée sur l’outil de gestion de configuration SaltStack.

Pré-requis

Pour cette démo, j’ai déployé 4 VMs sous openSUSE LEAP 15.1 dans un lab VMware:

  • ceph-0.exemple.com : VM d’administration
    • 1 CPU, 2 GB de RAM
  • ceph-[1.3].exemple.com : noeuds de stockage du cluster CEPH
    • 2 CPU, 4GB de RAM,
    • 2 disques de 50GB pour les OSD
    • 1 disques de 25GB pour les journaux et RocksDB bluetore

installation CEPH en version Nautilus

Sur tous les VMs: ceph-[0.3].exemple.com

désactiver apparmor et le firewall

1$ sudo systemctl stop firewalld && systemctl disable firewalld
2$ sudo systemctl stop apparmor && systemctl disable apparmor

ajouter le dépôt pour CEPH

1$ sudo zypper addrepo https://download.opensuse.org/repositories/filesystems:ceph:nautilus/openSUSE_Leap_15.1/filesystems:ceph:nautilus.repo
2
3$ sudo zypper lr
4Repository priorities are without effect. All enabled repositories share the same priority.
5
6#  | Alias                     | Name                               | Enabled | GPG Check | Refresh
7---+---------------------------+------------------------------------+---------+-----------+--------
81 | filesystems_ceph_nautilus | Ceph Nautilus (openSUSE_Leap_15.1) | Yes     | (r ) Yes  | No
92 | openSUSE-Leap-15.1-1      | openSUSE-Leap-15.1-1               | Yes     | (r ) Yes  | Yes

ajouter l’agent SALT (minion) et configurer l’adresse du master

1$ sudo zypper in salt-minion
2$ sudo echo "master: ceph-0.exemple.com" > /etc/salt/minion.d/master.conf
3$ sudo systemctl start salt-minion.service && systemctl enable salt-minion.service

Sur la VM d’admin: ceph-0.exemple.com

Installer le master SALT et valider les clés des minions

 1$ sudo zypper in salt-master
 2$ sudo systemctl enable salt-master.service && systemctl start salt-master.service
 3
 4$ sudo salt-key --accept-all
 5The following keys are going to be accepted:
 6Unaccepted Keys:
 7ceph-O.exemple.com
 8ceph-1.exemple.com
 9ceph-2.exemple.com
10ceph-3.exemple.com
11Proceed? [n/Y]
12Key for minion ceph-0.exemple.com accepted.
13Key for minion ceph-1.exemple.com accepted.
14Key for minion ceph-2.exemple.com accepted.
15
16$ sudo salt-key --list-all
17Accepted Keys:
18ceph-0.exemple.com
19ceph-1.exemple.com
20ceph-2.exemple.com
21ceph-3.exemple.com
22Denied Keys:
23Unaccepted Keys:
24Rejected Keys:

Installer DeepSea et ajouter le grain deepsea sur tous les noeuds du cluster

 1$ sudo zypper in deepsea
 2$ sudo salt -E 'ceph-[0-3]'.exemple.com  grains.append deepsea default
 3ceph-0.exemple.com:
 4    ----------
 5    deepsea:
 6        - default
 7ceph-2.exemple.com:
 8    ----------
 9    deepsea:
10        - default
11ceph-1.exemple.com:
12    ----------
13    deepsea:
14        - default
15ceph-3.exemple.com:
16    ----------
17    deepsea:

Tester la communication entre le master et les minions qui portent le grain deepsea

1$ sudo salt -G 'deepsea:*' test.ping
2ceph-3.exemple.com:
3  True
4ceph-1.exemple.com:
5  True
6ceph-2.exemple.com:
7  True
8ceph-0.exemple.com:
9  True

Modifier la configuration globale de DeepSea

1$ sudo cat << EOF > /srv/pillar/ceph/stack/global.yml
2DEV_ENV: True
3subvolume_init: disabled
4EOF
  • DEV_ENV: True: permet de déployer des cluster < à 4 noeuds
  • subvolume_init: disabled: permet d’éviter les Pb de snapshot BTRFS si /var/lib/ceph fait partie du subvolume racine (référence)

Appliquer la modification

1$ sudo salt '*' saltutil.sync_all
2$ sudo salt -G 'deepsea:*' state.apply ceph.subvolume

L’installation de CEPH peut commencer. Elle se déroule en 4 phases

Lancer la phase de préparation

 1$ sudo deepsea salt-run state.orch ceph.stage.prep
 2
 3Starting orchestration: ceph.stage.prep
 4Parsing orchestration ceph.stage.prep steps... ⏳
 5
 6[parsing] on master
 7            |_ ceph.stage.prep
 8
 9[parsing] on ceph-0.exemple.com
10            |_ ceph.sync
11               ceph.metapackage
12               ceph.repo
13               ceph.salt.crc.master
14               ceph.salt-api
15               ceph.updates
16------8<------
17
18// si tout ce passe bien vous devez obtenir à la fin
19Ended stage: ceph.stage.prep succeeded=17/17 time=241.2s

utiliser la commande deepsea pour lancer les différentes phases permet d’obtenir un affichage plus verbeux. Il est également possible de lancer la commande deepsea monitor dans un autre terminal pour suivre les opérations

Lancer la phase de découverte du cluster

1$ sudo deepsea salt-run state.orch ceph.stage.discovery
2
3// si tout ce passe bien vous devez obtenir à la fin
4Ended stage: ceph.stage.discovery succeeded=3/3 time=12.5s

Il faut maintenant indiquer à DeepSea le rôle CEPH affecté à chaque noeud. Pour cette prise en main, les noeuds de stockages supportent les rôles OSD, MON et MGR (voir doc)

 1$ sudo cat /srv/pillar/ceph/proposals/policy.cfg
 2
 3## Cluster Assignment
 4cluster-ceph/cluster/*.sls
 5
 6## Roles
 7# ADMIN
 8role-master/cluster/ceph-0.exemple.com.sls
 9role-admin/cluster/ceph-0.exemple.com.sls
10
11# Monitoring
12role-prometheus/cluster/ceph-0.exemple.com.sls
13role-grafana/cluster/ceph-0.exemple.com.sls
14
15# MON
16role-mon/cluster/ceph-[1-3].exemple.com.sls
17
18# MGR (mgrs are usually colocated with mons)
19role-mgr/cluster/ceph-[1-3].exemple.com.sls
20
21# COMMON
22config/stack/default/global.yml
23config/stack/default/ceph/cluster.yml
24
25# Storage
26role-storage/cluster/ceph-[1-3].exemple.com.sls

Lancer l’étape de configuration

1$ sudo deepsea salt-run state.orch ceph.stage.configure
2
3// si tout ce passe bien vous devez obtenir à la fin
4Ended stage: ceph.stage.configure succeeded=17/17 time=120.0s

Dernière étape, il faut indiquer à DeepSea comment utiliser les disques. Pour cela, vous pouvez lister les disques sur les serveurs

 1$ sudo salt-run disks.details
 2ceph-1.exemple.com:
 3     |_
 4       ----------
 5       /dev/sdb:
 6           ----------
 7           model:
 8               Virtual disk
 9           rotational:
10               1
11           size:
12               50.00 GB
13           vendor:
14               VMware
15     |_
16       ----------
17       /dev/sdc:
18           ----------
19           model:
20               Virtual disk
21           rotational:
22               1
23           size:
24               50.00 GB
25           vendor:
26               VMware
27     |_
28       ----------
29       /dev/sdd:
30           ----------
31           model:
32               Virtual disk
33           rotational:
34               1
35           size:
36               25.00 GB
37           vendor:
38               VMware

Sur chaque noeud, on dispose de 2 disques de 50GB pour le stockage et 1 disque de 25GB pour simuler un SSD dédié aux journaux et RocksDB Bluestore.

Le fichier /srv/salt/ceph/configuration/files/drive_groups.yml permet de définir l’utilisation des disques (voir doc).

 1$ sudo cat /srv/salt/ceph/configuration/files/drive_groups.yml
 2
 3drive_group_default_name:
 4  target: '*'
 5  data_devices:
 6    size: '50GB'
 7  db_devices:
 8    size: '25GB'
 9  osds_per_device: 1
10  db_slots: 2
11  format: bluestore
12  encrypted: False

Ici, tous les disques de 50GB sont dédiés aux OSD et le disque de 25GB est dédié aux journaux bluestore (pour les 2 OSD).

Pour appliquer la configuration, lancez la phase de déploiement

1$ sudo deepsea salt-run state.orch ceph.stage.deploy
2
3// si tout ce passe bien vous devez obtenir à la fin
4Ended stage: ceph.stage.deploy succeeded=60/60 time=567.6s

A ce stage, le cluster CEPH est opérationnel

 1$ sudo ceph -s
 2  cluster:
 3    id:     875feeab-694a-488d-91ea-243197f59ffd
 4    health: HEALTH_OK
 5
 6  services:
 7    mon: 3 daemons, quorum ceph-1,ceph-2,ceph-3 (age 5m)
 8    mgr: ceph-2(active, since 68s), standbys: ceph-1, ceph-3
 9    osd: 6 osds: 6 up (since 3m), 6 in (since 3m)
10
11  data:
12    pools:   0 pools, 0 pgs
13    objects: 0 objects, 0 B
14    usage:   81 GiB used, 294 GiB / 375 GiB avail
15    pgs:

Les 6 OSDs (3 noeuds de 2 disques) sont “up” ainsi que les 3 monitors en cluster

Il reste à obtenir l’accès au dashboard

1$ sudo ceph mgr services | grep dashboard
2    "dashboard": "https://ceph-2.exemple.com:8443/",
3
4
5$ sudo salt-call grains.get dashboard_creds
6local:
7    ----------
8    admin:
9        2ocgtdH3o6C

screenshot dashboard CEPH

La suite au prochain épisode…

Sources / docs