Dans cette documentation nous allons voir ensemble comment mettre en place une infrastructure HCI (Hyper-Converged Infrastructure) basée sur un cluster Proxmox VE composé de trois nœuds utilisant un stockage Ceph.
L'environnement Proxmox que j'utilise pour faire cette documentation est un environneent virtuel.
C'est à dire que les serveurs Proxmox que je vais utiliser sont des VMs cependant la procédure reste identique avec du matériel physique.
L'objectif de cette documentation est de montrer les différentes étapes de la préparation des serveurs jusqu’à la mise en place afin d'obtenir :
Avant de commencer l’installation, il est important de comprendre l’architecture que nous allons mettre en place.
Dans une architecture HCI basée sur Ceph :
Cela signifie qu’il n’est plus nécessaire d’utiliser un SAN externe, une baie de stockage dédiée ou un NAS centralisé.
Chaque nœud devient donc à la fois :
Afin de respecter les bonnes pratiques je vais séparer les réseaux que j'utiliserai.
En effet, il est particulièrement recommandé d'avoir un réseau dédié pour Corosync qui gère le cluster dans Proxmox VE mais également pour Ceph dont le trafic génère énormément d’échanges sur le réseau.
Voici la configuration des serveurs que je vais utiliser :
| Nœuds | Hostname | IP Management | IP Cluster (Corosync) | IP Ceph | CPU | RAM |
|---|---|---|---|---|---|---|
| Node 1 | Nested-Cluster1-Prox9-01 | 192.168.60.1 | 192.168.70.1 | 192.168.90.1 | 6 | 12Go |
| Node 2 | Nested-Cluster1-Prox9-02 | 192.168.60.2 | 192.168.70.2 | 192.168.90.2 | 6 | 12Go |
| Node 3 | Nested-Cluster1-Prox9-03 | 192.168.60.3 | 192.168.70.3 | 192.168.90.3 | 6 | 12Go |
Réseau de Management :
Réseau du Cluster (Corosync) :
Réseau pour Ceph :
ATTENTION : En prod il serait tout à fait possible de séparer un peu plus les flux et de définir des réseaux dédiés selon les utilisations.
ATTENTION : Je ne montrerai pas comment faire l'installation des serveurs Proxmox. Je pars du principe que les deux serveurs sont déjà installés.
Avant de commencer la configuration nous allons parler un peu du QDevice.
Dans beaucoup de labs ou de petites infrastructures, il n'est pas rare de trouvever un ou plusieurs Cluster avec seulement deux nœuds pour lesquels il est vivement conseillé de mettre en place un QDevice.
J'ai d'ailleurs fais une documentation qui traite du sujet.
Cependant dans cette documentation nous allons créer un cluster avec 3 nœuds.
La question qui se pose est donc assez simple : Faut-il configurer un QDevice dans un cluster 3 nœuds ?
La réponse est tout aussi simple : Dans un cluster à trois nœuds l’ajout d’un QDevice n’est pas nécessaire.
En effet, chaque nœud possède un vote, ce qui donne un total de trois votes.
Le quorum, qui correspond à la majorité nécessaire pour que le cluster fonctionne, est donc de deux votes.
Cela signifie concrètement que si un nœud tombe en panne, les deux nœuds restants continuent de fonctionner normalement, car ils conservent la majorité.
Il existe donc déjà un mécanisme d’arbitrage naturel et le risque de split-brain est fortement réduit
Je ne traiterai donc pas ici de la configuration d'un QDevice car ce n'est pas nécessaire.
Idéalement il faut à minima deux interfaces réseau sur les serveurs Proxmox :
Exemple :
| Usage | Interface | IP |
|---|---|---|
| Management | vmbr0 | 192.168.60.x |
| Cluster | vmbr1 | 192.168.70.x |
| Cluster | vmbr2 | 192.168.90.x |
Voici un exemple de la configuration réseau nécessaire pour créer le Cluster.
On y retrouvera nos trois cartes réseau ainsi que les subnets dédiés à chacune d'elles.
Cette configuration est à mettre dans /etc/network/interfaces et sera a faire sur les trois serveurs en prennant évidemment soin de ne pas utiliser les mêmes adresses sur les trois nœuds.
auto lo
iface lo inet loopback
iface nic0 inet manual
iface ens224 inet manual
iface ens256 inet manual
auto vmbr0
iface vmbr0 inet static
address 192.168.60.1/24
gateway 192.168.60.254
bridge-ports nic0
bridge-stp off
bridge-fd 0
auto vmbr1
iface vmbr1 inet static
address 192.168.70.1/24
bridge-ports ens224
bridge-stp off
bridge-fd 0
auto vmbr2
iface vmbr2 inet static
address 192.168.90.1/24
bridge-ports ens256
bridge-stp off
bridge-fd 0
Avant de commencer la configuration nous allons procéder à quelques vérifications sur nos trois serveurs Proxmox.
Il est impératif que les serveurs soient correctement configurés et qu'ils puissent communiquer ensemble sur le réseau.
Personnellement je vais le faire en SSH sur les serveurs mais il est tout à fait possible de le faire depuis le shell de l'interface graphique.
nano /etc/hostname


