BinBashFR
    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    Migrer Heketi dans Kubernetes

    Technos
    kubernetes heketi gluster
    1
    1
    62
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • G
      gaetan admin last edited by gaetan

      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 😉

      1 Reply Last reply Reply Quote 1
      • First post
        Last post