• admin

    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 en apps/v1
    • Utilisation de l’image heketi/heketi:9 au lieu de heketi/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ètre resturl 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 😉