nano /etc/hosts


Je vais utiliser deux réseaux pour avoir deux liens pour corosync.
Je vais donc vérifier que les deux serveurs puissent comminiquer sur ces deux réseaux.
# Fichier hosts
ping Nested-Cluster1-Prox9-02
ping Nested-Cluster1-Prox9-03
# Second réseau pour corosync
ping 192.168.70.2
ping 192.168.70.3
# Second réseau pour Ceph
ping 192.168.90.2
ping 192.168.90.3
# Fichier hosts
ping Nested-Cluster1-Prox9-01
ping Nested-Cluster1-Prox9-03
# Second réseau pour corosync
ping 192.168.70.1
ping 192.168.70.3
# Second réseau pour Ceph
ping 192.168.90.1
ping 192.168.90.3
# Fichier hosts
ping Nested-Cluster1-Prox9-01
ping Nested-Cluster1-Prox9-02
# Second réseau pour corosync
ping 192.168.70.1
ping 192.168.70.2
# Second réseau pour Ceph
ping 192.168.90.1
ping 192.168.90.2
ATTENTION : Le cluster Corosync dépend fortement de la résolution DNS/hosts et de la stabilité du réseau.
apt update && apt full-upgrade
reboot







Depuis le deuxième serveur PVE :

Depuis le troisième serveur PVE :


Pour créer le Cluster en utiliant les lignes de commande (CLI) il faudra effectuer les manipulations suivantes :
# Sur le premier serveur Proxmox
pvecm create Cluster-Demo

Une fois la commande passée on peut vérifier que le Cluster est correctement créé à l'aide de la commande suivante : pvecm status
Le résultat sera comme ceci :

Une fois le Cluster créé il faudra en suite ajouter les autres serveurs Proxmox.
# Sur les deux autres serveurs Proxmox
pvecm add 192.168.60.1 # adresse IP du premier serveur PVE
Lorsque ce sera demandé, entrer le password root du premier serveur et accepter les certificats.
Depuis le deuxième serveur PVE :

Depuis le troisième serveur PVE :

Après les avoir ajoutés au Cluster, les serveur seront visibles depuis leur interface graphique.

Il sera également possible de vérifier le Cluster avec les commandes suivantes :
pvecm nodes

pvecm status

Nous venons créer un Cluster et d'ajouter le second nœud cependant le réseau utilisé ne correspond pas à celui que nous avons configuré et qui sera dédié à Corosync.
Pour utiliser le réseau dédié nous allons devoir faire quelques modifications.
/etc/pve/corosync.confAVANT
nodelist {
node {
name: Nested-Cluster1-Prox9-01
nodeid: 1
quorum_votes: 1
ring0_addr: 192.168.60.1
}
node {
name: Nested-Cluster1-Prox9-02
nodeid: 2
quorum_votes: 1
ring0_addr: 192.168.60.2
}
node {
name: Nested-Cluster1-Prox9-03
nodeid: 3
quorum_votes: 1
ring0_addr: 192.168.60.3
}
}
APRES
nodelist {
node {
name: Nested-Cluster1-Prox9-01
nodeid: 1
quorum_votes: 1
ring0_addr: 192.168.70.1 # <== ICI
}
node {
name: Nested-Cluster1-Prox9-02
nodeid: 2
quorum_votes: 1
ring0_addr: 192.168.70.2 # <== ICI
}
node {
name: Nested-Cluster1-Prox9-03
nodeid: 3
quorum_votes: 1
ring0_addr: 192.168.70.3 # <== ICI
}
}
ATTENTION : Pour que la modification soit prise en compte il faudra redémarrer le service corosync sur chacun des nœuds :
systemctl restart corosync
Nous pouvons vérifier que la modification a bien été prise en compte en utilisant à nouveau la commande pvecm status

