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 :
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.
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.
Kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/rook-operator.yaml
helm repo add rook-alpha http://charts.rook.io/alpha
helm install --name rook --namespace rook rook-alpha/rook
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.
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 -
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.
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 !
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.