Blog | WeScale

Rook : un stockage Cloud Native distribué

Rédigé par Maxence Maireaux | 28/08/2017

Une solution souvent exploitée consiste à utiliser les services de notre Cloud Provider directement intégré dans notre cluster Kubernetes. Mais comment faire quand on déploie un cluster on-premise ?

Rook est là pour vous permettre de déployer rapidement un système de stockage distribué (Ceph). Si cette solution est la seule que propose Rook aujourd’hui, il est prévu d’en ajouter d’autres, à terme.

Je vous propose maintenant de voir ensemble comment utiliser Rook :

Prérequis

Vous devez installer quelques prérequis pour le bon fonctionnement de Rook sur vos serveurs :

# Debian / Ubuntu
apt-get install ceph-fs-common ceph-common
 
# Redhat / CentOS
yum install ceph
 
# Global
cd /bin
sudo curl -O https://raw.githubusercontent.com/ceph/ceph-docker/master/examples/kubernetes-coreos/rbd
sudo chmod +x /bin/rbd
rbd #Command to download ceph images.

Installation de rook-operator

Le rook-operator s’occupe d’automatiser la gestion du cluster Ceph, et celui-ci implémente pour nous les third party resources (TPR). Ainsi, nous le verrons un peu plus tard, nous pouvons gérer les ressources de rook  via l’appel “apiVersion: rook.io/v1alpha1”.

Rook propose deux modes d'installation, via Helm ou via des fichiers de configuration plus classiques.
Personnellement, je préfère l'installer via Helm, mais vous propose ici les deux solutions.

Installation classique

Kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/rook-operator.yaml

Installation via Helm

helm repo add rook-alpha http://charts.rook.io/alpha
helm install --name rook --namespace rook rook-alpha/rook

Déploiement du cluster Ceph

Une fois le pod rook-operator déployé, nous pouvons demander la création du cluster Ceph. L'ensemble se fait via un fichier de configuration qu'on envoie à Kubernetes :

apiVersion: v1
kind: Namespace
metadata:
  name: rook
---
apiVersion: rook.io/v1alpha1
kind: Cluster
metadata:
  name: rook
  namespace: rook
spec:
  versionTag: 0.5.1
  dataDirHostPath:
  storage:
	useAllNodes: true
	useAllDevices: false
	storeConfig:
  	storeType: filestore
  	databaseSizeMB: 1024
  	journalSizeMB: 1024
kubectl create -f mon-fichier-de-configuration.yaml

Quelques secondes / minutes plus tard, si vous regardez en même temps l’etat de vos pods via un kubectl get pod --all-namespaces, nous pouvons voir les différents services de Rook (api, mon, osd) se déployer.

Activation du service block dans Ceph

Votre cluster Ceph est maintenant opérationnel, cependant votre Kubernetes n'est pas encore configuré pour communiquer avec celui-ci. Pour cela, on lui envoie la configuration suivante :

apiVersion: rook.io/v1alpha1
kind: Pool
metadata:
  name: replicapool
  namespace: rook
spec:
  replication:
    size: 1
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: rook-block
provisioner: rook.io/block
parameters:
  pool: replicapool
kubectl apply -f mon-service-block.yaml

/!\ Si vous souhaitez créer des pods avec un persistent volume en dehors du namespace “default”, vous devez copier le secret qui contient la clée d’accès a rook dans les différents namespaces où vous souhaitez les utiliser.
Ceci devrait être corrigé dans les prochaines versions de Rook.

kubectl get secret rook-rook-user -o json | jq '.metadata.namespace = "kube-system"' | kubectl apply -f -

Interaction avec Rook

Vous pouvez interagir avec Rook soit via son API, soit via le rook-client.
L’installation est elle aussi très simple : Documentation d’installation.

Test

Vous pouvez à présent vérifier le bon fonctionnement de Rook dans votre cluster Kubernetes en lançant cette commande :

kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/mysql.yaml

Celle-ci va vous déployer un serveur MySQL avec un volume persistant dans Rook !

Conclusion

Rook est très facilement installable et vous permet d'utiliser des volumes persistants sans dépendre de votre Cloud Provider.
La solution est encore en Alpha, mais une version stable devrait arriver d'ici la fin de l'année (décembre 2017 dans la roadmap).
Je vous encourage fortement à lire la documentation de Rook, pour comprendre les différentes configurations et possibilités que celui-ci vous offre :)

Documentation de Rook.
Github de Rook.