Pour simuler une panne je vais éteindre le premier serveur Proxmox du Cluster.
shutdown now
Puis, depuis le second serveur Proxmox, je vais vérifier l'état du Cluster.
pvecm status

Rallumer le premier serveur Proxmox.
Pour tester le réseau et vérifier que tout fonctionne correctement en cas de panne nous allons simuler une coupure réseau vers un nœud.
Depuis le premier serveur Proxmox taper la commande suivante :
ip link set vmbr1 down
Si tout se passe correctement, le Cluster fonctionne toujours.
Cette étape permet d’installer Ceph sur les trois nœuds du cluster Proxmox VE afin de transformer l’infrastructure en plateforme HCI.
Dans une architecture HCI :
Avant l’installation, il est important de comprendre les composants principaux.
| Composant | Rôle |
|---|---|
| MON | Maintient la carte du cluster et le quorum |
| MGR | Fournit les métriques et services d’administration |
| OSD | Stocke physiquement les données |
| Pool | Conteneur logique des données |
| RBD | Disque virtuel utilisé par Proxmox |
ATTENTION : Cette étape est à faire sur les trois serveurs du cluster AVANT de continuer
Depuis le premier serveur PVE :







Depuis le deuxième et troisème serveur PVE :


Par défaut lors de l'installation de Ceph, le processus créé également un "MON" (Monitor).
Nous allons devoir cependant en créer d'autres pour que l'ensemble de nos serveurs possèdent ce rôle.
Pour rappel, les "MON" (Monitors) :
| MON disponibles | État |
|---|---|
| 3/3 | OK |
| 2/3 | OK |
| 1/3 | Perte quorum |
Pour vérifier la présence du premier "MON", cliquer sur le premier serveur PVE puis sur "Monitor". Il sera visible dans la partie de droite, en haut.

Pour créer d'autres "MON"





Il est possible de vérifier les "MON" à l'aide de la commande ceph mon stat.
Comme pour les MON, lors de l'installation de Ceph le processus a installé un "Manager (MGR)".
Dans les versions récentes de Ceph, les "MGR" sont obligatoires et nous allons donc devoir l'installer sur nos serveurs.
Les "MGR" fournissent :
| Nombre | Usage |
|---|---|
| 1 | Minimum |
| 2 | Recommandé |
| 3 | Haute résilience |
Pour vérifier la présence du premier "MGR", cliquer sur le premier serveur PVE puis sur "Monitor". Il sera visible dans la partie de droite, en bas.

Pour créer d'autres "MGR"





Il est possible de vérifier les "MGR" à l'aide de la commande ceph mgr stat.
Les "OSD" (pour Object Storage Device) sont les composants les plus importants du Cluster Ceph puisqu'ils :
Dans une configuration de Cluster Ceph, chacun des disques physiques de nos serveurs est un "OSD".
Lors de la création d'un "OSD", plusieurs paramètres sont possibles :
| Paramètres | Descriptions |
|---|---|
| Disk | Disque principal |
| DB Disk | Métadonnées BlueStore |
| WAL Disk | Journal |
| Encryption | Chiffrement LUKS |
Dans cette documentation, nous feront au plus simple.
Je ne vais pas chiffrer les données et laisser tout par défaut.





Il est possible de vérifier les "OSD" à l'aide de la commande ceph osd tree.

Ainsi que leur état avec la commande ceph osd stat.

| État | Signification |
|---|---|
| up | daemon actif |
| down | daemon arrêté |
| in | participe au cluster |
| out | exclu du cluster |
ATTENTION : Il est tout à fait possible d'ajouter des "OSD" supplémentaires cependant il sera obligatoire d'en ajouter le même nombre sur chacun des serveurs. Si vous ajoutez un "OSD" sur un serveur il faudra donc en faire autant sur les autres serveurs du Cluster.
Après avoir préparé les OSD, nous allons devoir créer un ou plusieurs "Pool" selon les besoins.
Un "Pool" est un espace de stockage logique créé dans Ceph et sert à organiser et répartir les données (disques de machines virtuelles, sauvegardes, objets, etc.).



