L’installation de Ceph dans un cluster Kubernetes peut être automatisé par l’utilisation de Rook. Actuellement en stage chez Adaltas, j’étais en charge de participer à la configuration d’un cluster Kubernetes (k8s). Pour éviter de casser quelque chose sur notre cluster production, nous avons décidé de faire nos expérimentations via l’installation d’un cluster k8s sur 3 machines virtuelles (un nœud maître n1, deux nœuds esclaves n2 et n3) en utilisant Vagrant avec VirtualBox sur le backend et Ubuntu 18.10 en tant qu’OS.

Lors de l’installation du cluster de test, nous avons rencontré un problème avec Rook en utilisant Ceph qui l’empêche d’approvisionner les Persistent Volume Claim (PVC). Cet article détaille comment effectuer une installation de base de Rook avec Ceph sur les machines virtuelles, le problème rencontré et comment le résoudre. Mais d’abord …

… un rappel rapide à propos du rôle des PVCs!

Lorsqu’un pod doit stocker diverses données (journaux ou métriques, par exemple) de manière persitante, elle doit décrire le type de stockage dont elle a besoin (taille, performance, …) dans un PVC. Le cluster fournira ensuite un Persistent Volume (PV) s’il correspond aux exigences du PVC. Le PV peut : soit être approvisionné statiquement si un administrateur a créé manuellement un PV correspondant, soit être approvisionné dynamiquement. La création manuelle de PVs peut être fastidieuses si beaucoup d’entre eux sont nécessaires aux pods, c’est pourquoi il est intéressant pour le cluster de pouvoir les approvisionner dynamiquement. Pour rendre le cluster capable de fournir de manière dynamique un PV, le PVC doit indiquer la Storage Class qu’il veut utiliser. Si une telle Storage Class est disponible sur le cluster, un PV sera fourni dynamiquement au pod.

Voici quelques liens que vous pouvez suivre si vous voulez en savoir à propos des PVCs, PVs et Storage Classes:

Installer Rook sur votre cluster k8s

L’installation d’un cluster k8s n’entrant pas dans le cadre de cet article, je vais supposer que vous avez déjà un cluster k8s opérationnel. Si ce n’est pas le cas, vous pouvez facilement trouver de la documentation sur internet afin de bootstraper rapidement un cluster k8s.

clonez le repo git de Rook :

Puis passez au dernier tag de version (qui est v1.0.1 au moment de l’écriture de cet article) en utilisant :

Les fichiers d’intérêts (qui sont listés ci-dessous) se trouve dans le dossier cluster/examples/kubernetes/ceph.

  1. common.yaml

  2. operator.yaml

  3. cluster.yaml

  4. storageclass.yaml

Appliquer chacuns d’entres eux dans l’ordre dans lequel ils sont listés avec :

La dernière étape est de définir la resources storageclass, inscrite dans le fichier storageclass.yaml que nous venons d’appliquer, comme storageclass par défaut dans notre cluster. Pour ce faire, exécutez la commande suivante :

Le problème

Le cluster Rook prendra un certain temps à se déployer, le temps de télécharger les images nécessaires et de déployer les pods. Après quelques minutes, la sortie de kubectl get pods -n rook-ceph devrait ressembler à celle-ci :

Comme nous pouvons le voir ici, il existe deux modules appelés rook-ceph-osd-prepare... pour lesquels le statut est “Terminé”. Nous nous attendions à voir apparaitre des pods OSD (Object Storage Device) une fois le statut des modules rook-ceph-osd-prepare ... terminés mais ce n’est pas le cas ici. Les pods OSD n’apparaissant pas, ce qui signifie que les futures PVC ne seront pas approvisionnés par Rook et resteront en attente. Nous pouvons voir un exemple de ce problème lorsque nous essayons de déployer une instance Gitlab avec Helm. Voici le résultat de kubectl get pvc -n gitlab:

Nous pouvons voir qu’aucun PVC n’est approvisionné quand bien même ils ont été assigné la bonne Storage Class.

La solution

Après quelques recherches, nous avons découvert qu’en fait, pour que Rook fonctionne, nous avons besoin d’avoir un périphérique de stockage dédié qu’il peut utiliser pour stocker les PVs. Pour résoudre ce problème, nous avions besoin dans notre cas d’ajouter un nouveau disque virtuel à nos machines virtuelles via le fichier VagrantFile.

Pour créer et attacher un nouveau disque virtuel à une machine virtuelle VirtualBox, nous devons utiliser la commande vboxmanage, ou nous pouvons plus facilement le définir directement dans le VagrantFile, comme dans cet extrait :

Si nous lançons une nouvelle fois l’installation dans son ensenble, nous pouvons voir que les pods OSD apparaissent :

Et si nous vérifions le PVC créé par l’installation faite par Helm de Gitlab :

Les PVCs sont enfin approvisionné!

Un peu plus loin, customiser cluster.yaml

Vous avez peut-être remarqué que nous n’avons donné aucune information à Rook sur la façon de procéder afin de trouver un périphérique approprié à utiliser pour le stockage; il le détecte juste de manière autonome celui que nous avons attaché à la machine virtuelle et l’a utilisé. Pour beaucoup de raisons évidentes, ce n’est certainement pas un comportement souhaité étant donné que dans contexte réel, nous pourrions avoir nombreux dispositifs connectés ayant un but différent de celui de simplement fournir du stockage à Rook. Il est bien sûr possible de personnaliser la façon dont il trouve et utilise le stockage. Tout est défini dans le manifeste cluster.yaml. Les catégorie associé du manifeste est storage. Voici la configuration par défaut :

Le champ useAllDevices a la valeur true. Depuis la documentation officielle de Rook : il indique “si tous les périphériques trouvés sur les nœuds du cluster doivent être automatiquement consommé par OSDs”. La solution consiste à indiquer à Rook où regarder au lieu de sélectionner automatiquement tout périphérique disponible. Si nous mettons useAllDevices à false, nous pouvons utiliser les champs suivants:

  1. deviceFilter pour définir un filtre regex; par exemple ^sd[a-d] pour trouver un disque commençant par “sd” puis suivis par a, b, c ou d,

  2. devices pour définir une liste de disques individuel qui pourront être utilisés,

  3. directories pour définir une liste de répertoires qui seront utilisés comme espace de stockage pour le cluster.

Il est aussi possible de définir une configuration par node en réglant useAllNodes à false, mais cela sort du cadre de cet article. Si vous voulez en apprendre plus à propos de la configuration du stockage pour Rook, vous pouvez jeter un œil à la documention.

The end

Merci d’avoir lu cet article, j’espère qu’il vous aura apporté un peu de lumière si vous étiez confronté au même problème !