Migrer Heketi dans Kubernetes
-
On trouve pas mal de tutos en ligne sur “comment déployer Heketi (et gluster) dans un cluster Kubernetes”, mais je n’ai rien trouvé sur la problématique du jour : comment migrer une instance Heketi externe en production dans un cluster Kubernetes.
La problématique de migration
- Un cluster Kubernetes de production
- Un cluster Gluster (3 VM) externe au Kubernetes
- Une instance Heketi (sur une des VM Gluster : gluster01)
Il existe une documentation officielle pour déployer et utiliser Heketi dans Kubernetes. Cette documentation explique qu’il est possible d’utiliser un Gluster externe en précisant :
If you use a pre-existing GlusterFS cluster, please note that any pre-existing volumes will not be detected by heketi, and thus not be under heketi’s management.
Ce qui est plutôt problématique dans notre cas, nous ne pouvons pas perdre la gestion des volumes existants.
La problématique de déploiement
La problématique principale à laquelle répond la documentation officielle, est qu’Heketi a besoin d’un volume Gluster pour stocker sa base de donnée, mais on a besoin d’Heketi pour gérer les volumes Gluster.
Le script de déploiement proposé va répondre à cela, nous allons donc nous appuyer sur cette méthode et décliner les opérations pour ne pas perdre la gestion de nos volumes existants.Migration
Création d’un volume dédié à Heketi
On va commencer par créer un volume Gluster dédié à Heketi
heketidbstorage
. On va utiliser notre instance Heketi actuelle :> export HEKETI_CLI_SERVER="http://gluster01:8080" > export HEKETI_CLI_USER="admin" > export HEKETI_CLI_KEY="xxxxxxxx" > heketi-cli setup-openshift-heketi-storage --listfile=heketi-storage.json
Migration de la BDD
Ce qui est intéressant ici c’est ce que va nous fournir le fichier
heketi-storage.json
:- le contenu de la base de données Heketi (heketi.db) dans un secret
heketi-storage-secret
- des endpoints vers les seveurs Gluster
- un service
heketi-storage-endpoints
pour consommer ces endpoints - un job pour copier le contenu du secret dans le volume Gluster
On va commencer par couper notre ancienne instance d’Heketi :
root@gluster01 > systemctl stop heketi.service
Puis on va appliquer le manifeste fourni par Heketi :
> kubectl apply -n gluster -f heketi-storage.json secret "heketi-storage-secret" created endpoints "heketi-storage-endpoints" created service "heketi-storage-endpoints" created job "heketi-storage-copy-job" created
On vérifie le status du job :
> kubectl get jobs NAME DESIRED SUCCESSFUL AGE heketi-storage-copy-job 1 1 2m
Déploiement des éléments de configuration
Notre base de données Heketi a été migrée, il nous reste à migrer les éléments de configuration, notamment la clef SSH utilisée par Heketi pour communiquer avec les noeuds Gluster :
> scp root@gluster01:/etc/heketi/heketi.json . > scp root@gluster01:/etc/heketi/topology.json . > scp root@gluster01:/etc/heketi/heketi_key .
On modifie la configuration
heketi.json
pour indiquer le chemin de la clef ssh/etc/heketi/private_key
.
On injecte nos 3 fichiers dans un Secret :> kubectl -n gluster create secret generic heketi-config-secret --from-file=private_key=heketi_key --from-file=heketi.json --from-file=topology.json secret "heketi-config-secret" created
Déploiement d’Heketi
Enfin nous pouvons déployer Heketi dans notre cluster en utilisant les manifestes officiels pour créer un compte de service et un déploiement.
Quelques adaptations sur le déploiement sont cependant nécessaires :
- Modifications des api
extensions/v1beta1
enapps/v1
- Utilisation de l’image
heketi/heketi:9
au lieu deheketi/heketi:dev
- Modification de la stratégie de déploiement (une seule instance d’Heketi doit être présente)
spec: strategy: rollingUpdate: maxSurge: 0 maxUnavailable: 1 template: spec: terminationGracePeriodSeconds: 0
On déploie :
> kubectl -n gluster -f heketi-service-account.yaml serviceaccount/heketi-service-account created > kubectl -n gluster -f heketi-deployment.yaml service "heketi-service" created deployment "heketi" created
Test d’Heketi
Maintenant on va s’empresser de tester notre nouvelle instance d’Heketi et s’assurer que nos anciens volumes sont toujours gérés
> kubectl -n gluster port-forward heketi-5464f7fd7d-grqpc 8080:8080 > export HEKETI_CLI_SERVER="http://localhost:8080" > heketi-cli topology info
Ouf on n’a rien perdu !
Modification de la storageClasse
Il faut maintenant modifier la storageClasse
glusterfs-storage
pour utiliser notre nouvelle instance heketi.
On récupère l’IP du service :> kubectl get svc -n gluster -l glusterfs=heketi-service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE heketi ClusterIP 10.96.109.113 <none> 8080/TCP 3d19h
On va donc devoir utiliser l’IP
10.96.109.113
dans le paramètreresturl
de la storageClasse, pour cela il n’y a pas d’autre choix que de supprimer puis recréer la sotrageClasse.Test de création de PV
On s’assure que tout fonctionne en créant un PV :
> cat test-pv.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: gluster-dyn-pvc annotations: volume.beta.kubernetes.io/storage-class: glusterfs-storage spec: accessModes: - ReadWriteMany resources: requests: storage: 3Gi > kubectl apply -f test-pv.yaml peristentvolumeclaim "gluster-dyn-pvc" created > kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-044d5942-1bc6-4d4f-a6fd-1f562eeb9fc8 3Gi RWO Delete Bound default/gluster-dyn-pvc glusterfs-storage 1m > kubectl delete pvc gluster-dyn-pvc peristentvolumeclaim "gluster-dyn-pvc" deleted
Conclusion
Voilà, notre instance Heketi est migrée dans le cluster Kubernetes, la prochaine étape est de migrer notre cluster Gluster, mais ça ça sera dans un autre billet