| Options | Descriptions |
|---|---|
| Name | Nom du pool. Il permet d’identifier l’espace de stockage dans le cluster. |
| Size | Définit le nombre de copies (réplicas) des données dans le cluster Ceph. Une valeur de 3 signifie que chaque donnée est stockée sur trois nœuds différents afin d’assurer la redondance. |
| Min. Size | Nombre minimal de répliques devant être disponibles pour autoriser l’accès aux données. Si ce seuil n’est plus respecté, le pool devient inaccessible afin de protéger l’intégrité des données. |
| Crush Rule | Règle utilisée par l’algorithme CRUSH pour déterminer sur quels nœuds ou disques les données seront réparties. La règle replicated_rule est la configuration standard pour un stockage répliqué. |
| # of PGs | Nombre de Placement Groups utilisés pour répartir les données dans le cluster. Les PG influencent directement l’équilibrage et les performances du stockage. |
| PG Autoscaler Mode | Permet à Ceph d’ajuster automatiquement le nombre de PG en fonction de la taille et de l’utilisation du pool. Le mode on est généralement recommandé. |
| Add as Storage | Ajoute automatiquement le pool comme espace de stockage utilisable dans Proxmox VE après sa création. |
| Target Ratio | Définit la proportion estimée d’utilisation du cluster pour ce pool. Cette valeur aide l’autoscaler à calculer le nombre optimal de PG. |
| Target Size | Taille estimée que le pool devrait atteindre. Cette information est utilisée par l’autoscaler pour optimiser le nombre de PG. |
| Min. # of PGs | Nombre minimal de PG que le pool doit conserver, même si l’autoscaler souhaite réduire cette valeur. |

pveceph install

Cette commande installe tous les paquets Ceph, configure les dépendances, prépare systemd et télécharge la version recommandée.
Elle installera notamment :
Nous pouvons vérifier les paquets avec la commande dpkg -l | grep ceph

et la version avec la commande ceph -v

pveceph init --network IP_CEPH/MASK



pveceph mon create




pveceph mgr create


ATTENTION : Par défaut le premier serveur sera déjà Manager.
Il ne sera donc pas nécessaire de faire cette commande.

lsblk

pveceph osd create /dev/sdb
pveceph osd create /dev/sdc
pveceph osd create /dev/sdd
pveceph osd create /dev/sde


ceph osd pool create Pool-Demo 128

ceph osd pool ls

ceph osd pool set Pool-Demo size 3

rbd pool init Pool-Demo

rbd pool init Pool-Demo

pvesm add rbd Pool-Demo \
--pool Pool-Demo \
--monhost "192.168.90.1 192.168.90.2 192.168.90.3" \
--content images,rootdir


Nous pouvons vérifier l'état de santée du Cluster Ceph avec la commande ceph -s

Nous pouvons également vérifier l'ensemble des composants du Cluster Ceph à l'aide des commandes suivantes.
| Vérification | Commande |
|---|---|
| MON | ceph mon stat |
| MGR | ceph mgr stat |
| OSD | ceph osd tree |
| Pools | ceph osd pool ls |
| Usage | ceph df |
La configuration de notre Cluster Ceph est terminée et nous pouvons à présent l'utiliser pour stocker nos VMs et CT.
Lors de la création d’une VM ou d'un CT il suffira simplement de définir le Pool comme stockage.
Dans mon cas ce sera "Pool-Demo"


systemctl enable pve-ha-lrm
systemctl enable pve-ha-crm
systemctl start pve-ha-lrm
systemctl start pve-ha-crm
systemctl status pve-ha-lrm
systemctl status pve-ha-crm
Les services doivent être actifs sur chacun des PVE

Tous les fichiers du HA sont dans le répertoire /etc/pve/ha/
/etc/pve/ha/resources.cfg/etc/pve/ha/manager_statusha-manager add vm:100

ha-manager status

ha-manager set vm:100 --max_restart 5 --max_relocate 2

CRM (Cluster Resource Manager)
LRM (Local Resource Manager)
Ces composants communiquent via Corosync.